$treeview $search $mathjax
Palabos  Version 1.1
$projectbrief
$projectbrief
$searchbox

reductiveDataProcessingFunctional3D.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 REDUCTIVE_DATA_PROCESSING_FUNCTIONAL_3D_H
00029 #define REDUCTIVE_DATA_PROCESSING_FUNCTIONAL_3D_H
00030 
00031 #include "core/globalDefs.h"
00032 #include "core/geometry3D.h"
00033 #include "core/blockSurface3D.h"
00034 #include "atomicBlock/dataProcessor3D.h"
00035 #include <vector>
00036 
00037 namespace plb {
00038 
00039 // Forward declarations.
00040 
00041 template<typename T, template<typename U> class Descriptor> class BlockLatticeBase3D;
00042 template<typename T, template<typename U> class Descriptor> class BlockLattice3D;
00043 template<typename T> class ScalarFieldBase3D;
00044 template<typename T> class ScalarField3D;
00045 template<typename T, int nDim> class TensorFieldBase3D;
00046 template<typename T, int nDim> class TensorField3D;
00047 template<typename T> class NTensorFieldBase3D;
00048 template<typename T> class NTensorField3D;
00049 
00050 
00051 /* *************** All flavors of Box processing functionals ********* */
00052 
00054 struct ReductiveBoxProcessingFunctional3D {
00055     virtual ~ReductiveBoxProcessingFunctional3D() { }
00056     virtual void processGenericBlocks(Box3D domain,
00057                                       std::vector<AtomicBlock3D*> atomicBlocks) =0;
00058     virtual BlockDomain::DomainT appliesTo() const;
00059     virtual void rescale(double dxScale, double dtScale);
00060     virtual void getDimensionsX(std::vector<int>& dimensions) const;
00061     virtual void getDimensionsT(std::vector<int>& dimensions) const;
00063     virtual void getModificationPattern(std::vector<bool>& isWritten) const;
00064     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const =0;
00065     virtual ReductiveBoxProcessingFunctional3D* clone() const =0;
00066     virtual BlockStatistics const& getStatistics() const =0;
00067     virtual BlockStatistics& getStatistics() =0;
00068     virtual void serialize(std::string& data) const;
00069     virtual void unserialize(std::string& data);
00070     virtual int getStaticId() const;
00071 };
00072 
00074 class PlainReductiveBoxProcessingFunctional3D : public ReductiveBoxProcessingFunctional3D {
00075 public:
00076     virtual BlockStatistics const& getStatistics() const;
00077     virtual BlockStatistics& getStatistics();
00078 private:
00079     BlockStatistics statistics;
00080 };
00081 
00083 class ReductiveBoxProcessor3D : public DataProcessor3D {
00084 public:
00088     ReductiveBoxProcessor3D(ReductiveBoxProcessingFunctional3D* functional_,
00089                             Box3D domain_, std::vector<AtomicBlock3D*> atomicBlocks_);
00090     Box3D getDomain() const;
00091     virtual void process();
00092     virtual ReductiveBoxProcessor3D* clone() const;
00093     virtual int getStaticId() const;
00094 private:
00095     ReductiveBoxProcessingFunctional3D* functional;
00096     Box3D domain;
00097     std::vector<AtomicBlock3D*> atomicBlocks;
00098 };
00099 
00101 class ReductiveBoxProcessorGenerator3D : public BoxedReductiveDataProcessorGenerator3D {
00102 public:
00106     ReductiveBoxProcessorGenerator3D(ReductiveBoxProcessingFunctional3D* functional_, Box3D domain);
00107     ~ReductiveBoxProcessorGenerator3D();
00108     ReductiveBoxProcessorGenerator3D(ReductiveBoxProcessorGenerator3D const& rhs);
00109     ReductiveBoxProcessorGenerator3D& operator=(ReductiveBoxProcessorGenerator3D const& rhs);
00110     virtual BlockDomain::DomainT appliesTo() const;
00111     virtual void rescale(double dxScale, double dtScale);
00112     virtual void getDimensionsX(std::vector<int>& dimensions) const;
00113     virtual void getDimensionsT(std::vector<int>& dimensions) const;
00114     virtual void getModificationPattern(std::vector<bool>& isWritten) const;
00115     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00116     virtual DataProcessor3D* generate(std::vector<AtomicBlock3D*> atomicBlocks);
00117     virtual ReductiveBoxProcessorGenerator3D* clone() const;
00118     virtual BlockStatistics const& getStatistics() const;
00119     virtual BlockStatistics& getStatistics();
00120     ReductiveBoxProcessingFunctional3D const& getFunctional() const;
00121     virtual void serialize(Box3D& domain, std::string& data) const;
00122     virtual int getStaticId() const;
00123 private:
00124     ReductiveBoxProcessingFunctional3D* functional;
00125 };
00126 
00128 template<typename T, template<typename U> class Descriptor>
00129 struct ReductiveBoxProcessingFunctional3D_L : public PlainReductiveBoxProcessingFunctional3D {
00130     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice) =0;
00132     virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00133 };
00134 
00136 template<typename T>
00137 struct ReductiveBoxProcessingFunctional3D_S : public PlainReductiveBoxProcessingFunctional3D {
00138     virtual void process(Box3D domain, ScalarField3D<T>& field) =0;
00140     virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00141 };
00142 
00144 template<typename T, int nDim>
00145 struct ReductiveBoxProcessingFunctional3D_T : public PlainReductiveBoxProcessingFunctional3D {
00146     virtual void process(Box3D domain, TensorField3D<T,nDim>& field) =0;
00148     virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00149 };
00150 
00152 template<typename T>
00153 struct ReductiveBoxProcessingFunctional3D_N : public PlainReductiveBoxProcessingFunctional3D {
00154     virtual void process(Box3D domain, NTensorField3D<T>& field) =0;
00156     virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00157 };
00158 
00160 template<typename T>
00161 struct MaskedReductiveBoxProcessingFunctional3D_N : public PlainReductiveBoxProcessingFunctional3D {
00162     virtual void process(Box3D domain,
00163                          NTensorField3D<T>& field,
00164                          NTensorField3D<int>& mask) =0;
00166     virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00167 };
00168 
00170 template<typename T1, template<typename U1> class Descriptor1,
00171          typename T2, template<typename U2> class Descriptor2>
00172 struct ReductiveBoxProcessingFunctional3D_LL : public PlainReductiveBoxProcessingFunctional3D {
00173     virtual void process(Box3D domain, BlockLattice3D<T1,Descriptor1>& lattice1,
00174                                        BlockLattice3D<T2,Descriptor2>& lattice2) =0;
00176     virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00177 };
00178 
00180 template<typename T1, typename T2>
00181 struct ReductiveBoxProcessingFunctional3D_SS : public PlainReductiveBoxProcessingFunctional3D {
00182     virtual void process(Box3D domain, ScalarField3D<T1>& field1,
00183                                        ScalarField3D<T2>& field2) =0;
00185     virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00186 };
00187 
00189 template<typename T1, int nDim1,
00190          typename T2, int nDim2>
00191 struct ReductiveBoxProcessingFunctional3D_TT : public PlainReductiveBoxProcessingFunctional3D {
00192     virtual void process(Box3D domain, TensorField3D<T1,nDim1>& field1,
00193                                        TensorField3D<T2,nDim2>& field2) =0;
00195     virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00196 };
00197 
00199 template<typename T1, typename T2, int nDim>
00200 struct ReductiveBoxProcessingFunctional3D_ST : public PlainReductiveBoxProcessingFunctional3D {
00201     virtual void process(Box3D domain, ScalarField3D<T1>& field1,
00202                                        TensorField3D<T2,nDim>& field2) =0;
00204     virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00205 };
00206 
00208 template<typename T1, typename T2>
00209 struct ReductiveBoxProcessingFunctional3D_NN : public PlainReductiveBoxProcessingFunctional3D {
00210     virtual void process(Box3D domain, NTensorField3D<T1>& field1,
00211                                        NTensorField3D<T2>& field2) =0;
00213     virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00214 };
00215 
00217 template<typename T1, typename T2>
00218 struct MaskedReductiveBoxProcessingFunctional3D_NN : public PlainReductiveBoxProcessingFunctional3D {
00219     virtual void process(Box3D domain, NTensorField3D<T1>& field1,
00220                                        NTensorField3D<T2>& field2,
00221                                        NTensorField3D<int>& mask) =0;
00223     virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00224 };
00225 
00227 template<typename T1, typename T2>
00228 struct ReductiveBoxProcessingFunctional3D_SN : public PlainReductiveBoxProcessingFunctional3D {
00229     virtual void process(Box3D domain, ScalarField3D<T1>& field1,
00230                                        NTensorField3D<T2>& field2) =0;
00232     virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00233 };
00234 
00236 template<typename T1, template<typename U> class Descriptor, typename T2>
00237 struct ReductiveBoxProcessingFunctional3D_LS : public PlainReductiveBoxProcessingFunctional3D {
00238     virtual void process(Box3D domain, BlockLattice3D<T1,Descriptor>& lattice,
00239                                        ScalarField3D<T2>& field) =0;
00241     virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00242 };
00243 
00245 template<typename T1, template<typename U> class Descriptor,
00246          typename T2, int nDim>
00247 struct ReductiveBoxProcessingFunctional3D_LT : public PlainReductiveBoxProcessingFunctional3D {
00248     virtual void process(Box3D domain, BlockLattice3D<T1,Descriptor>& lattice,
00249                                        TensorField3D<T2,nDim>& field) =0;
00251     virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00252 };
00253 
00255 template<typename T1, template<typename U> class Descriptor, typename T2>
00256 struct ReductiveBoxProcessingFunctional3D_LN : public PlainReductiveBoxProcessingFunctional3D {
00257     virtual void process(Box3D domain, BlockLattice3D<T1,Descriptor>& lattice,
00258                                        NTensorField3D<T2>& field) =0;
00260     virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00261 };
00262 
00264 template<typename T1, template<typename U> class Descriptor, typename T2>
00265 struct MaskedReductiveBoxProcessingFunctional3D_LN : public PlainReductiveBoxProcessingFunctional3D {
00266     virtual void process(Box3D domain, BlockLattice3D<T1,Descriptor>& lattice,
00267                                        NTensorField3D<T2>& field,
00268                                        NTensorField3D<int>& mask) =0;
00270     virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00271 };
00272 
00274 template<typename T, template<typename U> class Descriptor>
00275 struct ReductiveLatticeBoxProcessingFunctional3D : public PlainReductiveBoxProcessingFunctional3D {
00276     virtual void process(Box3D domain, std::vector<BlockLattice3D<T,Descriptor>*> lattices) =0;
00278     virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00279 };
00280 
00282 template<typename T>
00283 struct ReductiveScalarFieldBoxProcessingFunctional3D : public PlainReductiveBoxProcessingFunctional3D {
00284     virtual void process(Box3D domain, std::vector<ScalarField3D<T>*> scalarFields) =0;
00286     virtual void processGenericBlocks( Box3D domain,
00287                                        std::vector<AtomicBlock3D*> atomicBlocks );
00288 };
00289 
00291 template<typename T, int nDim>
00292 struct ReductiveTensorFieldBoxProcessingFunctional3D : public PlainReductiveBoxProcessingFunctional3D {
00293     virtual void process(Box3D domain, std::vector<TensorField3D<T,nDim>*> tensorFields) =0;
00295     virtual void processGenericBlocks( Box3D domain,
00296                                        std::vector<AtomicBlock3D*> atomicBlocks );
00297 };
00298 
00300 template<typename T>
00301 struct ReductiveNTensorFieldBoxProcessingFunctional3D : public PlainReductiveBoxProcessingFunctional3D {
00302     virtual void process(Box3D domain, std::vector<NTensorField3D<T>*> tensorFields) =0;
00304     virtual void processGenericBlocks( Box3D domain,
00305                                        std::vector<AtomicBlock3D*> atomicBlocks );
00306 };
00307 
00308 
00309 /* *************** All flavors of Dot processing functionals ********* */
00310 
00312 class ReductiveDotProcessingFunctional3D {
00313 public:
00314     virtual ~ReductiveDotProcessingFunctional3D() { }
00315     virtual void processGenericBlocks(DotList3D const& dotList, std::vector<AtomicBlock3D*> atomicBlocks) =0;
00316     virtual BlockDomain::DomainT appliesTo() const;
00317     virtual void rescale(double dxScale, double dtScale);
00318     virtual void getDimensionsX(std::vector<int>& dimensions) const;
00319     virtual void getDimensionsT(std::vector<int>& dimensions) const;
00320     virtual void getModificationPattern(std::vector<bool>& isWritten) const;
00321     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const =0;
00322     virtual ReductiveDotProcessingFunctional3D* clone() const =0;
00323     virtual BlockStatistics const& getStatistics() const =0;
00324     virtual BlockStatistics& getStatistics() =0;
00325 };
00326 
00328 class PlainReductiveDotProcessingFunctional3D : public ReductiveDotProcessingFunctional3D {
00329 public:
00330     virtual BlockStatistics const& getStatistics() const;
00331     virtual BlockStatistics& getStatistics();
00332 private:
00333     BlockStatistics statistics;
00334 };
00335 
00336 
00338 class ReductiveDotProcessor3D : public DataProcessor3D {
00339 public:
00343     ReductiveDotProcessor3D(ReductiveDotProcessingFunctional3D* functional_,
00344                             DotList3D const& dotList_, std::vector<AtomicBlock3D*> atomicBlocks_);
00345     DotList3D const& getDotList() const;
00346     virtual void process();
00347     virtual ReductiveDotProcessor3D* clone() const;
00348 private:
00349     ReductiveDotProcessingFunctional3D* functional;
00350     DotList3D dotList;
00351     std::vector<AtomicBlock3D*> atomicBlocks;
00352 };
00353 
00355 class ReductiveDotProcessorGenerator3D : public DottedReductiveDataProcessorGenerator3D {
00356 public:
00357     ReductiveDotProcessorGenerator3D(ReductiveDotProcessingFunctional3D* functional_, DotList3D const& dotList);
00358     ~ReductiveDotProcessorGenerator3D();
00359     ReductiveDotProcessorGenerator3D(ReductiveDotProcessorGenerator3D const& rhs);
00360     ReductiveDotProcessorGenerator3D& operator=(ReductiveDotProcessorGenerator3D const& rhs);
00361     virtual BlockDomain::DomainT appliesTo() const;
00362     virtual void rescale(double dxScale, double dtScale);
00363     virtual void getDimensionsX(std::vector<int>& dimensions) const;
00364     virtual void getDimensionsT(std::vector<int>& dimensions) const;
00365     virtual void getModificationPattern(std::vector<bool>& isWritten) const;
00366     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00367     virtual DataProcessor3D* generate(std::vector<AtomicBlock3D*> atomicBlocks);
00368     virtual ReductiveDotProcessorGenerator3D* clone() const;
00369     virtual BlockStatistics const& getStatistics() const;
00370     virtual BlockStatistics& getStatistics();
00371     ReductiveDotProcessingFunctional3D const& getFunctional() const;
00372 private:
00373     ReductiveDotProcessingFunctional3D* functional;
00374 };
00375 
00377 template<typename T, template<typename U> class Descriptor>
00378 struct ReductiveDotProcessingFunctional3D_L : public PlainReductiveDotProcessingFunctional3D {
00379     virtual void process(DotList3D const& dotList, BlockLattice3D<T,Descriptor>& lattice) =0;
00381     virtual void processGenericBlocks(DotList3D const& dotList, std::vector<AtomicBlock3D*> atomicBlocks);
00382 };
00383 
00385 template<typename T>
00386 struct ReductiveDotProcessingFunctional3D_S : public PlainReductiveDotProcessingFunctional3D {
00387     virtual void process(DotList3D const& dotList, ScalarField3D<T>& field) =0;
00389     virtual void processGenericBlocks( DotList3D const& dotList,
00390                                        std::vector<AtomicBlock3D*> atomicBlocks );
00391 };
00392 
00394 template<typename T, int nDim>
00395 struct ReductiveDotProcessingFunctional3D_T : public PlainReductiveDotProcessingFunctional3D {
00396     virtual void process(DotList3D const& dotList, TensorField3D<T,nDim>& field) =0;
00398     virtual void processGenericBlocks( DotList3D const& dotList,
00399                                        std::vector<AtomicBlock3D*> atomicBlocks );
00400 };
00401 
00403 template<typename T>
00404 struct ReductiveDotProcessingFunctional3D_N : public PlainReductiveDotProcessingFunctional3D {
00405     virtual void process(DotList3D const& dotList, NTensorField3D<T>& field) =0;
00407     virtual void processGenericBlocks( DotList3D const& dotList,
00408                                        std::vector<AtomicBlock3D*> atomicBlocks );
00409 };
00410 
00412 template<typename T1, template<typename U1> class Descriptor1,
00413          typename T2, template<typename U2> class Descriptor2>
00414 struct ReductiveDotProcessingFunctional3D_LL : public PlainReductiveDotProcessingFunctional3D {
00415     virtual void process(DotList3D const& dotList,
00416                          BlockLattice3D<T1,Descriptor1>& lattice1,
00417                          BlockLattice3D<T2,Descriptor2>& lattice2) =0;
00419     virtual void processGenericBlocks( DotList3D const& dotList,
00420                                        std::vector<AtomicBlock3D*> atomicBlocks );
00421 };
00422 
00424 template<typename T1, typename T2>
00425 struct ReductiveDotProcessingFunctional3D_SS : public PlainReductiveDotProcessingFunctional3D {
00426     virtual void process(DotList3D const& dotList, ScalarField3D<T1>& field1,
00427                                                    ScalarField3D<T2>& field2) =0;
00429     virtual void processGenericBlocks( DotList3D const& dotList,
00430                                        std::vector<AtomicBlock3D*> atomicBlocks );
00431 };
00432 
00434 template<typename T1, int nDim1, typename T2, int nDim2>
00435 struct ReductiveDotProcessingFunctional3D_TT : public PlainReductiveDotProcessingFunctional3D {
00436     virtual void process(DotList3D const& dotList,
00437                          TensorField3D<T1,nDim1>& field1,
00438                          TensorField3D<T2,nDim2>& field2) =0;
00440     virtual void processGenericBlocks( DotList3D const& dotList,
00441                                        std::vector<AtomicBlock3D*> atomicBlocks );
00442 };
00443 
00445 template<typename T1, typename T2, int nDim>
00446 struct ReductiveDotProcessingFunctional3D_ST : public PlainReductiveDotProcessingFunctional3D {
00447     virtual void process(DotList3D const& dotList,
00448                          ScalarField3D<T1>& field1,
00449                          TensorField3D<T2,nDim>& field2) =0;
00451     virtual void processGenericBlocks( DotList3D const& dotList,
00452                                        std::vector<AtomicBlock3D*> atomicBlocks );
00453 };
00454 
00456 template<typename T1, typename T2>
00457 struct ReductiveDotProcessingFunctional3D_NN : public PlainReductiveDotProcessingFunctional3D {
00458     virtual void process(DotList3D const& dotList,
00459                          NTensorField3D<T1>& field1,
00460                          NTensorField3D<T2>& field2) =0;
00462     virtual void processGenericBlocks( DotList3D const& dotList,
00463                                        std::vector<AtomicBlock3D*> atomicBlocks );
00464 };
00465 
00467 template<typename T1, typename T2>
00468 struct ReductiveDotProcessingFunctional3D_SN : public PlainReductiveDotProcessingFunctional3D {
00469     virtual void process(DotList3D const& dotList,
00470                          ScalarField3D<T1>& field1,
00471                          NTensorField3D<T2>& field2) =0;
00473     virtual void processGenericBlocks( DotList3D const& dotList,
00474                                        std::vector<AtomicBlock3D*> atomicBlocks );
00475 };
00476 
00478 template<typename T1, template<typename U> class Descriptor, typename T2>
00479 struct ReductiveDotProcessingFunctional3D_LS : public PlainReductiveDotProcessingFunctional3D {
00480     virtual void process(DotList3D const& dotList,
00481                          BlockLattice3D<T1,Descriptor>& lattice,
00482                          ScalarField3D<T2>& field) =0;
00484     virtual void processGenericBlocks( DotList3D const& dotList,
00485                                        std::vector<AtomicBlock3D*> atomicBlocks );
00486 };
00487 
00489 template<typename T1, template<typename U> class Descriptor,
00490          typename T2, int nDim>
00491 struct ReductiveDotProcessingFunctional3D_LT : public PlainReductiveDotProcessingFunctional3D {
00492     virtual void process(DotList3D const& dotList,
00493                          BlockLattice3D<T1,Descriptor>& lattice,
00494                          TensorField3D<T2,nDim>& field) =0;
00496     virtual void processGenericBlocks( DotList3D const& dotList,
00497                                        std::vector<AtomicBlock3D*> atomicBlocks );
00498 };
00499 
00501 template<typename T1, template<typename U> class Descriptor, typename T2>
00502 struct ReductiveDotProcessingFunctional3D_LN : public PlainReductiveDotProcessingFunctional3D {
00503     virtual void process(DotList3D const& dotList,
00504                          BlockLattice3D<T1,Descriptor>& lattice,
00505                          NTensorField3D<T2>& field) =0;
00507     virtual void processGenericBlocks( DotList3D const& dotList,
00508                                        std::vector<AtomicBlock3D*> atomicBlocks );
00509 };
00510 
00512 template<typename T, template<typename U> class Descriptor>
00513 struct ReductiveLatticeDotProcessingFunctional3D : public PlainReductiveDotProcessingFunctional3D {
00514     virtual void process(DotList3D const& dotList, std::vector<BlockLattice3D<T,Descriptor>*> lattices) =0;
00516     virtual void processGenericBlocks( DotList3D const& dotList,
00517                                        std::vector<AtomicBlock3D*> atomicBlocks );
00518 };
00519 
00521 template<typename T>
00522 struct ReductiveScalarFieldDotProcessingFunctional3D : public PlainReductiveDotProcessingFunctional3D {
00523     virtual void process(DotList3D const& dotList, std::vector<ScalarField3D<T>*> scalarFields) =0;
00525     virtual void processGenericBlocks( DotList3D const& dotList,
00526                                        std::vector<AtomicBlock3D*> atomicBlocks );
00527 };
00528 
00530 template<typename T, int nDim>
00531 struct ReductiveTensorFieldDotProcessingFunctional3D : public PlainReductiveDotProcessingFunctional3D {
00532     virtual void process(DotList3D const& dotList, std::vector<TensorField3D<T,nDim>*> tensorFields) =0;
00534     virtual void processGenericBlocks( DotList3D const& dotList,
00535                                        std::vector<AtomicBlock3D*> atomicBlocks );
00536 };
00537 
00539 template<typename T>
00540 struct ReductiveNTensorFieldDotProcessingFunctional3D : public PlainReductiveDotProcessingFunctional3D {
00541     virtual void process(DotList3D const& dotList, std::vector<NTensorField3D<T>*> tensorFields) =0;
00543     virtual void processGenericBlocks( DotList3D const& dotList,
00544                                        std::vector<AtomicBlock3D*> atomicBlocks );
00545 };
00546 
00547 
00548 /* *************** All flavors of Bounded Box processing functionals ********* */
00549 
00551 class BoundedReductiveBoxProcessingFunctional3D {
00552 public:
00553     virtual ~BoundedReductiveBoxProcessingFunctional3D() { }
00554     virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks) =0;
00555     virtual void processPlaneGeneric( int direction, int orientation, Box3D domain,
00556                                       std::vector<AtomicBlock3D*> atomicBlocks ) =0;
00557     virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain,
00558                                      std::vector<AtomicBlock3D*> atomicBlocks ) =0;
00559     virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain,
00560                                        std::vector<AtomicBlock3D*> atomicBlocks ) =0;
00561     virtual BlockDomain::DomainT appliesTo() const;
00562     virtual void rescale(double dxScale, double dtScale);
00563     virtual void getDimensionsX(std::vector<int>& dimensions) const;
00564     virtual void getDimensionsT(std::vector<int>& dimensions) const;
00565     virtual void getModificationPattern(std::vector<bool>& isWritten) const;
00566     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const =0;
00567     virtual BoundedReductiveBoxProcessingFunctional3D* clone() const =0;
00568     ReductiveBoxProcessingFunctional3D* getBulkProcessor() const; 
00569     ReductiveBoxProcessingFunctional3D* getPlaneProcessor(int direction, int orientation) const; 
00570     ReductiveBoxProcessingFunctional3D* getEdgeProcessor(int plane, int normal1, int normal2) const; 
00571     ReductiveBoxProcessingFunctional3D* getCornerProcessor(int normalX, int normalY, int normalZ) const; 
00572     BlockStatistics const& getStatistics() const;
00573     BlockStatistics& getStatistics();
00574     void getGenerators (
00575             Box3D const& fullDomain, plint boundaryWidth_,
00576             std::vector<ReductiveBoxProcessorGenerator3D*>& generators );
00577 private:
00578     BlockStatistics statistics;
00579 public:
00580     class BulkWrapperFunctional : public ReductiveBoxProcessingFunctional3D {
00581     public:
00582         BulkWrapperFunctional(BoundedReductiveBoxProcessingFunctional3D* boundedFunctional_);
00583         BulkWrapperFunctional(BulkWrapperFunctional const& rhs);
00584         ~BulkWrapperFunctional();
00585         BulkWrapperFunctional& operator=(BulkWrapperFunctional const& rhs);
00586         virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00587         virtual BlockDomain::DomainT appliesTo() const;
00588         virtual void rescale(double dxScale, double dtScale);
00589         virtual void getDimensionsX(std::vector<int>& dimensions) const;
00590         virtual void getDimensionsT(std::vector<int>& dimensions) const;
00591         virtual void getModificationPattern(std::vector<bool>& isWritten) const;
00592         virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00593         virtual BulkWrapperFunctional* clone() const;
00594         virtual BlockStatistics const& getStatistics() const;
00595         virtual BlockStatistics& getStatistics();
00596     private:
00597         BoundedReductiveBoxProcessingFunctional3D* boundedFunctional;
00598     };
00599     class PlaneWrapperFunctional : public ReductiveBoxProcessingFunctional3D {
00600     public:
00601         PlaneWrapperFunctional(BoundedReductiveBoxProcessingFunctional3D* boundedFunctional_,
00602                                int direction_, int orientation_);
00603         PlaneWrapperFunctional(PlaneWrapperFunctional const& rhs);
00604         ~PlaneWrapperFunctional();
00605         PlaneWrapperFunctional& operator=(PlaneWrapperFunctional const& rhs);
00606         virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00607         virtual BlockDomain::DomainT appliesTo() const;
00608         virtual void rescale(double dxScale, double dtScale);
00609         virtual void getDimensionsX(std::vector<int>& dimensions) const;
00610         virtual void getDimensionsT(std::vector<int>& dimensions) const;
00611         virtual void getModificationPattern(std::vector<bool>& isWritten) const;
00612         virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00613         virtual PlaneWrapperFunctional* clone() const;
00614         virtual BlockStatistics const& getStatistics() const;
00615         virtual BlockStatistics& getStatistics();
00616     private:
00617         BoundedReductiveBoxProcessingFunctional3D* boundedFunctional;
00618         int direction, orientation;
00619     };
00620     class EdgeWrapperFunctional : public ReductiveBoxProcessingFunctional3D {
00621     public:
00622         EdgeWrapperFunctional(BoundedReductiveBoxProcessingFunctional3D* boundedFunctional_,
00623                               int plane_, int normal1_, int normal2_);
00624         EdgeWrapperFunctional(EdgeWrapperFunctional const& rhs);
00625         ~EdgeWrapperFunctional();
00626         EdgeWrapperFunctional& operator=(EdgeWrapperFunctional const& rhs);
00627         virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00628         virtual BlockDomain::DomainT appliesTo() const;
00629         virtual void rescale(double dxScale, double dtScale);
00630         virtual void getDimensionsX(std::vector<int>& dimensions) const;
00631         virtual void getDimensionsT(std::vector<int>& dimensions) const;
00632         virtual void getModificationPattern(std::vector<bool>& isWritten) const;
00633         virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00634         virtual EdgeWrapperFunctional* clone() const;
00635         virtual BlockStatistics const& getStatistics() const;
00636         virtual BlockStatistics& getStatistics();
00637     private:
00638         BoundedReductiveBoxProcessingFunctional3D* boundedFunctional;
00639         int plane, normal1, normal2;
00640     };
00641     class CornerWrapperFunctional : public ReductiveBoxProcessingFunctional3D {
00642     public:
00643         CornerWrapperFunctional(BoundedReductiveBoxProcessingFunctional3D* boundedFunctional_,
00644                                 int normalX_, int normalY_, int normalZ_);
00645         CornerWrapperFunctional(CornerWrapperFunctional const& rhs);
00646         ~CornerWrapperFunctional();
00647         CornerWrapperFunctional& operator=(CornerWrapperFunctional const& rhs);
00648         virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00649         virtual BlockDomain::DomainT appliesTo() const;
00650         virtual void rescale(double dxScale, double dtScale);
00651         virtual void getDimensionsX(std::vector<int>& dimensions) const;
00652         virtual void getDimensionsT(std::vector<int>& dimensions) const;
00653         virtual void getModificationPattern(std::vector<bool>& isWritten) const;
00654         virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00655         virtual CornerWrapperFunctional* clone() const;
00656         virtual BlockStatistics const& getStatistics() const;
00657         virtual BlockStatistics& getStatistics();
00658     private:
00659         BoundedReductiveBoxProcessingFunctional3D* boundedFunctional;
00660         int normalX, normalY, normalZ;
00661     };
00662 };
00663 
00665 template<typename T, template<typename U> class Descriptor>
00666 struct BoundedReductiveBoxProcessingFunctional3D_L : public BoundedReductiveBoxProcessingFunctional3D {
00667     virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00668     virtual void processPlaneGeneric( int direction, int orientation, Box3D domain,
00669                                        std::vector<AtomicBlock3D*> atomicBlocks );
00670     virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain,
00671                                      std::vector<AtomicBlock3D*> atomicBlocks );
00672     virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain,
00673                                        std::vector<AtomicBlock3D*> atomicBlocks );
00674 
00675     virtual void processBulk(Box3D domain, BlockLattice3D<T,Descriptor>& lattice) =0;
00676     virtual void processPlane( int direction, int orientation, Box3D domain,
00677                                BlockLattice3D<T,Descriptor>& lattice ) =0;
00678     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
00679                               BlockLattice3D<T,Descriptor>& lattice ) =0;
00680     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
00681                                 BlockLattice3D<T,Descriptor>& lattice ) =0;
00682 };
00683 
00685 template<typename T>
00686 struct BoundedReductiveBoxProcessingFunctional3D_S : public BoundedReductiveBoxProcessingFunctional3D {
00687     virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00688     virtual void processPlaneGeneric( int direction, int orientation, Box3D domain,
00689                                        std::vector<AtomicBlock3D*> atomicBlocks );
00690     virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain,
00691                                      std::vector<AtomicBlock3D*> atomicBlocks );
00692     virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain,
00693                                        std::vector<AtomicBlock3D*> atomicBlocks );
00694 
00695     virtual void processBulk(Box3D domain, ScalarField3D<T>& field) =0;
00696     virtual void processPlane( int direction, int orientation, Box3D domain,
00697                                ScalarField3D<T>& field ) =0;
00698     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
00699                               ScalarField3D<T>& field ) =0;
00700     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
00701                                 ScalarField3D<T>& field ) =0;
00702 };
00703 
00705 template<typename T, int nDim>
00706 struct BoundedReductiveBoxProcessingFunctional3D_T : public BoundedReductiveBoxProcessingFunctional3D {
00707     virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00708     virtual void processPlaneGeneric( int direction, int orientation, Box3D domain,
00709                                        std::vector<AtomicBlock3D*> atomicBlocks );
00710     virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain,
00711                                      std::vector<AtomicBlock3D*> atomicBlocks );
00712     virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain,
00713                                        std::vector<AtomicBlock3D*> atomicBlocks );
00714 
00715     virtual void processBulk(Box3D domain, TensorField3D<T,nDim>& lattice) =0;
00716     virtual void processPlane( int direction, int orientation, Box3D domain,
00717                                TensorField3D<T,nDim>& lattice ) =0;
00718     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
00719                               TensorField3D<T,nDim>& lattice ) =0;
00720     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
00721                                 TensorField3D<T,nDim>& lattice ) =0;
00722 };
00723 
00725 template<typename T>
00726 struct BoundedReductiveBoxProcessingFunctional3D_N : public BoundedReductiveBoxProcessingFunctional3D {
00727     virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00728     virtual void processPlaneGeneric( int direction, int orientation, Box3D domain,
00729                                        std::vector<AtomicBlock3D*> atomicBlocks );
00730     virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain,
00731                                      std::vector<AtomicBlock3D*> atomicBlocks );
00732     virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain,
00733                                        std::vector<AtomicBlock3D*> atomicBlocks );
00734 
00735     virtual void processBulk(Box3D domain, NTensorField3D<T>& lattice) =0;
00736     virtual void processPlane( int direction, int orientation, Box3D domain,
00737                                NTensorField3D<T>& lattice ) =0;
00738     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
00739                               NTensorField3D<T>& lattice ) =0;
00740     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
00741                                 NTensorField3D<T>& lattice ) =0;
00742 };
00743 
00745 template<typename T>
00746 struct BoundedMaskedReductiveBoxProcessingFunctional3D_N : public BoundedReductiveBoxProcessingFunctional3D {
00747     virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00748     virtual void processPlaneGeneric( int direction, int orientation, Box3D domain,
00749                                        std::vector<AtomicBlock3D*> atomicBlocks );
00750     virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain,
00751                                      std::vector<AtomicBlock3D*> atomicBlocks );
00752     virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain,
00753                                        std::vector<AtomicBlock3D*> atomicBlocks );
00754 
00755     virtual void processBulk(Box3D domain,
00756                              NTensorField3D<T>& lattice,
00757                              NTensorField3D<int>& mask) =0;
00758     virtual void processPlane( int direction, int orientation, Box3D domain,
00759                                NTensorField3D<T>& lattice,
00760                                NTensorField3D<int>& mask ) =0;
00761     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
00762                               NTensorField3D<T>& lattice,
00763                               NTensorField3D<int>& mask ) =0;
00764     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
00765                                 NTensorField3D<T>& lattice,
00766                                 NTensorField3D<int>& mask ) =0;
00767 };
00768 
00770 template<typename T1, template<typename U1> class Descriptor1,
00771          typename T2, template<typename U2> class Descriptor2>
00772 struct BoundedReductiveBoxProcessingFunctional3D_LL : public BoundedReductiveBoxProcessingFunctional3D {
00773     virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00774     virtual void processPlaneGeneric( int direction, int orientation, Box3D domain,
00775                                        std::vector<AtomicBlock3D*> atomicBlocks );
00776     virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain,
00777                                      std::vector<AtomicBlock3D*> atomicBlocks );
00778     virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain,
00779                                        std::vector<AtomicBlock3D*> atomicBlocks );
00780 
00781     virtual void processBulk( Box3D domain, BlockLattice3D<T1,Descriptor1>& lattice1,
00782                                             BlockLattice3D<T2,Descriptor2>& lattice2 ) =0;
00783     virtual void processPlane( int direction, int orientation, Box3D domain,
00784                                BlockLattice3D<T1,Descriptor1>& lattice1,
00785                                BlockLattice3D<T2,Descriptor2>& lattice2 ) =0;
00786     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
00787                               BlockLattice3D<T1,Descriptor1>& lattice1,
00788                               BlockLattice3D<T2,Descriptor2>& lattice2 ) =0;
00789     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
00790                                 BlockLattice3D<T1,Descriptor1>& lattice1,
00791                                 BlockLattice3D<T2,Descriptor2>& lattice2 ) =0;
00792 };
00793 
00795 template<typename T1, typename T2>
00796 struct BoundedReductiveBoxProcessingFunctional3D_SS : public BoundedReductiveBoxProcessingFunctional3D {
00797     virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00798     virtual void processPlaneGeneric( int direction, int orientation, Box3D domain,
00799                                        std::vector<AtomicBlock3D*> atomicBlocks );
00800     virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain,
00801                                      std::vector<AtomicBlock3D*> atomicBlocks );
00802     virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain,
00803                                        std::vector<AtomicBlock3D*> atomicBlocks );
00804 
00805     virtual void processBulk( Box3D domain, ScalarField3D<T1>& field1,
00806                                             ScalarField3D<T2>& field2 ) =0;
00807     virtual void processPlane( int direction, int orientation, Box3D domain,
00808                                ScalarField3D<T1>& field1,
00809                                ScalarField3D<T2>& field2 ) =0;
00810     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
00811                               ScalarField3D<T1>& field1,
00812                               ScalarField3D<T2>& field2 ) =0;
00813     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
00814                                 ScalarField3D<T1>& field1,
00815                                 ScalarField3D<T2>& field2 ) =0;
00816 };
00817 
00819 template<typename T1, int nDim1, typename T2, int nDim2>
00820 struct BoundedReductiveBoxProcessingFunctional3D_TT : public BoundedReductiveBoxProcessingFunctional3D {
00821     virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00822     virtual void processPlaneGeneric( int direction, int orientation, Box3D domain,
00823                                        std::vector<AtomicBlock3D*> atomicBlocks );
00824     virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain,
00825                                      std::vector<AtomicBlock3D*> atomicBlocks );
00826     virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain,
00827                                        std::vector<AtomicBlock3D*> atomicBlocks );
00828 
00829     virtual void processBulk( Box3D domain, TensorField3D<T1,nDim1>& field1,
00830                                             TensorField3D<T2,nDim2>& field2 ) =0;
00831     virtual void processPlane( int direction, int orientation, Box3D domain,
00832                                TensorField3D<T1,nDim1>& field1,
00833                                TensorField3D<T2,nDim2>& field2 ) =0;
00834     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
00835                               TensorField3D<T1,nDim1>& field1,
00836                               TensorField3D<T2,nDim2>& field2 ) =0;
00837     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
00838                                 TensorField3D<T1,nDim1>& field1,
00839                                 TensorField3D<T2,nDim2>& field2 ) =0;
00840 };
00841 
00843 template<typename T1, typename T2, int nDim>
00844 struct BoundedReductiveBoxProcessingFunctional3D_ST : public BoundedReductiveBoxProcessingFunctional3D {
00845     virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00846     virtual void processPlaneGeneric( int direction, int orientation, Box3D domain,
00847                                        std::vector<AtomicBlock3D*> atomicBlocks );
00848     virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain,
00849                                      std::vector<AtomicBlock3D*> atomicBlocks );
00850     virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain,
00851                                        std::vector<AtomicBlock3D*> atomicBlocks );
00852 
00853     virtual void processBulk( Box3D domain, ScalarField3D<T1>& field1,
00854                                             TensorField3D<T2,nDim>& field2 ) =0;
00855     virtual void processPlane( int direction, int orientation, Box3D domain,
00856                                ScalarField3D<T1>& field1,
00857                                TensorField3D<T2,nDim>& field2 ) =0;
00858     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
00859                               ScalarField3D<T1>& field1,
00860                               TensorField3D<T2,nDim>& field2 ) =0;
00861     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
00862                                 ScalarField3D<T1>& field1,
00863                                 TensorField3D<T2,nDim>& field2 ) =0;
00864 };
00865 
00867 template<typename T1, typename T2>
00868 struct BoundedReductiveBoxProcessingFunctional3D_NN : public BoundedReductiveBoxProcessingFunctional3D {
00869     virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00870     virtual void processPlaneGeneric( int direction, int orientation, Box3D domain,
00871                                        std::vector<AtomicBlock3D*> atomicBlocks );
00872     virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain,
00873                                      std::vector<AtomicBlock3D*> atomicBlocks );
00874     virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain,
00875                                        std::vector<AtomicBlock3D*> atomicBlocks );
00876 
00877     virtual void processBulk( Box3D domain, NTensorField3D<T1>& field1,
00878                                             NTensorField3D<T2>& field2 ) =0;
00879     virtual void processPlane( int direction, int orientation, Box3D domain,
00880                                NTensorField3D<T1>& field1,
00881                                NTensorField3D<T2>& field2 ) =0;
00882     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
00883                               NTensorField3D<T1>& field1,
00884                               NTensorField3D<T2>& field2 ) =0;
00885     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
00886                                 NTensorField3D<T1>& field1,
00887                                 NTensorField3D<T2>& field2 ) =0;
00888 };
00889 
00891 template<typename T1, typename T2>
00892 struct BoundedMaskedReductiveBoxProcessingFunctional3D_NN : public BoundedReductiveBoxProcessingFunctional3D {
00893     virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00894     virtual void processPlaneGeneric( int direction, int orientation, Box3D domain,
00895                                        std::vector<AtomicBlock3D*> atomicBlocks );
00896     virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain,
00897                                      std::vector<AtomicBlock3D*> atomicBlocks );
00898     virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain,
00899                                        std::vector<AtomicBlock3D*> atomicBlocks );
00900 
00901     virtual void processBulk( Box3D domain, NTensorField3D<T1>& field1,
00902                                             NTensorField3D<T2>& field2,
00903                                             NTensorField3D<int>& mask ) =0;
00904     virtual void processPlane( int direction, int orientation, Box3D domain,
00905                                NTensorField3D<T1>& field1,
00906                                NTensorField3D<T2>& field2,
00907                                NTensorField3D<int>& mask ) =0;
00908     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
00909                               NTensorField3D<T1>& field1,
00910                               NTensorField3D<T2>& field2,
00911                               NTensorField3D<int>& mask ) =0;
00912     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
00913                                 NTensorField3D<T1>& field1,
00914                                 NTensorField3D<T2>& field2,
00915                                 NTensorField3D<int>& mask ) =0;
00916 };
00917 
00919 template<typename T1, typename T2>
00920 struct BoundedReductiveBoxProcessingFunctional3D_SN : public BoundedReductiveBoxProcessingFunctional3D {
00921     virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00922     virtual void processPlaneGeneric( int direction, int orientation, Box3D domain,
00923                                        std::vector<AtomicBlock3D*> atomicBlocks );
00924     virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain,
00925                                      std::vector<AtomicBlock3D*> atomicBlocks );
00926     virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain,
00927                                        std::vector<AtomicBlock3D*> atomicBlocks );
00928 
00929     virtual void processBulk( Box3D domain, ScalarField3D<T1>& field1,
00930                                             NTensorField3D<T2>& field2 ) =0;
00931     virtual void processPlane( int direction, int orientation, Box3D domain,
00932                                ScalarField3D<T1>& field1,
00933                                NTensorField3D<T2>& field2 ) =0;
00934     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
00935                               ScalarField3D<T1>& field1,
00936                               NTensorField3D<T2>& field2 ) =0;
00937     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
00938                                 ScalarField3D<T1>& field1,
00939                                 NTensorField3D<T2>& field2 ) =0;
00940 };
00941 
00943 template<typename T1, template<typename U> class Descriptor, typename T2>
00944 struct BoundedReductiveBoxProcessingFunctional3D_LS : public BoundedReductiveBoxProcessingFunctional3D {
00945     virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00946     virtual void processPlaneGeneric( int direction, int orientation, Box3D domain,
00947                                        std::vector<AtomicBlock3D*> atomicBlocks );
00948     virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain,
00949                                      std::vector<AtomicBlock3D*> atomicBlocks );
00950     virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain,
00951                                        std::vector<AtomicBlock3D*> atomicBlocks );
00952 
00953     virtual void processBulk( Box3D domain, BlockLattice3D<T1,Descriptor>& lattice,
00954                                             ScalarField3D<T2>& field ) =0;
00955     virtual void processPlane( int direction, int orientation, Box3D domain,
00956                                BlockLattice3D<T1,Descriptor>& lattice,
00957                                ScalarField3D<T2>& field ) =0;
00958     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
00959                               BlockLattice3D<T1,Descriptor>& lattice,
00960                               ScalarField3D<T2>& field ) =0;
00961     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
00962                                 BlockLattice3D<T1,Descriptor>& lattice,
00963                                 ScalarField3D<T2>& field ) =0;
00964 };
00965 
00967 template<typename T1, template<typename U> class Descriptor, typename T2, int nDim>
00968 struct BoundedReductiveBoxProcessingFunctional3D_LT : public BoundedReductiveBoxProcessingFunctional3D {
00969     virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00970     virtual void processPlaneGeneric( int direction, int orientation, Box3D domain,
00971                                        std::vector<AtomicBlock3D*> atomicBlocks );
00972     virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain,
00973                                      std::vector<AtomicBlock3D*> atomicBlocks );
00974     virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain,
00975                                        std::vector<AtomicBlock3D*> atomicBlocks );
00976 
00977     virtual void processBulk( Box3D domain, BlockLattice3D<T1,Descriptor>& lattice,
00978                                             TensorField3D<T2,nDim>& field ) =0;
00979     virtual void processPlane( int direction, int orientation, Box3D domain,
00980                                BlockLattice3D<T1,Descriptor>& lattice,
00981                                TensorField3D<T2,nDim>& field ) =0;
00982     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
00983                               BlockLattice3D<T1,Descriptor>& lattice,
00984                               TensorField3D<T2,nDim>& field ) =0;
00985     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
00986                                 BlockLattice3D<T1,Descriptor>& lattice,
00987                                 TensorField3D<T2,nDim>& field ) =0;
00988 };
00989 
00991 template<typename T1, template<typename U> class Descriptor, typename T2>
00992 struct BoundedReductiveBoxProcessingFunctional3D_LN : public BoundedReductiveBoxProcessingFunctional3D {
00993     virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
00994     virtual void processPlaneGeneric( int direction, int orientation, Box3D domain,
00995                                        std::vector<AtomicBlock3D*> atomicBlocks );
00996     virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain,
00997                                      std::vector<AtomicBlock3D*> atomicBlocks );
00998     virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain,
00999                                        std::vector<AtomicBlock3D*> atomicBlocks );
01000 
01001     virtual void processBulk( Box3D domain, BlockLattice3D<T1,Descriptor>& lattice,
01002                                             NTensorField3D<T2>& field ) =0;
01003     virtual void processPlane( int direction, int orientation, Box3D domain,
01004                                BlockLattice3D<T1,Descriptor>& lattice,
01005                                NTensorField3D<T2>& field ) =0;
01006     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
01007                               BlockLattice3D<T1,Descriptor>& lattice,
01008                               NTensorField3D<T2>& field ) =0;
01009     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
01010                                 BlockLattice3D<T1,Descriptor>& lattice,
01011                                 NTensorField3D<T2>& field ) =0;
01012 };
01013 
01015 template<typename T1, template<typename U> class Descriptor, typename T2>
01016 struct BoundedMaskedReductiveBoxProcessingFunctional3D_LN : public BoundedReductiveBoxProcessingFunctional3D {
01017     virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
01018     virtual void processPlaneGeneric( int direction, int orientation, Box3D domain,
01019                                        std::vector<AtomicBlock3D*> atomicBlocks );
01020     virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain,
01021                                      std::vector<AtomicBlock3D*> atomicBlocks );
01022     virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain,
01023                                        std::vector<AtomicBlock3D*> atomicBlocks );
01024 
01025     virtual void processBulk( Box3D domain, BlockLattice3D<T1,Descriptor>& lattice,
01026                                             NTensorField3D<T2>& field,
01027                                             NTensorField3D<int>& mask ) =0;
01028     virtual void processPlane( int direction, int orientation, Box3D domain,
01029                                BlockLattice3D<T1,Descriptor>& lattice,
01030                                NTensorField3D<T2>& field,
01031                                NTensorField3D<int>& mask ) =0;
01032     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
01033                               BlockLattice3D<T1,Descriptor>& lattice,
01034                               NTensorField3D<T2>& field,
01035                               NTensorField3D<int>& mask ) =0;
01036     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
01037                                 BlockLattice3D<T1,Descriptor>& lattice,
01038                                 NTensorField3D<T2>& field,
01039                                 NTensorField3D<int>& mask ) =0;
01040 };
01041 
01043 template<typename T, template<typename U> class Descriptor>
01044 struct BoundedReductiveLatticeBoxProcessingFunctional3D : public BoundedReductiveBoxProcessingFunctional3D {
01045     virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
01046     virtual void processPlaneGeneric( int direction, int orientation, Box3D domain,
01047                                        std::vector<AtomicBlock3D*> atomicBlocks );
01048     virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain,
01049                                      std::vector<AtomicBlock3D*> atomicBlocks );
01050     virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain,
01051                                        std::vector<AtomicBlock3D*> atomicBlocks );
01052 
01053     virtual void processBulk(Box3D domain, std::vector<BlockLattice3D<T,Descriptor>*> lattices) =0;
01054     virtual void processPlane( int direction, int orientation, Box3D domain,
01055                                std::vector<BlockLattice3D<T,Descriptor>*> lattices ) =0;
01056     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
01057                               std::vector<BlockLattice3D<T,Descriptor>*> lattices ) =0;
01058     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
01059                                 std::vector<BlockLattice3D<T,Descriptor>*> lattices ) =0;
01060 };
01061 
01063 template<typename T>
01064 struct BoundedReductiveScalarFieldBoxProcessingFunctional3D : public BoundedReductiveBoxProcessingFunctional3D {
01065     virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
01066     virtual void processPlaneGeneric( int direction, int orientation, Box3D domain,
01067                                        std::vector<AtomicBlock3D*> atomicBlocks );
01068     virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain,
01069                                      std::vector<AtomicBlock3D*> atomicBlocks );
01070     virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain,
01071                                        std::vector<AtomicBlock3D*> atomicBlocks );
01072 
01073     virtual void processBulk(Box3D domain, std::vector<ScalarField3D<T>*> field) =0;
01074     virtual void processPlane( int direction, int orientation, Box3D domain,
01075                                std::vector<ScalarField3D<T>*> field ) =0;
01076     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
01077                               std::vector<ScalarField3D<T>*> field ) =0;
01078     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
01079                                 std::vector<ScalarField3D<T>*> field ) =0;
01080 };
01081 
01083 template<typename T, int nDim>
01084 struct BoundedReductiveTensorFieldBoxProcessingFunctional3D : public BoundedReductiveBoxProcessingFunctional3D {
01085     virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
01086     virtual void processPlaneGeneric( int direction, int orientation, Box3D domain,
01087                                        std::vector<AtomicBlock3D*> atomicBlocks );
01088     virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain,
01089                                      std::vector<AtomicBlock3D*> atomicBlocks );
01090     virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain,
01091                                        std::vector<AtomicBlock3D*> atomicBlocks );
01092 
01093     virtual void processBulk(Box3D domain, std::vector<TensorField3D<T,nDim>*> field) =0;
01094     virtual void processPlane( int direction, int orientation, Box3D domain,
01095                                std::vector<TensorField3D<T,nDim>*> field ) =0;
01096     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
01097                               std::vector<TensorField3D<T,nDim>*> field ) =0;
01098     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
01099                                 std::vector<TensorField3D<T,nDim>*> field ) =0;
01100 };
01101 
01103 template<typename T>
01104 struct BoundedReductiveNTensorFieldBoxProcessingFunctional3D : public BoundedReductiveBoxProcessingFunctional3D {
01105     virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks);
01106     virtual void processPlaneGeneric( int direction, int orientation, Box3D domain,
01107                                        std::vector<AtomicBlock3D*> atomicBlocks );
01108     virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain,
01109                                      std::vector<AtomicBlock3D*> atomicBlocks );
01110     virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain,
01111                                        std::vector<AtomicBlock3D*> atomicBlocks );
01112 
01113     virtual void processBulk(Box3D domain, std::vector<NTensorField3D<T>*> field) =0;
01114     virtual void processPlane( int direction, int orientation, Box3D domain,
01115                                std::vector<NTensorField3D<T>*> field ) =0;
01116     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
01117                               std::vector<NTensorField3D<T>*> field ) =0;
01118     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
01119                                 std::vector<NTensorField3D<T>*> field ) =0;
01120 };
01121 
01122 }  // namespace plb
01123 
01124 #endif  // REDUCTIVE_DATA_PROCESSING_FUNCTIONAL_3D_H