|
Palabos
Version 1.0
|
00001 /* This file is part of the Palabos library. 00002 * 00003 * Copyright (C) 2011 FlowKit Sarl 00004 * Avenue de Chailly 23 00005 * 1012 Lausanne, Switzerland 00006 * E-mail contact: contact@flowkit.com 00007 * 00008 * The most recent release of Palabos can be downloaded at 00009 * <http://www.palabos.org/> 00010 * 00011 * The library Palabos is free software: you can redistribute it and/or 00012 * modify it under the terms of the GNU Affero General Public License as 00013 * published by the Free Software Foundation, either version 3 of the 00014 * License, or (at your option) any later version. 00015 * 00016 * The library is distributed in the hope that it will be useful, 00017 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00018 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00019 * GNU Affero General Public License for more details. 00020 * 00021 * You should have received a copy of the GNU Affero General Public License 00022 * along with this program. If not, see <http://www.gnu.org/licenses/>. 00023 */ 00024 00028 #ifndef DATA_PROCESSING_FUNCTIONAL_3D_H 00029 #define 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 class BoxProcessingFunctional3D { 00055 public: 00056 BoxProcessingFunctional3D(); 00057 virtual ~BoxProcessingFunctional3D() { } 00058 virtual void processGenericBlocks(Box3D domain, 00059 std::vector<AtomicBlock3D*> 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 BoxProcessingFunctional3D* 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 BoxProcessor3D : public DataProcessor3D { 00079 public: 00080 BoxProcessor3D(BoxProcessingFunctional3D* functional_, 00081 Box3D domain_, std::vector<AtomicBlock3D*> atomicBlocks_); 00082 BoxProcessor3D(BoxProcessor3D const& rhs); 00083 BoxProcessor3D& operator=(BoxProcessor3D const& rhs); 00084 ~BoxProcessor3D(); 00085 Box3D getDomain() const; 00086 virtual void process(); 00087 virtual BoxProcessor3D* clone() const; 00088 virtual int getStaticId() const; 00089 private: 00090 BoxProcessingFunctional3D* functional; 00091 Box3D domain; 00092 std::vector<AtomicBlock3D*> atomicBlocks; 00093 }; 00094 00096 class BoxProcessorGenerator3D : public BoxedDataProcessorGenerator3D { 00097 public: 00098 BoxProcessorGenerator3D(BoxProcessingFunctional3D* functional_, Box3D domain); 00099 ~BoxProcessorGenerator3D(); 00100 BoxProcessorGenerator3D(BoxProcessorGenerator3D const& rhs); 00101 BoxProcessorGenerator3D& operator=(BoxProcessorGenerator3D 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 DataProcessor3D* generate(std::vector<AtomicBlock3D*> atomicBlocks) const; 00109 virtual BoxProcessorGenerator3D* clone() const; 00110 virtual void serialize(Box3D& domain, std::string& data) const; 00111 virtual int getStaticId() const; 00112 private: 00113 BoxProcessingFunctional3D* functional; 00114 }; 00115 00116 00118 template<typename T, template<typename U> class Descriptor> 00119 struct BoxProcessingFunctional3D_L : public BoxProcessingFunctional3D { 00120 virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice) =0; 00122 virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00123 }; 00124 00126 template<typename T, template<typename U> class Descriptor> 00127 struct MaskedBoxProcessingFunctional3D_L : public BoxProcessingFunctional3D { 00128 virtual void process( Box3D domain, 00129 BlockLattice3D<T,Descriptor>& lattice, 00130 NTensorField3D<int>& mask) =0; 00132 virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00133 }; 00134 00136 template<typename T> 00137 struct BoxProcessingFunctional3D_S : public BoxProcessingFunctional3D { 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 BoxProcessingFunctional3D_T : public BoxProcessingFunctional3D { 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 BoxProcessingFunctional3D_N : public BoxProcessingFunctional3D { 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 MaskedBoxProcessingFunctional3D_N : public BoxProcessingFunctional3D { 00162 virtual void process(Box3D domain, NTensorField3D<T>& field, 00163 NTensorField3D<int>& mask) =0; 00165 virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00166 }; 00167 00169 template<typename T1, template<typename U1> class Descriptor1, 00170 typename T2, template<typename U2> class Descriptor2> 00171 struct BoxProcessingFunctional3D_LL : public BoxProcessingFunctional3D { 00172 virtual void process(Box3D domain, BlockLattice3D<T1,Descriptor1>& lattice1, 00173 BlockLattice3D<T2,Descriptor2>& lattice2) =0; 00175 virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00176 }; 00177 00179 template<typename T1, typename T2> 00180 struct BoxProcessingFunctional3D_SS : public BoxProcessingFunctional3D { 00181 virtual void process(Box3D domain, ScalarField3D<T1>& field1, 00182 ScalarField3D<T2>& field2) =0; 00184 virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00185 }; 00186 00188 template<typename T1, int nDim1, 00189 typename T2, int nDim2> 00190 struct BoxProcessingFunctional3D_TT : public BoxProcessingFunctional3D { 00191 virtual void process(Box3D domain, TensorField3D<T1,nDim1>& field1, 00192 TensorField3D<T2,nDim2>& field2) =0; 00194 virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00195 }; 00196 00198 template<typename T1, typename T2, int nDim> 00199 struct BoxProcessingFunctional3D_ST : public BoxProcessingFunctional3D { 00200 virtual void process(Box3D domain, ScalarField3D<T1>& field1, 00201 TensorField3D<T2,nDim>& field2) =0; 00203 virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00204 }; 00205 00207 template<typename T1, typename T2> 00208 struct BoxProcessingFunctional3D_NN : public BoxProcessingFunctional3D { 00209 virtual void process(Box3D domain, NTensorField3D<T1>& field1, 00210 NTensorField3D<T2>& field2) =0; 00212 virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00213 }; 00214 00216 template<typename T1, typename T2> 00217 struct MaskedBoxProcessingFunctional3D_NN : public BoxProcessingFunctional3D { 00218 virtual void process(Box3D domain, NTensorField3D<T1>& field1, 00219 NTensorField3D<T2>& field2, 00220 NTensorField3D<int>& mask) =0; 00222 virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00223 }; 00224 00226 template<typename T1, typename T2> 00227 struct BoxProcessingFunctional3D_SN : public BoxProcessingFunctional3D { 00228 virtual void process(Box3D domain, ScalarField3D<T1>& field1, 00229 NTensorField3D<T2>& field2) =0; 00231 virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00232 }; 00233 00235 template<typename T1, template<typename U> class Descriptor, typename T2> 00236 struct BoxProcessingFunctional3D_LS : public BoxProcessingFunctional3D { 00237 virtual void process(Box3D domain, BlockLattice3D<T1,Descriptor>& lattice, 00238 ScalarField3D<T2>& field) =0; 00240 virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00241 }; 00242 00244 template<typename T1, template<typename U> class Descriptor, 00245 typename T2, int nDim> 00246 struct BoxProcessingFunctional3D_LT : public BoxProcessingFunctional3D { 00247 virtual void process(Box3D domain, BlockLattice3D<T1,Descriptor>& lattice, 00248 TensorField3D<T2,nDim>& field) =0; 00250 virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00251 }; 00252 00254 template<typename T1, template<typename U> class Descriptor, typename T2> 00255 struct BoxProcessingFunctional3D_LN : public BoxProcessingFunctional3D { 00256 virtual void process(Box3D domain, BlockLattice3D<T1,Descriptor>& lattice, 00257 NTensorField3D<T2>& field) =0; 00259 virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00260 }; 00261 00263 template<typename T1, template<typename U> class Descriptor, typename T2> 00264 struct MaskedBoxProcessingFunctional3D_LN : public BoxProcessingFunctional3D { 00265 virtual void process(Box3D domain, BlockLattice3D<T1,Descriptor>& lattice, 00266 NTensorField3D<T2>& field, 00267 NTensorField3D<int>& mask) =0; 00269 virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00270 }; 00271 00273 template<typename T, template<typename U> class Descriptor> 00274 struct LatticeBoxProcessingFunctional3D : public BoxProcessingFunctional3D { 00275 virtual void process(Box3D domain, std::vector<BlockLattice3D<T,Descriptor>*> lattices) =0; 00277 virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00278 }; 00279 00281 template<typename T> 00282 struct ScalarFieldBoxProcessingFunctional3D : public BoxProcessingFunctional3D { 00283 virtual void process(Box3D domain, std::vector<ScalarField3D<T>*> scalarFields) =0; 00285 virtual void processGenericBlocks( Box3D domain, 00286 std::vector<AtomicBlock3D*> atomicBlocks ); 00287 }; 00288 00290 template<typename T, int nDim> 00291 struct TensorFieldBoxProcessingFunctional3D : public BoxProcessingFunctional3D { 00292 virtual void process(Box3D domain, std::vector<TensorField3D<T,nDim>*> tensorFields) =0; 00294 virtual void processGenericBlocks( Box3D domain, 00295 std::vector<AtomicBlock3D*> atomicBlocks ); 00296 }; 00297 00299 template<typename T> 00300 struct NTensorFieldBoxProcessingFunctional3D : public BoxProcessingFunctional3D { 00301 virtual void process(Box3D domain, std::vector<NTensorField3D<T>*> tensorFields) =0; 00303 virtual void processGenericBlocks( Box3D domain, 00304 std::vector<AtomicBlock3D*> atomicBlocks ); 00305 }; 00306 00308 template<typename T> 00309 struct MaskedNTensorFieldBoxProcessingFunctional3D : public BoxProcessingFunctional3D { 00310 virtual void process( Box3D domain, 00311 std::vector<NTensorField3D<T>*> tensorFields, 00312 NTensorField3D<int>& mask ) =0; 00314 virtual void processGenericBlocks( Box3D domain, 00315 std::vector<AtomicBlock3D*> atomicBlocks ); 00316 }; 00317 00318 00319 /* *************** All flavors of Dot processing functionals ********* */ 00320 00322 struct DotProcessingFunctional3D { 00323 virtual ~DotProcessingFunctional3D() { } 00324 virtual void processGenericBlocks( DotList3D const& dotList, 00325 std::vector<AtomicBlock3D*> atomicBlocks ) =0; 00326 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 DotProcessingFunctional3D* clone() const =0; 00333 }; 00334 00336 class DotProcessor3D : public DataProcessor3D { 00337 public: 00338 DotProcessor3D(DotProcessingFunctional3D* functional_, 00339 DotList3D const& dotList_, std::vector<AtomicBlock3D*> atomicBlocks_); 00340 DotProcessor3D(DotProcessor3D const& rhs); 00341 DotProcessor3D& operator=(DotProcessor3D const& rhs); 00342 ~DotProcessor3D(); 00343 virtual void process(); 00344 virtual DotProcessor3D* clone() const; 00345 DotList3D const& getDotList() const; 00346 private: 00347 DotProcessingFunctional3D* functional; 00348 DotList3D dotList; 00349 std::vector<AtomicBlock3D*> atomicBlocks; 00350 }; 00351 00353 class DotProcessorGenerator3D : public DottedDataProcessorGenerator3D { 00354 public: 00355 DotProcessorGenerator3D(DotProcessingFunctional3D* functional_, 00356 DotList3D const& dotList); 00357 ~DotProcessorGenerator3D(); 00358 DotProcessorGenerator3D(DotProcessorGenerator3D const& rhs); 00359 DotProcessorGenerator3D& operator=(DotProcessorGenerator3D const& rhs); 00360 virtual BlockDomain::DomainT appliesTo() const; 00361 virtual void rescale(double dxScale, double dtScale); 00362 virtual void setscale(int dxScale, int dtScale); 00363 virtual void getModificationPattern(std::vector<bool>& isWritten) const; 00364 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const; 00365 virtual DataProcessor3D* generate(std::vector<AtomicBlock3D*> atomicBlocks) const; 00366 virtual DotProcessorGenerator3D* clone() const; 00367 private: 00368 DotProcessingFunctional3D* functional; 00369 }; 00370 00372 template<typename T, template<typename U> class Descriptor> 00373 struct DotProcessingFunctional3D_L : public DotProcessingFunctional3D { 00374 virtual void process(DotList3D const& dotList, BlockLattice3D<T,Descriptor>& lattice) =0; 00376 virtual void processGenericBlocks(DotList3D const& dotList, std::vector<AtomicBlock3D*> atomicBlocks); 00377 }; 00378 00380 template<typename T> 00381 struct DotProcessingFunctional3D_S : public DotProcessingFunctional3D { 00382 virtual void process(DotList3D const& dotList, ScalarField3D<T>& field) =0; 00384 virtual void processGenericBlocks( DotList3D const& dotList, 00385 std::vector<AtomicBlock3D*> atomicBlocks ); 00386 }; 00387 00389 template<typename T, int nDim> 00390 struct DotProcessingFunctional3D_T : public DotProcessingFunctional3D { 00391 virtual void process(DotList3D const& dotList, TensorField3D<T,nDim>& field) =0; 00393 virtual void processGenericBlocks( DotList3D const& dotList, 00394 std::vector<AtomicBlock3D*> atomicBlocks ); 00395 }; 00396 00398 template<typename T> 00399 struct DotProcessingFunctional3D_N : public DotProcessingFunctional3D { 00400 virtual void process(DotList3D const& dotList, NTensorField3D<T>& field) =0; 00402 virtual void processGenericBlocks( DotList3D const& dotList, 00403 std::vector<AtomicBlock3D*> atomicBlocks ); 00404 }; 00405 00407 template<typename T1, template<typename U1> class Descriptor1, 00408 typename T2, template<typename U2> class Descriptor2> 00409 struct DotProcessingFunctional3D_LL : public DotProcessingFunctional3D { 00410 virtual void process(DotList3D const& dotList, 00411 BlockLattice3D<T1,Descriptor1>& lattice1, 00412 BlockLattice3D<T2,Descriptor2>& lattice2) =0; 00414 virtual void processGenericBlocks( DotList3D const& dotList, 00415 std::vector<AtomicBlock3D*> atomicBlocks ); 00416 }; 00417 00419 template<typename T1, typename T2> 00420 struct DotProcessingFunctional3D_SS : public DotProcessingFunctional3D { 00421 virtual void process(DotList3D const& dotList, ScalarField3D<T1>& field1, 00422 ScalarField3D<T2>& field2) =0; 00424 virtual void processGenericBlocks( DotList3D const& dotList, 00425 std::vector<AtomicBlock3D*> atomicBlocks ); 00426 }; 00427 00429 template<typename T1, int nDim1, typename T2, int nDim2> 00430 struct DotProcessingFunctional3D_TT : public DotProcessingFunctional3D { 00431 virtual void process(DotList3D const& dotList, 00432 TensorField3D<T1,nDim1>& field1, 00433 TensorField3D<T2,nDim2>& field2) =0; 00435 virtual void processGenericBlocks( DotList3D const& dotList, 00436 std::vector<AtomicBlock3D*> atomicBlocks ); 00437 }; 00438 00440 template<typename T1, typename T2, int nDim> 00441 struct DotProcessingFunctional3D_ST : public DotProcessingFunctional3D { 00442 virtual void process(DotList3D const& dotList, 00443 ScalarField3D<T1>& field1, 00444 TensorField3D<T2,nDim>& field2) =0; 00446 virtual void processGenericBlocks( DotList3D const& dotList, 00447 std::vector<AtomicBlock3D*> atomicBlocks ); 00448 }; 00449 00451 template<typename T1, typename T2> 00452 struct DotProcessingFunctional3D_NN : public DotProcessingFunctional3D { 00453 virtual void process(DotList3D const& dotList, 00454 NTensorField3D<T1>& field1, 00455 NTensorField3D<T2>& field2) =0; 00457 virtual void processGenericBlocks( DotList3D const& dotList, 00458 std::vector<AtomicBlock3D*> atomicBlocks ); 00459 }; 00460 00462 template<typename T1, typename T2> 00463 struct DotProcessingFunctional3D_SN : public DotProcessingFunctional3D { 00464 virtual void process(DotList3D const& dotList, 00465 ScalarField3D<T1>& field1, 00466 NTensorField3D<T2>& field2) =0; 00468 virtual void processGenericBlocks( DotList3D const& dotList, 00469 std::vector<AtomicBlock3D*> atomicBlocks ); 00470 }; 00471 00473 template<typename T1, template<typename U> class Descriptor, typename T2> 00474 struct DotProcessingFunctional3D_LS : public DotProcessingFunctional3D { 00475 virtual void process(DotList3D const& dotList, 00476 BlockLattice3D<T1,Descriptor>& lattice, 00477 ScalarField3D<T2>& field) =0; 00479 virtual void processGenericBlocks( DotList3D const& dotList, 00480 std::vector<AtomicBlock3D*> atomicBlocks ); 00481 }; 00482 00484 template<typename T1, template<typename U> class Descriptor, 00485 typename T2, int nDim> 00486 struct DotProcessingFunctional3D_LT : public DotProcessingFunctional3D { 00487 virtual void process(DotList3D const& dotList, 00488 BlockLattice3D<T1,Descriptor>& lattice, 00489 TensorField3D<T2,nDim>& field) =0; 00491 virtual void processGenericBlocks( DotList3D const& dotList, 00492 std::vector<AtomicBlock3D*> atomicBlocks ); 00493 }; 00494 00496 template<typename T1, template<typename U> class Descriptor, typename T2> 00497 struct DotProcessingFunctional3D_LN : public DotProcessingFunctional3D { 00498 virtual void process(DotList3D const& dotList, 00499 BlockLattice3D<T1,Descriptor>& lattice, 00500 NTensorField3D<T2>& field) =0; 00502 virtual void processGenericBlocks( DotList3D const& dotList, 00503 std::vector<AtomicBlock3D*> atomicBlocks ); 00504 }; 00505 00507 template<typename T, template<typename U> class Descriptor> 00508 struct LatticeDotProcessingFunctional3D : public DotProcessingFunctional3D { 00509 virtual void process(DotList3D const& dotList, std::vector<BlockLattice3D<T,Descriptor>*> lattices) =0; 00511 virtual void processGenericBlocks( DotList3D const& dotList, 00512 std::vector<AtomicBlock3D*> atomicBlocks ); 00513 }; 00514 00516 template<typename T> 00517 struct ScalarFieldDotProcessingFunctional3D : public DotProcessingFunctional3D { 00518 virtual void process(DotList3D const& dotList, std::vector<ScalarField3D<T>*> scalarFields) =0; 00520 virtual void processGenericBlocks( DotList3D const& dotList, 00521 std::vector<AtomicBlock3D*> atomicBlocks ); 00522 }; 00523 00525 template<typename T, int nDim> 00526 struct TensorFieldDotProcessingFunctional3D : public DotProcessingFunctional3D { 00527 virtual void process(DotList3D const& dotList, std::vector<TensorField3D<T,nDim>*> tensorFields) =0; 00529 virtual void processGenericBlocks( DotList3D const& dotList, 00530 std::vector<AtomicBlock3D*> atomicBlocks ); 00531 }; 00532 00533 00535 template<typename T> 00536 struct NTensorFieldDotProcessingFunctional3D : public DotProcessingFunctional3D { 00537 virtual void process(DotList3D const& dotList, std::vector<NTensorField3D<T>*> tensorFields) =0; 00539 virtual void processGenericBlocks( DotList3D const& dotList, 00540 std::vector<AtomicBlock3D*> atomicBlocks ); 00541 }; 00542 00543 00544 /* *************** All flavors of Bounded Box processing functionals ********* */ 00545 00547 class BoundedBoxProcessingFunctional3D { 00548 public: 00549 BoundedBoxProcessingFunctional3D(); 00550 virtual ~BoundedBoxProcessingFunctional3D() { } 00551 virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks) =0; 00552 virtual void processPlaneGeneric( int direction, int orientation, Box3D domain, 00553 std::vector<AtomicBlock3D*> atomicBlocks ) =0; 00554 virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain, 00555 std::vector<AtomicBlock3D*> atomicBlocks ) =0; 00556 virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain, 00557 std::vector<AtomicBlock3D*> atomicBlocks ) =0; 00558 virtual BlockDomain::DomainT appliesTo() const; 00560 virtual void rescale(double dxScale, double dtScale); 00561 virtual void setscale(int dxScale_, int dtScale_); 00563 virtual void getModificationPattern(std::vector<bool>& isWritten) const; 00564 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const =0; 00565 virtual BoundedBoxProcessingFunctional3D* clone() const =0; 00566 BoxProcessingFunctional3D* getBulkProcessor() const; 00567 BoxProcessingFunctional3D* getPlaneProcessor(int direction, int orientation) const; 00568 BoxProcessingFunctional3D* getEdgeProcessor(int plane, int normal1, int normal2) const; 00569 BoxProcessingFunctional3D* getCornerProcessor(int normalX, int normalY, int normalZ) const; 00570 void getGenerators ( 00571 Box3D const& fullDomain, plint boundaryWidth_, 00572 std::vector<BoxProcessorGenerator3D*>& generators ); 00573 int getDxScale() const; 00574 int getDtScale() const; 00575 private: 00576 int dxScale, dtScale; 00577 public: 00578 class BulkWrapperFunctional : public BoxProcessingFunctional3D { 00579 public: 00580 BulkWrapperFunctional(BoundedBoxProcessingFunctional3D* boundedFunctional_); 00581 BulkWrapperFunctional(BulkWrapperFunctional const& rhs); 00582 ~BulkWrapperFunctional(); 00583 BulkWrapperFunctional& operator=(BulkWrapperFunctional const& rhs); 00584 virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00585 virtual BlockDomain::DomainT appliesTo() const; 00586 virtual void rescale(double dxScale, double dtScale); 00587 virtual void setscale(int dxScale_, int dtScale_); 00588 virtual void getModificationPattern(std::vector<bool>& isWritten) const; 00589 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const; 00590 virtual BulkWrapperFunctional* clone() const; 00591 private: 00592 BoundedBoxProcessingFunctional3D* boundedFunctional; 00593 }; 00594 class PlaneWrapperFunctional : public BoxProcessingFunctional3D { 00595 public: 00596 PlaneWrapperFunctional(BoundedBoxProcessingFunctional3D* boundedFunctional_, 00597 int direction_, int orientation_); 00598 PlaneWrapperFunctional(PlaneWrapperFunctional const& rhs); 00599 ~PlaneWrapperFunctional(); 00600 PlaneWrapperFunctional& operator=(PlaneWrapperFunctional const& rhs); 00601 virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> 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 PlaneWrapperFunctional* clone() const; 00609 private: 00610 BoundedBoxProcessingFunctional3D* boundedFunctional; 00611 int direction, orientation; 00612 }; 00613 class EdgeWrapperFunctional : public BoxProcessingFunctional3D { 00614 public: 00615 EdgeWrapperFunctional(BoundedBoxProcessingFunctional3D* boundedFunctional_, 00616 int plane_, int normal1_, int normal2_); 00617 EdgeWrapperFunctional(EdgeWrapperFunctional const& rhs); 00618 ~EdgeWrapperFunctional(); 00619 EdgeWrapperFunctional& operator=(EdgeWrapperFunctional const& rhs); 00620 virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00621 virtual BlockDomain::DomainT appliesTo() const; 00623 virtual void rescale(double dxScale, double dtScale); 00624 virtual void setscale(int dxScale_, int dtScale_); 00625 virtual void getModificationPattern(std::vector<bool>& isWritten) const; 00626 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const; 00627 virtual EdgeWrapperFunctional* clone() const; 00628 private: 00629 BoundedBoxProcessingFunctional3D* boundedFunctional; 00630 int plane, normal1, normal2; 00631 }; 00632 class CornerWrapperFunctional : public BoxProcessingFunctional3D { 00633 public: 00634 CornerWrapperFunctional(BoundedBoxProcessingFunctional3D* boundedFunctional_, 00635 int normalX_, int normalY_, int normalZ_); 00636 CornerWrapperFunctional(CornerWrapperFunctional const& rhs); 00637 ~CornerWrapperFunctional(); 00638 CornerWrapperFunctional& operator=(CornerWrapperFunctional const& rhs); 00639 virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00640 virtual BlockDomain::DomainT appliesTo() const; 00642 virtual void rescale(double dxScale, double dtScale); 00643 virtual void setscale(int dxScale_, int dtScale_); 00644 virtual void getModificationPattern(std::vector<bool>& isWritten) const; 00645 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const; 00646 virtual CornerWrapperFunctional* clone() const; 00647 private: 00648 BoundedBoxProcessingFunctional3D* boundedFunctional; 00649 int normalX, normalY, normalZ; 00650 }; 00651 }; 00652 00654 template<typename T, template<typename U> class Descriptor> 00655 struct BoundedBoxProcessingFunctional3D_L : public BoundedBoxProcessingFunctional3D { 00656 virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00657 virtual void processPlaneGeneric( int direction, int orientation, Box3D domain, 00658 std::vector<AtomicBlock3D*> atomicBlocks ); 00659 virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain, 00660 std::vector<AtomicBlock3D*> atomicBlocks ); 00661 virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain, 00662 std::vector<AtomicBlock3D*> atomicBlocks ); 00663 00664 virtual void processBulk(Box3D domain, BlockLattice3D<T,Descriptor>& lattice) =0; 00665 virtual void processPlane( int direction, int orientation, Box3D domain, 00666 BlockLattice3D<T,Descriptor>& lattice ) =0; 00667 virtual void processEdge( int plane, int normal1, int normal2, Box3D domain, 00668 BlockLattice3D<T,Descriptor>& lattice ) =0; 00669 virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain, 00670 BlockLattice3D<T,Descriptor>& lattice ) =0; 00671 }; 00672 00674 template<typename T> 00675 struct BoundedBoxProcessingFunctional3D_S : public BoundedBoxProcessingFunctional3D { 00676 virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00677 virtual void processPlaneGeneric( int direction, int orientation, Box3D domain, 00678 std::vector<AtomicBlock3D*> atomicBlocks ); 00679 virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain, 00680 std::vector<AtomicBlock3D*> atomicBlocks ); 00681 virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain, 00682 std::vector<AtomicBlock3D*> atomicBlocks ); 00683 00684 virtual void processBulk(Box3D domain, ScalarField3D<T>& field) =0; 00685 virtual void processPlane( int direction, int orientation, Box3D domain, 00686 ScalarField3D<T>& field ) =0; 00687 virtual void processEdge( int plane, int normal1, int normal2, Box3D domain, 00688 ScalarField3D<T>& field ) =0; 00689 virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain, 00690 ScalarField3D<T>& field ) =0; 00691 }; 00692 00694 template<typename T, int nDim> 00695 struct BoundedBoxProcessingFunctional3D_T : public BoundedBoxProcessingFunctional3D { 00696 virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00697 virtual void processPlaneGeneric( int direction, int orientation, Box3D domain, 00698 std::vector<AtomicBlock3D*> atomicBlocks ); 00699 virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain, 00700 std::vector<AtomicBlock3D*> atomicBlocks ); 00701 virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain, 00702 std::vector<AtomicBlock3D*> atomicBlocks ); 00703 00704 virtual void processBulk(Box3D domain, TensorField3D<T,nDim>& lattice) =0; 00705 virtual void processPlane( int direction, int orientation, Box3D domain, 00706 TensorField3D<T,nDim>& field ) =0; 00707 virtual void processEdge( int plane, int normal1, int normal2, Box3D domain, 00708 TensorField3D<T,nDim>& field ) =0; 00709 virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain, 00710 TensorField3D<T,nDim>& field ) =0; 00711 }; 00712 00714 template<typename T> 00715 struct BoundedBoxProcessingFunctional3D_N : public BoundedBoxProcessingFunctional3D { 00716 virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00717 virtual void processPlaneGeneric( int direction, int orientation, Box3D domain, 00718 std::vector<AtomicBlock3D*> atomicBlocks ); 00719 virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain, 00720 std::vector<AtomicBlock3D*> atomicBlocks ); 00721 virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain, 00722 std::vector<AtomicBlock3D*> atomicBlocks ); 00723 00724 virtual void processBulk(Box3D domain, NTensorField3D<T>& field) =0; 00725 virtual void processPlane( int direction, int orientation, Box3D domain, 00726 NTensorField3D<T>& field ) =0; 00727 virtual void processEdge( int plane, int normal1, int normal2, Box3D domain, 00728 NTensorField3D<T>& field ) =0; 00729 virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain, 00730 NTensorField3D<T>& field ) =0; 00731 }; 00732 00734 template<typename T> 00735 struct BoundedMaskedBoxProcessingFunctional3D_N : public BoundedBoxProcessingFunctional3D { 00736 virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00737 virtual void processPlaneGeneric( int direction, int orientation, Box3D domain, 00738 std::vector<AtomicBlock3D*> atomicBlocks ); 00739 virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain, 00740 std::vector<AtomicBlock3D*> atomicBlocks ); 00741 virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain, 00742 std::vector<AtomicBlock3D*> atomicBlocks ); 00743 00744 virtual void processBulk(Box3D domain, 00745 NTensorField3D<T>& field, 00746 NTensorField3D<int>& mask) =0; 00747 virtual void processPlane( int direction, int orientation, Box3D domain, 00748 NTensorField3D<T>& field, 00749 NTensorField3D<int>& mask) =0; 00750 virtual void processEdge( int plane, int normal1, int normal2, Box3D domain, 00751 NTensorField3D<T>& field, 00752 NTensorField3D<int>& mask) =0; 00753 virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain, 00754 NTensorField3D<T>& field, 00755 NTensorField3D<int>& mask) =0; 00756 }; 00757 00759 template<typename T1, template<typename U1> class Descriptor1, 00760 typename T2, template<typename U2> class Descriptor2> 00761 struct BoundedBoxProcessingFunctional3D_LL : public BoundedBoxProcessingFunctional3D { 00762 virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00763 virtual void processPlaneGeneric( int direction, int orientation, Box3D domain, 00764 std::vector<AtomicBlock3D*> atomicBlocks ); 00765 virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain, 00766 std::vector<AtomicBlock3D*> atomicBlocks ); 00767 virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain, 00768 std::vector<AtomicBlock3D*> atomicBlocks ); 00769 00770 virtual void processBulk( Box3D domain, BlockLattice3D<T1,Descriptor1>& lattice1, 00771 BlockLattice3D<T2,Descriptor2>& lattice2 ) =0; 00772 virtual void processPlane( int direction, int orientation, Box3D domain, 00773 BlockLattice3D<T1,Descriptor1>& lattice1, 00774 BlockLattice3D<T2,Descriptor2>& lattice2 ) =0; 00775 virtual void processEdge( int plane, int normal1, int normal2, Box3D domain, 00776 BlockLattice3D<T1,Descriptor1>& lattice1, 00777 BlockLattice3D<T2,Descriptor2>& lattice2 ) =0; 00778 virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain, 00779 BlockLattice3D<T1,Descriptor1>& lattice1, 00780 BlockLattice3D<T2,Descriptor2>& lattice2 ) =0; 00781 }; 00782 00784 template<typename T1, typename T2> 00785 struct BoundedBoxProcessingFunctional3D_SS : public BoundedBoxProcessingFunctional3D { 00786 virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00787 virtual void processPlaneGeneric( int direction, int orientation, Box3D domain, 00788 std::vector<AtomicBlock3D*> atomicBlocks ); 00789 virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain, 00790 std::vector<AtomicBlock3D*> atomicBlocks ); 00791 virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain, 00792 std::vector<AtomicBlock3D*> atomicBlocks ); 00793 00794 virtual void processBulk( Box3D domain, ScalarField3D<T1>& field1, 00795 ScalarField3D<T2>& field2 ) =0; 00796 virtual void processPlane( int direction, int orientation, Box3D domain, 00797 ScalarField3D<T1>& field1, 00798 ScalarField3D<T2>& field2 ) =0; 00799 virtual void processEdge( int plane, int normal1, int normal2, Box3D domain, 00800 ScalarField3D<T1>& field1, 00801 ScalarField3D<T2>& field2 ) =0; 00802 virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain, 00803 ScalarField3D<T1>& field1, 00804 ScalarField3D<T2>& field2 ) =0; 00805 }; 00806 00808 template<typename T1, int nDim1, typename T2, int nDim2> 00809 struct BoundedBoxProcessingFunctional3D_TT : public BoundedBoxProcessingFunctional3D { 00810 virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00811 virtual void processPlaneGeneric( int direction, int orientation, Box3D domain, 00812 std::vector<AtomicBlock3D*> atomicBlocks ); 00813 virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain, 00814 std::vector<AtomicBlock3D*> atomicBlocks ); 00815 virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain, 00816 std::vector<AtomicBlock3D*> atomicBlocks ); 00817 00818 virtual void processBulk( Box3D domain, TensorField3D<T1,nDim1>& field1, 00819 TensorField3D<T2,nDim2>& field2 ) =0; 00820 virtual void processPlane( int direction, int orientation, Box3D domain, 00821 TensorField3D<T1,nDim1>& field1, 00822 TensorField3D<T2,nDim2>& field2 ) =0; 00823 virtual void processEdge( int plane, int normal1, int normal2, Box3D domain, 00824 TensorField3D<T1,nDim1>& field1, 00825 TensorField3D<T2,nDim2>& field2 ) =0; 00826 virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain, 00827 TensorField3D<T1,nDim1>& field1, 00828 TensorField3D<T2,nDim2>& field2 ) =0; 00829 }; 00830 00832 template<typename T1, typename T2, int nDim> 00833 struct BoundedBoxProcessingFunctional3D_ST : public BoundedBoxProcessingFunctional3D { 00834 virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00835 virtual void processPlaneGeneric( int direction, int orientation, Box3D domain, 00836 std::vector<AtomicBlock3D*> atomicBlocks ); 00837 virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain, 00838 std::vector<AtomicBlock3D*> atomicBlocks ); 00839 virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain, 00840 std::vector<AtomicBlock3D*> atomicBlocks ); 00841 00842 virtual void processBulk( Box3D domain, ScalarField3D<T1>& field1, 00843 TensorField3D<T2,nDim>& field2 ) =0; 00844 virtual void processPlane( int direction, int orientation, Box3D domain, 00845 ScalarField3D<T1>& field1, 00846 TensorField3D<T2,nDim>& field2 ) =0; 00847 virtual void processEdge( int plane, int normal1, int normal2, Box3D domain, 00848 ScalarField3D<T1>& field1, 00849 TensorField3D<T2,nDim>& field2 ) =0; 00850 virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain, 00851 ScalarField3D<T1>& field1, 00852 TensorField3D<T2,nDim>& field2 ) =0; 00853 }; 00854 00856 template<typename T1, typename T2> 00857 struct BoundedBoxProcessingFunctional3D_NN : public BoundedBoxProcessingFunctional3D { 00858 virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00859 virtual void processPlaneGeneric( int direction, int orientation, Box3D domain, 00860 std::vector<AtomicBlock3D*> atomicBlocks ); 00861 virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain, 00862 std::vector<AtomicBlock3D*> atomicBlocks ); 00863 virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain, 00864 std::vector<AtomicBlock3D*> atomicBlocks ); 00865 00866 virtual void processBulk( Box3D domain, NTensorField3D<T1>& field1, 00867 NTensorField3D<T2>& field2 ) =0; 00868 virtual void processPlane( int direction, int orientation, Box3D domain, 00869 NTensorField3D<T1>& field1, 00870 NTensorField3D<T2>& field2 ) =0; 00871 virtual void processEdge( int plane, int normal1, int normal2, Box3D domain, 00872 NTensorField3D<T1>& field1, 00873 NTensorField3D<T2>& field2 ) =0; 00874 virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain, 00875 NTensorField3D<T1>& field1, 00876 NTensorField3D<T2>& field2 ) =0; 00877 }; 00878 00880 template<typename T1, typename T2> 00881 struct BoundedMaskedBoxProcessingFunctional3D_NN : public BoundedBoxProcessingFunctional3D { 00882 virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00883 virtual void processPlaneGeneric( int direction, int orientation, Box3D domain, 00884 std::vector<AtomicBlock3D*> atomicBlocks ); 00885 virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain, 00886 std::vector<AtomicBlock3D*> atomicBlocks ); 00887 virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain, 00888 std::vector<AtomicBlock3D*> atomicBlocks ); 00889 00890 virtual void processBulk( Box3D domain, NTensorField3D<T1>& field1, 00891 NTensorField3D<T2>& field2, 00892 NTensorField3D<int>& mask) =0; 00893 virtual void processPlane( int direction, int orientation, Box3D domain, 00894 NTensorField3D<T1>& field1, 00895 NTensorField3D<T2>& field2, 00896 NTensorField3D<int>& mask) =0; 00897 virtual void processEdge( int plane, int normal1, int normal2, Box3D domain, 00898 NTensorField3D<T1>& field1, 00899 NTensorField3D<T2>& field2, 00900 NTensorField3D<int>& mask) =0; 00901 virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain, 00902 NTensorField3D<T1>& field1, 00903 NTensorField3D<T2>& field2, 00904 NTensorField3D<int>& mask) =0; 00905 }; 00906 00908 template<typename T1, typename T2> 00909 struct BoundedBoxProcessingFunctional3D_SN : public BoundedBoxProcessingFunctional3D { 00910 virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00911 virtual void processPlaneGeneric( int direction, int orientation, Box3D domain, 00912 std::vector<AtomicBlock3D*> atomicBlocks ); 00913 virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain, 00914 std::vector<AtomicBlock3D*> atomicBlocks ); 00915 virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain, 00916 std::vector<AtomicBlock3D*> atomicBlocks ); 00917 00918 virtual void processBulk( Box3D domain, ScalarField3D<T1>& field1, 00919 NTensorField3D<T2>& field2 ) =0; 00920 virtual void processPlane( int direction, int orientation, Box3D domain, 00921 ScalarField3D<T1>& field1, 00922 NTensorField3D<T2>& field2 ) =0; 00923 virtual void processEdge( int plane, int normal1, int normal2, Box3D domain, 00924 ScalarField3D<T1>& field1, 00925 NTensorField3D<T2>& field2 ) =0; 00926 virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain, 00927 ScalarField3D<T1>& field1, 00928 NTensorField3D<T2>& field2 ) =0; 00929 }; 00930 00932 template<typename T1, template<typename U> class Descriptor, typename T2> 00933 struct BoundedBoxProcessingFunctional3D_LS : public BoundedBoxProcessingFunctional3D { 00934 virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00935 virtual void processPlaneGeneric( int direction, int orientation, Box3D domain, 00936 std::vector<AtomicBlock3D*> atomicBlocks ); 00937 virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain, 00938 std::vector<AtomicBlock3D*> atomicBlocks ); 00939 virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain, 00940 std::vector<AtomicBlock3D*> atomicBlocks ); 00941 00942 virtual void processBulk( Box3D domain, BlockLattice3D<T1,Descriptor>& lattice, 00943 ScalarField3D<T2>& field ) =0; 00944 virtual void processPlane( int direction, int orientation, Box3D domain, 00945 BlockLattice3D<T1,Descriptor>& lattice, 00946 ScalarField3D<T2>& field ) =0; 00947 virtual void processEdge( int plane, int normal1, int normal2, Box3D domain, 00948 BlockLattice3D<T1,Descriptor>& lattice, 00949 ScalarField3D<T2>& field ) =0; 00950 virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain, 00951 BlockLattice3D<T1,Descriptor>& lattice, 00952 ScalarField3D<T2>& field ) =0; 00953 }; 00954 00956 template<typename T1, template<typename U> class Descriptor, typename T2, int nDim> 00957 struct BoundedBoxProcessingFunctional3D_LT : public BoundedBoxProcessingFunctional3D { 00958 virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00959 virtual void processPlaneGeneric( int direction, int orientation, Box3D domain, 00960 std::vector<AtomicBlock3D*> atomicBlocks ); 00961 virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain, 00962 std::vector<AtomicBlock3D*> atomicBlocks ); 00963 virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain, 00964 std::vector<AtomicBlock3D*> atomicBlocks ); 00965 00966 virtual void processBulk( Box3D domain, BlockLattice3D<T1,Descriptor>& lattice, 00967 TensorField3D<T2,nDim>& field ) =0; 00968 virtual void processPlane( int direction, int orientation, Box3D domain, 00969 BlockLattice3D<T1,Descriptor>& lattice, 00970 TensorField3D<T2,nDim>& field ) =0; 00971 virtual void processEdge( int plane, int normal1, int normal2, Box3D domain, 00972 BlockLattice3D<T1,Descriptor>& lattice, 00973 TensorField3D<T2,nDim>& field ) =0; 00974 virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain, 00975 BlockLattice3D<T1,Descriptor>& lattice, 00976 TensorField3D<T2,nDim>& field ) =0; 00977 }; 00978 00980 template<typename T1, template<typename U> class Descriptor, typename T2> 00981 struct BoundedBoxProcessingFunctional3D_LN : public BoundedBoxProcessingFunctional3D { 00982 virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 00983 virtual void processPlaneGeneric( int direction, int orientation, Box3D domain, 00984 std::vector<AtomicBlock3D*> atomicBlocks ); 00985 virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain, 00986 std::vector<AtomicBlock3D*> atomicBlocks ); 00987 virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain, 00988 std::vector<AtomicBlock3D*> atomicBlocks ); 00989 00990 virtual void processBulk( Box3D domain, BlockLattice3D<T1,Descriptor>& lattice, 00991 NTensorField3D<T2>& field ) =0; 00992 virtual void processPlane( int direction, int orientation, Box3D domain, 00993 BlockLattice3D<T1,Descriptor>& lattice, 00994 NTensorField3D<T2>& field ) =0; 00995 virtual void processEdge( int plane, int normal1, int normal2, Box3D domain, 00996 BlockLattice3D<T1,Descriptor>& lattice, 00997 NTensorField3D<T2>& field ) =0; 00998 virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain, 00999 BlockLattice3D<T1,Descriptor>& lattice, 01000 NTensorField3D<T2>& field ) =0; 01001 }; 01002 01004 template<typename T1, template<typename U> class Descriptor, typename T2> 01005 struct BoundedMaskedBoxProcessingFunctional3D_LN : public BoundedBoxProcessingFunctional3D { 01006 virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 01007 virtual void processPlaneGeneric( int direction, int orientation, Box3D domain, 01008 std::vector<AtomicBlock3D*> atomicBlocks ); 01009 virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain, 01010 std::vector<AtomicBlock3D*> atomicBlocks ); 01011 virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain, 01012 std::vector<AtomicBlock3D*> atomicBlocks ); 01013 01014 virtual void processBulk( Box3D domain, BlockLattice3D<T1,Descriptor>& lattice, 01015 NTensorField3D<T2>& field, 01016 NTensorField3D<int>& mask) =0; 01017 virtual void processPlane( int direction, int orientation, Box3D domain, 01018 BlockLattice3D<T1,Descriptor>& lattice, 01019 NTensorField3D<T2>& field, 01020 NTensorField3D<int>& mask) =0; 01021 virtual void processEdge( int plane, int normal1, int normal2, Box3D domain, 01022 BlockLattice3D<T1,Descriptor>& lattice, 01023 NTensorField3D<T2>& field, 01024 NTensorField3D<int>& mask) =0; 01025 virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain, 01026 BlockLattice3D<T1,Descriptor>& lattice, 01027 NTensorField3D<T2>& field, 01028 NTensorField3D<int>& mask) =0; 01029 }; 01030 01032 template<typename T, template<typename U> class Descriptor> 01033 struct BoundedLatticeBoxProcessingFunctional3D : public BoundedBoxProcessingFunctional3D { 01034 virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 01035 virtual void processPlaneGeneric( int direction, int orientation, Box3D domain, 01036 std::vector<AtomicBlock3D*> atomicBlocks ); 01037 virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain, 01038 std::vector<AtomicBlock3D*> atomicBlocks ); 01039 virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain, 01040 std::vector<AtomicBlock3D*> atomicBlocks ); 01041 01042 virtual void processBulk(Box3D domain, std::vector<BlockLattice3D<T,Descriptor>*> lattices) =0; 01043 virtual void processPlane( int direction, int orientation, Box3D domain, 01044 std::vector<BlockLattice3D<T,Descriptor>*> lattices ) =0; 01045 virtual void processEdge( int plane, int normal1, int normal2, Box3D domain, 01046 std::vector<BlockLattice3D<T,Descriptor>*> lattices ) =0; 01047 virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain, 01048 std::vector<BlockLattice3D<T,Descriptor>*> lattices ) =0; 01049 }; 01050 01052 template<typename T> 01053 struct BoundedScalarFieldBoxProcessingFunctional3D : public BoundedBoxProcessingFunctional3D { 01054 virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 01055 virtual void processPlaneGeneric( int direction, int orientation, Box3D domain, 01056 std::vector<AtomicBlock3D*> atomicBlocks ); 01057 virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain, 01058 std::vector<AtomicBlock3D*> atomicBlocks ); 01059 virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain, 01060 std::vector<AtomicBlock3D*> atomicBlocks ); 01061 01062 virtual void processBulk(Box3D domain, std::vector<ScalarField3D<T>*> field) =0; 01063 virtual void processPlane( int direction, int orientation, Box3D domain, 01064 std::vector<ScalarField3D<T>*> field ) =0; 01065 virtual void processEdge( int plane, int normal1, int normal2, Box3D domain, 01066 std::vector<ScalarField3D<T>*> field ) =0; 01067 virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain, 01068 std::vector<ScalarField3D<T>*> field ) =0; 01069 }; 01070 01072 template<typename T, int nDim> 01073 struct BoundedTensorFieldBoxProcessingFunctional3D : public BoundedBoxProcessingFunctional3D { 01074 virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 01075 virtual void processPlaneGeneric( int direction, int orientation, Box3D domain, 01076 std::vector<AtomicBlock3D*> atomicBlocks ); 01077 virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain, 01078 std::vector<AtomicBlock3D*> atomicBlocks ); 01079 virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain, 01080 std::vector<AtomicBlock3D*> atomicBlocks ); 01081 01082 virtual void processBulk(Box3D domain, std::vector<TensorField3D<T,nDim>*> field) =0; 01083 virtual void processPlane( int direction, int orientation, Box3D domain, 01084 std::vector<TensorField3D<T,nDim>*> field ) =0; 01085 virtual void processEdge( int plane, int normal1, int normal2, Box3D domain, 01086 std::vector<TensorField3D<T,nDim>*> field ) =0; 01087 virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain, 01088 std::vector<TensorField3D<T,nDim>*> field ) =0; 01089 }; 01090 01092 template<typename T> 01093 struct BoundedNTensorFieldBoxProcessingFunctional3D : public BoundedBoxProcessingFunctional3D { 01094 virtual void processBulkGeneric(Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks); 01095 virtual void processPlaneGeneric( int direction, int orientation, Box3D domain, 01096 std::vector<AtomicBlock3D*> atomicBlocks ); 01097 virtual void processEdgeGeneric( int plane, int normal1, int normal2, Box3D domain, 01098 std::vector<AtomicBlock3D*> atomicBlocks ); 01099 virtual void processCornerGeneric( int normalX, int normalY, int normalZ, Box3D domain, 01100 std::vector<AtomicBlock3D*> atomicBlocks ); 01101 01102 virtual void processBulk(Box3D domain, std::vector<NTensorField3D<T>*> field) =0; 01103 virtual void processPlane( int direction, int orientation, Box3D domain, 01104 std::vector<NTensorField3D<T>*> field ) =0; 01105 virtual void processEdge( int plane, int normal1, int normal2, Box3D domain, 01106 std::vector<NTensorField3D<T>*> field ) =0; 01107 virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain, 01108 std::vector<NTensorField3D<T>*> field ) =0; 01109 }; 01110 01111 } // namespace plb 01112 01113 #endif // DATA_PROCESSING_FUNCTIONAL_3D_H