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

dataAnalysisFunctional3D.h

Go to the documentation of this file.
00001 /* This file is part of the Palabos library.
00002  *
00003  * Copyright (C) 2011 FlowKit Sarl
00004  * Avenue de Chailly 23
00005  * 1012 Lausanne, Switzerland
00006  * E-mail contact: contact@flowkit.com
00007  *
00008  * The most recent release of Palabos can be downloaded at 
00009  * <http://www.palabos.org/>
00010  *
00011  * The library Palabos is free software: you can redistribute it and/or
00012  * modify it under the terms of the GNU Affero General Public License as
00013  * published by the Free Software Foundation, either version 3 of the
00014  * License, or (at your option) any later version.
00015  *
00016  * The library is distributed in the hope that it will be useful,
00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019  * GNU Affero General Public License for more details.
00020  *
00021  * You should have received a copy of the GNU Affero General Public License
00022  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
00023 */
00024 
00028 #ifndef DATA_ANALYSIS_FUNCTIONAL_3D_H
00029 #define DATA_ANALYSIS_FUNCTIONAL_3D_H
00030 
00031 #include "core/globalDefs.h"
00032 #include "core/array.h"
00033 #include "atomicBlock/dataProcessingFunctional3D.h"
00034 #include "atomicBlock/reductiveDataProcessingFunctional3D.h"
00035 #include "latticeBoltzmann/geometricOperationTemplates.h"
00036 
00037 namespace plb {
00038 
00039 /* *************** PART I ******************************************** */
00040 /* *************** Analysis of the block-lattice ********************* */
00041 /* ******************************************************************* */
00042 
00043 /* *************** Reductive Data Functionals for BlockLattice ******* */
00044 
00045 template<typename T, template<typename U> class Descriptor> 
00046 class BoxSumRhoBarFunctional3D :
00047     public ReductiveBoxProcessingFunctional3D_L<T,Descriptor>
00048 {
00049 public:
00050     BoxSumRhoBarFunctional3D();
00051     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice);
00052     virtual BoxSumRhoBarFunctional3D<T,Descriptor>* clone() const;
00053     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00054         modified[0] = modif::nothing;
00055     }
00056     T getSumRhoBar() const;
00057 private:
00058     plint sumRhoBarId;
00059 };
00060 
00061 template<typename T, template<typename U> class Descriptor> 
00062 class BoxSumEnergyFunctional3D :
00063     public ReductiveBoxProcessingFunctional3D_L<T,Descriptor>
00064 {
00065 public:
00066     BoxSumEnergyFunctional3D();
00067     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice);
00068     virtual BoxSumEnergyFunctional3D<T,Descriptor>* clone() const;
00069     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00070         modified[0] = modif::nothing;
00071     }
00072     T getSumEnergy() const;
00073     virtual void getDimensionsX(std::vector<int>& dimensions) const;
00074     virtual void getDimensionsT(std::vector<int>& dimensions) const;
00075 private:
00076     plint sumEnergyId;
00077 };
00078 
00079 template<typename T, template<typename U> class Descriptor, class BoolMask> 
00080 class CountLatticeElementsFunctional3D :
00081     public ReductiveBoxProcessingFunctional3D_L<T,Descriptor>
00082 {
00083 public:
00084     CountLatticeElementsFunctional3D(BoolMask boolMask_);
00085     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice);
00086     virtual CountLatticeElementsFunctional3D<T,Descriptor,BoolMask>* clone() const;
00087     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00088         modified[0] = modif::nothing;
00089     }
00090     plint getCount() const;
00091 private:
00092     plint countId;
00093     BoolMask boolMask;
00094 };
00095 
00096 
00097 template<typename T, template<typename U> class Descriptor> 
00098 class DensitySingleProbe3D :
00099     public ReductiveBoxProcessingFunctional3D_L<T,Descriptor>
00100 {
00101 public:
00102     DensitySingleProbe3D(std::vector<Array<T,3> > const& positions_);
00103     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice);
00104     virtual DensitySingleProbe3D<T,Descriptor>* clone() const;
00105     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00106         modified[0] = modif::nothing;
00107     }
00108     std::vector<T> getDensities() const;
00109 private:
00110     std::vector<Array<T,3> > positions;
00111     std::vector<plint> densityIds;
00112 };
00113 
00114 template<typename T, template<typename U> class Descriptor> 
00115 class VelocitySingleProbe3D :
00116     public ReductiveBoxProcessingFunctional3D_L<T,Descriptor>
00117 {
00118 public:
00119     VelocitySingleProbe3D(std::vector<Array<T,3> > const& positions_);
00120     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice);
00121     virtual VelocitySingleProbe3D<T,Descriptor>* clone() const;
00122     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00123         modified[0] = modif::nothing;
00124     }
00125     std::vector<Array<T,3> > getVelocities() const;
00126 private:
00127     std::vector<Array<T,3> > positions;
00128     std::vector<Array<plint,3> > velIds;
00129 };
00130 
00131 template<typename T, template<typename U> class Descriptor> 
00132 class VorticitySingleProbe3D :
00133     public ReductiveBoxProcessingFunctional3D_L<T,Descriptor>
00134 {
00135 public:
00136     VorticitySingleProbe3D(std::vector<Array<T,3> > const& positions_);
00137     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice);
00138     virtual VorticitySingleProbe3D<T,Descriptor>* clone() const;
00139     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00140         modified[0] = modif::nothing;
00141     }
00142     std::vector<Array<T,3> > getVorticities() const;
00143 private:
00144     std::vector<Array<T,3> > positions;
00145     std::vector<Array<plint,3> > vorticityIds;
00146 };
00147 
00148 /* *************** Data Functionals for BlockLattice ***************** */
00149 
00150 template<typename T, template<typename U> class Descriptor> 
00151 class CopyPopulationsFunctional3D :
00152     public BoxProcessingFunctional3D_LL<T,Descriptor,T,Descriptor>
00153 {
00154 public:
00155     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& latticeFrom,
00156                                        BlockLattice3D<T,Descriptor>& latticeTo);
00157     virtual CopyPopulationsFunctional3D<T,Descriptor>* clone() const;
00158     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00159     virtual BlockDomain::DomainT appliesTo() const;
00160 };
00161 
00162 template<typename T1, template<typename U1> class Descriptor1, typename T2, template<typename U2> class Descriptor2> 
00163 class CopyConvertPopulationsFunctional3D : public BoxProcessingFunctional3D_LL<T1,Descriptor1,T2,Descriptor2>
00164 {
00165 public:
00166     virtual void process(Box3D domain, BlockLattice3D<T1,Descriptor1>& latticeFrom,
00167                          BlockLattice3D<T2,Descriptor2>& latticeTo);
00168     virtual CopyConvertPopulationsFunctional3D<T1,Descriptor1,T2,Descriptor2>* clone() const;
00169     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00170     virtual BlockDomain::DomainT appliesTo() const;
00171 };
00172 
00173 template<typename T, template<typename U> class Descriptor> 
00174 class LatticeCopyAllFunctional3D :
00175     public BoxProcessingFunctional3D_LL<T,Descriptor,T,Descriptor>
00176 {
00177 public:
00178     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& latticeFrom,
00179                                        BlockLattice3D<T,Descriptor>& latticeTo);
00180     virtual LatticeCopyAllFunctional3D<T,Descriptor>* clone() const;
00181     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00182     virtual BlockDomain::DomainT appliesTo() const;
00183 };
00184 
00185 template<typename T, template<typename U> class Descriptor> 
00186 class LatticeRegenerateFunctional3D :
00187     public BoxProcessingFunctional3D_LL<T,Descriptor,T,Descriptor>
00188 {
00189 public:
00190     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& latticeFrom,
00191                                        BlockLattice3D<T,Descriptor>& latticeTo);
00192     virtual LatticeRegenerateFunctional3D<T,Descriptor>* clone() const;
00193     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00194 };
00195 
00196 template<typename T, template<typename U> class Descriptor> 
00197 class BoxDensityFunctional3D : public BoxProcessingFunctional3D_LS<T,Descriptor,T>
00198 {
00199 public:
00200     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice,
00201                                        ScalarField3D<T>& scalarField);
00202     virtual BoxDensityFunctional3D<T,Descriptor>* clone() const;
00203     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00204     virtual BlockDomain::DomainT appliesTo() const;
00205 };
00206 
00207 template<typename T, template<typename U> class Descriptor> 
00208 class BoxRhoBarFunctional3D : public BoxProcessingFunctional3D_LS<T,Descriptor,T>
00209 {
00210 public:
00211     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice,
00212                                        ScalarField3D<T>& scalarField);
00213     virtual BoxRhoBarFunctional3D<T,Descriptor>* clone() const;
00214     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00215     virtual BlockDomain::DomainT appliesTo() const;
00216 };
00217 
00218 template<typename T, template<typename U> class Descriptor> 
00219 class BoxRhoBarJfunctional3D : public BoxProcessingFunctional3D
00220 {
00221 public:
00222     virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> fields);
00223     virtual BoxRhoBarJfunctional3D<T,Descriptor>* clone() const;
00224     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00225 };
00226 
00227 template<typename T, template<typename U> class Descriptor> 
00228 class PackedRhoBarJfunctional3D : public BoxProcessingFunctional3D_LN<T,Descriptor,T>
00229 {
00230 public:
00231     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice,
00232                                        NTensorField3D<T>& rhoBarJ);
00233     virtual PackedRhoBarJfunctional3D<T,Descriptor>* clone() const;
00234     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00235 };
00236 
00237 template<typename T, template<typename U> class Descriptor> 
00238 class BoxKineticEnergyFunctional3D : public BoxProcessingFunctional3D_LS<T,Descriptor,T>
00239 {
00240 public:
00241     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice,
00242                                        ScalarField3D<T>& scalarField);
00243     virtual BoxKineticEnergyFunctional3D<T,Descriptor>* clone() const;
00244     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00245     virtual BlockDomain::DomainT appliesTo() const;
00246 };
00247 
00248 template<typename T, template<typename U> class Descriptor> 
00249 class BoxVelocityNormFunctional3D : public BoxProcessingFunctional3D_LS<T,Descriptor,T>
00250 {
00251 public:
00252     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice,
00253                                        ScalarField3D<T>& scalarField);
00254     virtual BoxVelocityNormFunctional3D<T,Descriptor>* clone() const;
00255     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00256     virtual BlockDomain::DomainT appliesTo() const;
00257 };
00258 
00259 template<typename T, template<typename U> class Descriptor> 
00260 class BoxVelocityComponentFunctional3D :
00261     public BoxProcessingFunctional3D_LS<T,Descriptor,T>
00262 {
00263 public:
00264     BoxVelocityComponentFunctional3D(int iComponent);
00265     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice,
00266                                        ScalarField3D<T>& scalarField);
00267     virtual BoxVelocityComponentFunctional3D<T,Descriptor>* clone() const;
00268     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00269     virtual BlockDomain::DomainT appliesTo() const;
00270 private:
00271     int iComponent;
00272 };
00273 
00274 template<typename T, template<typename U> class Descriptor> 
00275 class BoxVelocityFunctional3D :
00276     public BoxProcessingFunctional3D_LT<T,Descriptor, T,Descriptor<T>::d>
00277 {
00278 public:
00279     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice,
00280                                        TensorField3D<T, Descriptor<T>::d>& tensorField);
00281     virtual BoxVelocityFunctional3D<T,Descriptor>* clone() const;
00282     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00283     virtual BlockDomain::DomainT appliesTo() const;
00284 };
00285 
00286 template<typename T, template<typename U> class Descriptor> 
00287 class BoxTemperatureFunctional3D : public BoxProcessingFunctional3D_LS<T,Descriptor,T>
00288 {
00289 public:
00290     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice,
00291                                        ScalarField3D<T>& scalarField);
00292     virtual BoxTemperatureFunctional3D<T,Descriptor>* clone() const;
00293     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00294     virtual BlockDomain::DomainT appliesTo() const;
00295 };
00296 
00297 template<typename T, template<typename U> class Descriptor> 
00298 class BoxDeviatoricStressFunctional3D :
00299     public BoxProcessingFunctional3D_LT<T,Descriptor, T,SymmetricTensor<T,Descriptor>::n>
00300 {
00301 public:
00302     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice,
00303                                        TensorField3D<T, SymmetricTensor<T,Descriptor>::n>& PiNeq);
00304     virtual BoxDeviatoricStressFunctional3D<T,Descriptor>* clone() const;
00305     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00306     virtual BlockDomain::DomainT appliesTo() const;
00307 };
00308 
00309 template<typename T, template<typename U> class Descriptor> 
00310 class BoxStrainRateFromStressFunctional3D :
00311     public BoxProcessingFunctional3D_LT<T,Descriptor, T,SymmetricTensor<T,Descriptor>::n>
00312 {
00313 public:
00314     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice,
00315                                        TensorField3D<T, SymmetricTensor<T,Descriptor>::n>& S);
00316     virtual BoxStrainRateFromStressFunctional3D<T,Descriptor>* clone() const;
00317     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00318     virtual BlockDomain::DomainT appliesTo() const;
00319 };
00320 
00321 template<typename T, template<typename U> class Descriptor> 
00322 class BoxPopulationFunctional3D : public BoxProcessingFunctional3D_LS<T,Descriptor,T>
00323 {
00324 public:
00325     BoxPopulationFunctional3D(plint iComponent_);
00326     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice,
00327                                        ScalarField3D<T>& population);
00328     virtual BoxPopulationFunctional3D<T,Descriptor>* clone() const;
00329     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00330     virtual BlockDomain::DomainT appliesTo() const;
00331 private:
00332     plint iComponent;
00333 };
00334 
00335 template<typename T, template<typename U> class Descriptor> 
00336 class BoxEquilibriumFunctional3D : public BoxProcessingFunctional3D_LS<T,Descriptor,T>
00337 {
00338 public:
00339     BoxEquilibriumFunctional3D(plint iComponent_);
00340     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice,
00341                                        ScalarField3D<T>& equilibrium);
00342     virtual BoxEquilibriumFunctional3D<T,Descriptor>* clone() const;
00343     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00344     virtual BlockDomain::DomainT appliesTo() const;
00345 private:
00346     plint iComponent;
00347 };
00348 
00349 template<typename T, template<typename U> class Descriptor> 
00350 class BoxAllPopulationsFunctional3D : public BoxProcessingFunctional3D_LT<T,Descriptor,T,Descriptor<T>::q>
00351 {
00352 public:
00353     BoxAllPopulationsFunctional3D();
00354     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice,
00355                                        TensorField3D<T,Descriptor<T>::q>& populations);
00356     virtual BoxAllPopulationsFunctional3D<T,Descriptor>* clone() const;
00357     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00358     virtual BlockDomain::DomainT appliesTo() const;
00359 };
00360 
00361 template<typename T, template<typename U> class Descriptor> 
00362 class BoxAllPopulationsToLatticeFunctional3D : public BoxProcessingFunctional3D_LT<T,Descriptor,T,Descriptor<T>::q>
00363 {
00364 public:
00365     BoxAllPopulationsToLatticeFunctional3D();
00366     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice,
00367                          TensorField3D<T,Descriptor<T>::q>& populations);
00368     virtual BoxAllPopulationsToLatticeFunctional3D<T,Descriptor>* clone() const;
00369     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00370     virtual BlockDomain::DomainT appliesTo() const;
00371 };
00372 
00373 template<typename T, template<typename U> class Descriptor> 
00374 class BoxOmegaFunctional3D : public BoxProcessingFunctional3D_LS<T,Descriptor,T>
00375 {
00376 public:
00377     virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& lattice,
00378                          ScalarField3D<T>& scalarField);
00379     virtual BoxOmegaFunctional3D<T,Descriptor>* clone() const;
00380     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00381     virtual BlockDomain::DomainT appliesTo() const;
00382 };
00383 
00384 /* *************** PART II ******************************************* */
00385 /* *************** Analysis of the scalar-field ********************** */
00386 /* ******************************************************************* */
00387 
00388 /* *************** Reductive Data Functionals for ScalarField ******** */
00389 
00394 template<typename T>
00395 class BoxScalarSumFunctional3D : public ReductiveBoxProcessingFunctional3D_S<T>
00396 {
00397 public:
00398     BoxScalarSumFunctional3D();
00399     virtual void process(Box3D domain, ScalarField3D<T>& scalarField);
00400     virtual BoxScalarSumFunctional3D<T>* clone() const;
00401     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00402         modified[0] = modif::nothing;
00403     }
00404     T getSumScalar() const;
00405 private:
00406     plint sumScalarId;
00407 };
00408 
00413 template<typename T>
00414 class MaskedBoxScalarAverageFunctional3D : public ReductiveBoxProcessingFunctional3D_SS<T,int>
00415 {
00416 public:
00417     MaskedBoxScalarAverageFunctional3D(int flag_);
00418     virtual void process( Box3D domain,
00419                           ScalarField3D<T>& scalarField,
00420                           ScalarField3D<int>& mask );
00421     virtual MaskedBoxScalarAverageFunctional3D<T>* clone() const;
00422     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00423         modified[0] = modif::nothing;
00424         modified[1] = modif::nothing;
00425     }
00426     T getAverageScalar() const;
00427 private:
00428     plint averageScalarId;
00429     int flag;
00430 };
00435 template<typename T>
00436 class BoxScalarMinFunctional3D : public ReductiveBoxProcessingFunctional3D_S<T>
00437 {
00438 public:
00439     BoxScalarMinFunctional3D();
00440     virtual void process(Box3D domain, ScalarField3D<T>& scalarField);
00441     virtual BoxScalarMinFunctional3D<T>* clone() const;
00442     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00443         modified[0] = modif::nothing;
00444     }
00445     T getMinScalar() const;
00446 private:
00447     plint maxScalarId;
00448 };
00449 
00454 template<typename T>
00455 class BoxScalarMaxFunctional3D : public ReductiveBoxProcessingFunctional3D_S<T>
00456 {
00457 public:
00458     BoxScalarMaxFunctional3D();
00459     virtual void process(Box3D domain, ScalarField3D<T>& scalarField);
00460     virtual BoxScalarMaxFunctional3D<T>* clone() const;
00461     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00462         modified[0] = modif::nothing;
00463     }
00464     T getMaxScalar() const;
00465 private:
00466     plint maxScalarId;
00467 };
00468 
00473 template<typename T>
00474 class BoundedBoxScalarSumFunctional3D :
00475     public BoundedReductiveBoxProcessingFunctional3D_S<T>
00476 {
00477 public:
00478     BoundedBoxScalarSumFunctional3D();
00479     virtual void processBulk(Box3D domain, ScalarField3D<T>& scalarField);
00480     virtual void processPlane( int direction, int orientation, Box3D domain,
00481                                ScalarField3D<T>& scalarField );
00482     virtual void processEdge( int plane, int normal1, int normal2,
00483                               Box3D domain, ScalarField3D<T>& scalarField );
00484     virtual void processCorner( int normalX, int normalY, int normalZ,
00485                                 Box3D domain, ScalarField3D<T>& scalarField );
00486     virtual BoundedBoxScalarSumFunctional3D<T>* clone() const;
00487     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00488         modified[0] = modif::nothing;
00489     }
00490     T getSumScalar() const;
00491 private:
00492     plint sumScalarId;
00493 };
00494 
00495 
00496 template<typename T, class BoolMask> 
00497 class CountScalarElementsFunctional3D : public ReductiveBoxProcessingFunctional3D_S<T>
00498 {
00499 public:
00500     CountScalarElementsFunctional3D(BoolMask boolMask_);
00501     virtual void process(Box3D domain, ScalarField3D<T>& field);
00502     virtual CountScalarElementsFunctional3D<T,BoolMask>* clone() const;
00503     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00504         modified[0] = modif::nothing;
00505     }
00506     plint getCount() const;
00507 private:
00508     plint countId;
00509     BoolMask boolMask;
00510 };
00511 
00512 
00513 /* *************** Data Functionals for scalar-fields **************** */
00514 
00515 template<typename T>
00516 class ComputeScalarSqrtFunctional3D : public BoxProcessingFunctional3D_SS<T,T>
00517 {
00518 public:
00519     virtual void process(Box3D domain, ScalarField3D<T>& A,
00520                                        ScalarField3D<T>& B);
00521     virtual ComputeScalarSqrtFunctional3D<T>* clone() const;
00522     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00523     virtual BlockDomain::DomainT appliesTo() const;
00524 };
00525 
00526 template<typename T>
00527 class ComputeAbsoluteValueFunctional3D : public BoxProcessingFunctional3D_SS<T,T>
00528 {
00529 public:
00530     virtual void process(Box3D domain, ScalarField3D<T>& A,
00531                                        ScalarField3D<T>& B);
00532     virtual ComputeAbsoluteValueFunctional3D<T>* clone() const;
00533     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00534     virtual BlockDomain::DomainT appliesTo() const;
00535 };
00536 
00537 template<typename T1, typename T2>
00538 class CopyConvertScalarFunctional3D : public BoxProcessingFunctional3D_SS<T1,T2>
00539 {
00540 public:
00541     virtual void process(Box3D domain, ScalarField3D<T1>& field1, ScalarField3D<T2>& field2);
00542     virtual CopyConvertScalarFunctional3D<T1,T2>* clone() const;
00543     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00544     virtual BlockDomain::DomainT appliesTo() const;
00545 };
00546 
00547 template<typename T>
00548 class ExtractScalarSubDomainFunctional3D : public BoxProcessingFunctional3D_SS<T,T>
00549 {
00550 public:
00551     virtual void process(Box3D domain, ScalarField3D<T>& field1,
00552                                        ScalarField3D<T>& field2);
00553     virtual ExtractScalarSubDomainFunctional3D<T>* clone() const;
00554     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00555     virtual BlockDomain::DomainT appliesTo() const;
00556 };
00557 
00558 template<typename T, class Function>
00559 class ApplyScalarFunctional3D : public BoxProcessingFunctional3D_S<T> {
00560 public:
00561     ApplyScalarFunctional3D(Function f_);
00562     virtual void process(Box3D domain, ScalarField3D<T>& field);
00563     virtual ApplyScalarFunctional3D<T,Function>* clone() const;
00564     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00565     virtual BlockDomain::DomainT appliesTo() const;
00566 private:
00567     Function f;
00568 };
00569 
00570 template<typename T, class EvalFunction>
00571 class EvaluateScalarFunctional3D : public BoxProcessingFunctional3D_SS<T,T> {
00572 public:
00573     EvaluateScalarFunctional3D(EvalFunction f_);
00574     virtual void process(Box3D domain, ScalarField3D<T>& field,
00575                                        ScalarField3D<T>& result);
00576     virtual EvaluateScalarFunctional3D<T,EvalFunction>* clone() const;
00577     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00578     virtual BlockDomain::DomainT appliesTo() const;
00579 private:
00580     EvalFunction f;
00581 };
00582 
00583 template<typename T>
00584 class A_plus_alpha_functional3D : public BoxProcessingFunctional3D_SS<T,T>
00585 {
00586 public:
00587     A_plus_alpha_functional3D(T alpha_);
00588     virtual void process(Box3D domain, ScalarField3D<T>& A,
00589                                        ScalarField3D<T>& result);
00590     virtual A_plus_alpha_functional3D<T>* clone() const;
00591     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00592     virtual BlockDomain::DomainT appliesTo() const;
00593 private:
00594     T alpha;
00595 
00596 };
00597 
00598 template<typename T>
00599 class A_lt_alpha_functional3D : public BoxProcessingFunctional3D_SS<T,int>
00600 {
00601 public:
00602     A_lt_alpha_functional3D(T alpha_);
00603     virtual void process(Box3D domain, ScalarField3D<T>& A,
00604                                        ScalarField3D<int>& result);
00605     virtual A_lt_alpha_functional3D<T>* clone() const;
00606     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00607     virtual BlockDomain::DomainT appliesTo() const;
00608 private:
00609     T alpha;
00610 };
00611 
00612 template<typename T>
00613 class A_gt_alpha_functional3D : public BoxProcessingFunctional3D_SS<T,int>
00614 {
00615 public:
00616     A_gt_alpha_functional3D(T alpha_);
00617     virtual void process(Box3D domain, ScalarField3D<T>& A,
00618                                        ScalarField3D<int>& result);
00619     virtual A_gt_alpha_functional3D<T>* clone() const;
00620     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00621     virtual BlockDomain::DomainT appliesTo() const;
00622 private:
00623     T alpha;
00624 };
00625 
00626 template<typename T>
00627 class A_minus_alpha_functional3D : public BoxProcessingFunctional3D_SS<T,T>
00628 {
00629 public:
00630     A_minus_alpha_functional3D(T alpha_);
00631     virtual void process(Box3D domain, ScalarField3D<T>& A,
00632                                        ScalarField3D<T>& result);
00633     virtual A_minus_alpha_functional3D<T>* clone() const;
00634     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00635     virtual BlockDomain::DomainT appliesTo() const;
00636 private:
00637     T alpha;
00638 };
00639 
00640 template<typename T>
00641 class Alpha_minus_A_functional3D : public BoxProcessingFunctional3D_SS<T,T>
00642 {
00643 public:
00644     Alpha_minus_A_functional3D(T alpha_);
00645     virtual void process(Box3D domain, ScalarField3D<T>& A,
00646                                        ScalarField3D<T>& result);
00647     virtual Alpha_minus_A_functional3D<T>* clone() const;
00648     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00649     virtual BlockDomain::DomainT appliesTo() const;
00650 private:
00651     T alpha;
00652 };
00653 
00654 template<typename T>
00655 class A_times_alpha_functional3D : public BoxProcessingFunctional3D_SS<T,T>
00656 {
00657 public:
00658     A_times_alpha_functional3D(T alpha_);
00659     virtual void process(Box3D domain, ScalarField3D<T>& A,
00660                                        ScalarField3D<T>& result);
00661     virtual A_times_alpha_functional3D<T>* clone() const;
00662     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00663     virtual BlockDomain::DomainT appliesTo() const;
00664 private:
00665     T alpha;
00666 };
00667 
00668 template<typename T>
00669 class A_dividedBy_alpha_functional3D : public BoxProcessingFunctional3D_SS<T,T>
00670 {
00671 public:
00672     A_dividedBy_alpha_functional3D(T alpha_);
00673     virtual void process(Box3D domain, ScalarField3D<T>& A,
00674                                        ScalarField3D<T>& result);
00675     virtual A_dividedBy_alpha_functional3D<T>* clone() const;
00676     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00677     virtual BlockDomain::DomainT appliesTo() const;
00678 private:
00679     T alpha;
00680 };
00681 
00682 template<typename T>
00683 class Alpha_dividedBy_A_functional3D : public BoxProcessingFunctional3D_SS<T,T>
00684 {
00685 public:
00686     Alpha_dividedBy_A_functional3D(T alpha_);
00687     virtual void process(Box3D domain, ScalarField3D<T>& A,
00688                                        ScalarField3D<T>& result);
00689     virtual Alpha_dividedBy_A_functional3D<T>* clone() const;
00690     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00691     virtual BlockDomain::DomainT appliesTo() const;
00692 private:
00693     T alpha;
00694 };
00695 
00696 template<typename T>
00697 class A_plus_alpha_inplace_functional3D : public BoxProcessingFunctional3D_S<T>
00698 {
00699 public:
00700     A_plus_alpha_inplace_functional3D(T alpha_);
00701     virtual void process(Box3D domain, ScalarField3D<T>& A);
00702     virtual A_plus_alpha_inplace_functional3D<T>* clone() const;
00703     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00704     virtual BlockDomain::DomainT appliesTo() const;
00705 private:
00706     T alpha;
00707 };
00708 
00709 template<typename T>
00710 class A_minus_alpha_inplace_functional3D : public BoxProcessingFunctional3D_S<T>
00711 {
00712 public:
00713     A_minus_alpha_inplace_functional3D(T alpha_);
00714     virtual void process(Box3D domain, ScalarField3D<T>& A);
00715     virtual A_minus_alpha_inplace_functional3D<T>* clone() const;
00716     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00717     virtual BlockDomain::DomainT appliesTo() const;
00718 private:
00719     T alpha;
00720 };
00721 
00722 template<typename T>
00723 class A_times_alpha_inplace_functional3D : public BoxProcessingFunctional3D_S<T>
00724 {
00725 public:
00726     A_times_alpha_inplace_functional3D(T alpha_);
00727     virtual void process(Box3D domain, ScalarField3D<T>& A);
00728     virtual A_times_alpha_inplace_functional3D<T>* clone() const;
00729     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00730     virtual BlockDomain::DomainT appliesTo() const;
00731 private:
00732     T alpha;
00733 };
00734 
00735 template<typename T>
00736 class A_dividedBy_alpha_inplace_functional3D : public BoxProcessingFunctional3D_S<T>
00737 {
00738 public:
00739     A_dividedBy_alpha_inplace_functional3D(T alpha_);
00740     virtual void process(Box3D domain, ScalarField3D<T>& A);
00741     virtual A_dividedBy_alpha_inplace_functional3D<T>* clone() const;
00742     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00743     virtual BlockDomain::DomainT appliesTo() const;
00744 private:
00745     T alpha;
00746 };
00747 
00748 
00749 template<typename T>
00750 class A_lt_B_functional3D : public BoxProcessingFunctional3D
00751 {
00752 public:
00753     virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> scalarFields);
00754     virtual A_lt_B_functional3D<T>* clone() const;
00755     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00756     virtual BlockDomain::DomainT appliesTo() const;
00757 };
00758 
00759 template<typename T>
00760 class A_gt_B_functional3D : public BoxProcessingFunctional3D
00761 {
00762 public:
00763     virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> scalarFields);
00764     virtual A_gt_B_functional3D<T>* clone() const;
00765     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00766     virtual BlockDomain::DomainT appliesTo() const;
00767 };
00768 
00769 template<typename T>
00770 class A_plus_B_functional3D : public ScalarFieldBoxProcessingFunctional3D<T>
00771 {
00772 public:
00773     virtual void process(Box3D domain, std::vector<ScalarField3D<T>*> scalarFields);
00774     virtual A_plus_B_functional3D<T>* clone() const;
00775     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00776     virtual BlockDomain::DomainT appliesTo() const;
00777 };
00778 
00779 template<typename T>
00780 class A_minus_B_functional3D : public ScalarFieldBoxProcessingFunctional3D<T>
00781 {
00782 public:
00783     virtual void process(Box3D domain, std::vector<ScalarField3D<T>*> scalarFields);
00784     virtual A_minus_B_functional3D<T>* clone() const;
00785     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00786     virtual BlockDomain::DomainT appliesTo() const;
00787 };
00788 
00789 template<typename T>
00790 class A_times_B_functional3D : public ScalarFieldBoxProcessingFunctional3D<T>
00791 {
00792 public:
00793     virtual void process(Box3D domain, std::vector<ScalarField3D<T>*> scalarFields);
00794     virtual A_times_B_functional3D<T>* clone() const;
00795     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00796     virtual BlockDomain::DomainT appliesTo() const;
00797 };
00798 
00799 template<typename T>
00800 class A_dividedBy_B_functional3D : public ScalarFieldBoxProcessingFunctional3D<T>
00801 {
00802 public:
00803     virtual void process(Box3D domain, std::vector<ScalarField3D<T>*> scalarFields);
00804     virtual A_dividedBy_B_functional3D<T>* clone() const;
00805     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00806     virtual BlockDomain::DomainT appliesTo() const;
00807 };
00808 
00809 template<typename T>
00810 class A_plus_B_inplace_functional3D : public BoxProcessingFunctional3D_SS<T,T>
00811 {
00812 public:
00813     virtual void process(Box3D domain, ScalarField3D<T>& A, ScalarField3D<T>& B);
00814     virtual A_plus_B_inplace_functional3D<T>* clone() const;
00815     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00816     virtual BlockDomain::DomainT appliesTo() const;
00817 };
00818 
00819 template<typename T>
00820 class A_minus_B_inplace_functional3D : public BoxProcessingFunctional3D_SS<T,T>
00821 {
00822 public:
00823     virtual void process(Box3D domain, ScalarField3D<T>& A, ScalarField3D<T>& B);
00824     virtual A_minus_B_inplace_functional3D<T>* clone() const;
00825     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00826     virtual BlockDomain::DomainT appliesTo() const;
00827 };
00828 
00829 template<typename T>
00830 class A_times_B_inplace_functional3D : public BoxProcessingFunctional3D_SS<T,T>
00831 {
00832 public:
00833     virtual void process(Box3D domain, ScalarField3D<T>& A, ScalarField3D<T>& B);
00834     virtual A_times_B_inplace_functional3D<T>* clone() const;
00835     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00836     virtual BlockDomain::DomainT appliesTo() const;
00837 };
00838 
00839 template<typename T>
00840 class A_dividedBy_B_inplace_functional3D : public BoxProcessingFunctional3D_SS<T,T>
00841 {
00842 public:
00843     virtual void process(Box3D domain, ScalarField3D<T>& A, ScalarField3D<T>& B);
00844     virtual A_dividedBy_B_inplace_functional3D<T>* clone() const;
00845     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00846     virtual BlockDomain::DomainT appliesTo() const;
00847 };
00848 
00849 
00850 /* *************** PART III ****************************************** */
00851 /* *************** Analysis of the tensor-field ********************** */
00852 /* ******************************************************************* */
00853 
00854 template<typename T, int nDim>
00855 class ComputeTensorSqrtFunctional3D : public BoxProcessingFunctional3D_TT<T,nDim,T,nDim>
00856 {
00857 public:
00858     virtual void process(Box3D domain, TensorField3D<T,nDim>& A,
00859                                        TensorField3D<T,nDim>& B);
00860     virtual ComputeTensorSqrtFunctional3D<T,nDim>* clone() const;
00861     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00862     virtual BlockDomain::DomainT appliesTo() const;
00863 };
00864 
00865 template<typename T, int nDim, class BoolMask> 
00866 class CountTensorElementsFunctional3D :
00867     public ReductiveBoxProcessingFunctional3D_T<T,nDim>
00868 {
00869 public:
00870     CountTensorElementsFunctional3D(BoolMask boolMask_);
00871     virtual void process(Box3D domain, TensorField3D<T,nDim>& field);
00872     virtual CountTensorElementsFunctional3D<T,nDim,BoolMask>* clone() const;
00873     plint getCount() const;
00874 private:
00875     plint countId;
00876     BoolMask boolMask;
00877 };
00878 
00879 template<typename T1, typename T2, int nDim>
00880 class CopyConvertTensorFunctional3D : public BoxProcessingFunctional3D_TT<T1,nDim,T2,nDim>
00881 {
00882 public:
00883     virtual void process(Box3D domain, TensorField3D<T1,nDim>& field1, TensorField3D<T2,nDim>& field2);
00884     virtual CopyConvertTensorFunctional3D<T1,T2,nDim>* clone() const;
00885     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00886     virtual BlockDomain::DomainT appliesTo() const;
00887 };
00888 
00889 template<typename T, int nDim>
00890 class ExtractTensorSubDomainFunctional3D :
00891     public BoxProcessingFunctional3D_TT<T,nDim,T,nDim>
00892 {
00893 public:
00894     virtual void process(Box3D domain, TensorField3D<T,nDim>& field1,
00895                                        TensorField3D<T,nDim>& field2);
00896     virtual ExtractTensorSubDomainFunctional3D<T,nDim>* clone() const;
00897     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00898     virtual BlockDomain::DomainT appliesTo() const;
00899 };
00900 
00901 template<typename T, int nDim>
00902 class ExtractTensorComponentFunctional3D :
00903     public BoxProcessingFunctional3D_ST<T,T,nDim>
00904 {
00905 public:
00906     ExtractTensorComponentFunctional3D(int iComponent_);
00907     virtual void process(Box3D domain, ScalarField3D<T>& scalarField,
00908                                        TensorField3D<T,nDim>& tensorField );
00909     virtual ExtractTensorComponentFunctional3D<T,nDim>* clone() const;
00910     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00911     virtual BlockDomain::DomainT appliesTo() const;
00912 private:
00913     int iComponent;
00914 };
00915 
00916 template<typename T, int nDim>
00917 class ComputeNormFunctional3D : public BoxProcessingFunctional3D_ST<T,T,nDim>
00918 {
00919 public:
00920     virtual void process(Box3D domain, ScalarField3D<T>& scalarField,
00921                                        TensorField3D<T,nDim>& tensorField);
00922     virtual ComputeNormFunctional3D<T,nDim>* clone() const;
00923     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00924     virtual BlockDomain::DomainT appliesTo() const;
00925 };
00926 
00927 template<typename T, int nDim>
00928 class ComputeNormSqrFunctional3D : public BoxProcessingFunctional3D_ST<T,T,nDim>
00929 {
00930 public:
00931     virtual void process(Box3D domain, ScalarField3D<T>& scalarField,
00932                                        TensorField3D<T,nDim>& tensorField);
00933     virtual ComputeNormSqrFunctional3D<T,nDim>* clone() const;
00934     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00935     virtual BlockDomain::DomainT appliesTo() const;
00936 };
00937 
00938 template<typename T>
00939 class ComputeSymmetricTensorNormFunctional3D :
00940     public BoxProcessingFunctional3D_ST<T,T,6>
00941 {
00942 public:
00943     virtual void process(Box3D domain, ScalarField3D<T>& scalarField,
00944                                        TensorField3D<T,6>& tensorField);
00945     virtual ComputeSymmetricTensorNormFunctional3D<T>* clone() const;
00946     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00947     virtual BlockDomain::DomainT appliesTo() const;
00948 };
00949 
00950 template<typename T>
00951 class ComputeSymmetricTensorNormSqrFunctional3D :
00952     public BoxProcessingFunctional3D_ST<T,T,6>
00953 {
00954 public:
00955     virtual void process(Box3D domain, ScalarField3D<T>& scalarField,
00956                                        TensorField3D<T,6>& tensorField);
00957     virtual ComputeSymmetricTensorNormSqrFunctional3D<T>* clone() const;
00958     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00959     virtual BlockDomain::DomainT appliesTo() const;
00960 };
00961 
00962 template<typename T>
00963 class ComputeSymmetricTensorTraceFunctional3D :
00964     public BoxProcessingFunctional3D_ST<T,T,6>
00965 {
00966 public:
00967     virtual void process(Box3D domain, ScalarField3D<T>& scalarField,
00968                                        TensorField3D<T,6>& tensorField);
00969     virtual ComputeSymmetricTensorTraceFunctional3D<T>* clone() const;
00970     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00971     virtual BlockDomain::DomainT appliesTo() const;
00972 };
00973 
00974 template<typename T>
00975 class BoxBulkGradientFunctional3D :
00976     public BoxProcessingFunctional3D_ST<T,T,3>
00977 {
00978 public:
00979     virtual void process(Box3D domain, ScalarField3D<T>& phi,
00980                                        TensorField3D<T,3>& gradient);
00981     virtual BoxBulkGradientFunctional3D<T>* clone() const;
00982     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00983     virtual BlockDomain::DomainT appliesTo() const;
00984 };
00985 
00986 template<typename T>
00987 class BoxGradientFunctional3D :
00988     public BoundedBoxProcessingFunctional3D_ST<T,T,3>
00989 {
00990 public:
00991     virtual void processBulk( Box3D domain, ScalarField3D<T>& phi,
00992                                             TensorField3D<T,3>& gradient );
00993     virtual void processPlane( int direction, int orientation, Box3D domain,
00994                                ScalarField3D<T>& phi,
00995                                TensorField3D<T,3>& gradient );
00996     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
00997                               ScalarField3D<T>& phi,
00998                               TensorField3D<T,3>& gradient );
00999     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
01000                                 ScalarField3D<T>& phi,
01001                                 TensorField3D<T,3>& gradient );
01002     virtual BoxGradientFunctional3D<T>* clone() const;
01003     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01004     virtual BlockDomain::DomainT appliesTo() const;
01005 };
01006 
01007 template<typename T, int nDim>
01008 class BoxBulkVorticityFunctional3D :
01009     public BoxProcessingFunctional3D_TT<T,nDim,T,nDim>
01010 {
01011 public:
01012     virtual void process(Box3D domain, TensorField3D<T,nDim>& velocity,
01013                                        TensorField3D<T,nDim>& vorticity);
01014     virtual BoxBulkVorticityFunctional3D<T,nDim>* clone() const;
01015     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01016     virtual BlockDomain::DomainT appliesTo() const;
01017 };
01018 
01019 template<typename T, int nDim>
01020 class BoxVorticityFunctional3D :
01021     public BoundedBoxProcessingFunctional3D_TT<T,nDim,T,nDim>
01022 {
01023 public:
01024     virtual void processBulk( Box3D domain, TensorField3D<T,nDim>& velocity,
01025                                             TensorField3D<T,nDim>& vorticity );
01026     virtual void processPlane( int direction, int orientation, Box3D domain,
01027                                TensorField3D<T,nDim>& velocity,
01028                                TensorField3D<T,nDim>& vorticity );
01029     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
01030                               TensorField3D<T,nDim>& velocity,
01031                               TensorField3D<T,nDim>& vorticity );
01032     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
01033                                 TensorField3D<T,nDim>& velocity,
01034                                 TensorField3D<T,nDim>& vorticity );
01035     virtual BoxVorticityFunctional3D<T,nDim>* clone() const;
01036     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01037     virtual BlockDomain::DomainT appliesTo() const;
01038 };
01039 
01040 template<typename T, int nDim>
01041 class BoxBulkStrainRateFunctional3D :
01042     public BoxProcessingFunctional3D_TT<T,nDim,T,SymmetricTensorImpl<T,nDim>::n>
01043 {
01044 public:
01045     virtual void process(Box3D domain, TensorField3D<T,nDim>& velocity,
01046                                        TensorField3D<T,SymmetricTensorImpl<T,nDim>::n>& S);
01047     virtual BoxBulkStrainRateFunctional3D<T,nDim>* clone() const;
01048     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01049     virtual BlockDomain::DomainT appliesTo() const;
01050 };
01051 
01052 template<typename T, int nDim>
01053 class BoxStrainRateFunctional3D :
01054     public BoundedBoxProcessingFunctional3D_TT<T,nDim,T,SymmetricTensorImpl<T,nDim>::n>
01055 {
01056 public:
01057     virtual void processBulk( Box3D domain, TensorField3D<T,nDim>& velocity,
01058                                             TensorField3D<T,SymmetricTensorImpl<T,nDim>::n>& S );
01059     virtual void processPlane( int direction, int orientation, Box3D domain,
01060                                TensorField3D<T,nDim>& velocity,
01061                                TensorField3D<T,SymmetricTensorImpl<T,nDim>::n>& S );
01062     virtual void processEdge( int plane, int normal1, int normal2, Box3D domain,
01063                               TensorField3D<T,nDim>& velocity,
01064                               TensorField3D<T,SymmetricTensorImpl<T,nDim>::n>& S );
01065     virtual void processCorner( int normalX, int normalY, int normalZ, Box3D domain,
01066                                 TensorField3D<T,nDim>& velocity,
01067                                 TensorField3D<T,SymmetricTensorImpl<T,nDim>::n>& S );
01068     virtual BoxStrainRateFunctional3D<T,nDim>* clone() const;
01069     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01070     virtual BlockDomain::DomainT appliesTo() const;
01071 };
01072 
01073 template<typename T>
01074 class BoxQcriterionFunctional3D : public BoxProcessingFunctional3D
01075 {
01076 public:
01077     virtual void processGenericBlocks(Box3D domain, std::vector<AtomicBlock3D*> fields);
01078     virtual BoxQcriterionFunctional3D<T>* clone() const;
01079     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01080     virtual BlockDomain::DomainT appliesTo() const;
01081 };
01082 
01083 template<typename T, int nDim>
01084 class BoxBulkDivergenceFunctional3D :
01085     public BoxProcessingFunctional3D_ST<T,T,nDim>
01086 {
01087 public:
01088     virtual void process(Box3D domain, ScalarField3D<T>& divergence,
01089                                        TensorField3D<T,nDim>& velocity);
01090     virtual BoxBulkDivergenceFunctional3D<T,nDim>* clone() const;
01091     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01092     virtual BlockDomain::DomainT appliesTo() const;
01093 };
01094 
01095 template<typename T, int nDim>
01096 class Tensor_A_plus_B_functional3D : public TensorFieldBoxProcessingFunctional3D<T,nDim>
01097 {
01098 public:
01099     virtual void process(Box3D domain, std::vector<TensorField3D<T,nDim>*> tensorFields);
01100     virtual Tensor_A_plus_B_functional3D<T,nDim>* clone() const;
01101     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01102     virtual BlockDomain::DomainT appliesTo() const;
01103 };
01104 
01105 template<typename T, int nDim>
01106 class Tensor_A_minus_B_functional3D : public TensorFieldBoxProcessingFunctional3D<T,nDim>
01107 {
01108 public:
01109     virtual void process(Box3D domain, std::vector<TensorField3D<T,nDim>*> tensorFields);
01110     virtual Tensor_A_minus_B_functional3D<T,nDim>* clone() const;
01111     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01112     virtual BlockDomain::DomainT appliesTo() const;
01113 };
01114 
01115 template<typename T, int nDim>
01116 class Tensor_A_times_B_functional3D : public TensorFieldBoxProcessingFunctional3D<T,nDim>
01117 {
01118 public:
01119     virtual void process(Box3D domain, std::vector<TensorField3D<T,nDim>*> tensorFields);
01120     virtual Tensor_A_times_B_functional3D<T,nDim>* clone() const;
01121     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01122     virtual BlockDomain::DomainT appliesTo() const;
01123 };
01124 
01125 template<typename T, int nDim>
01126 class Tensor_A_dividedBy_B_functional3D : public TensorFieldBoxProcessingFunctional3D<T,nDim>
01127 {
01128 public:
01129     virtual void process(Box3D domain, std::vector<TensorField3D<T,nDim>*> tensorFields);
01130     virtual Tensor_A_dividedBy_B_functional3D<T,nDim>* clone() const;
01131     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01132     virtual BlockDomain::DomainT appliesTo() const;
01133 };
01134 
01135 template<typename T, int nDim>
01136 class Tensor_A_plus_B_inplace_functional3D :
01137     public BoxProcessingFunctional3D_TT<T,nDim,T,nDim>
01138 {
01139 public:
01140     virtual void process(Box3D domain, TensorField3D<T,nDim>& A,
01141                                        TensorField3D<T,nDim>& B);
01142     virtual Tensor_A_plus_B_inplace_functional3D<T,nDim>* clone() const;
01143     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01144     virtual BlockDomain::DomainT appliesTo() const;
01145 };
01146 
01147 template<typename T, int nDim>
01148 class Tensor_A_minus_B_inplace_functional3D :
01149     public BoxProcessingFunctional3D_TT<T,nDim,T,nDim>
01150 {
01151 public:
01152     virtual void process(Box3D domain, TensorField3D<T,nDim>& A,
01153                                        TensorField3D<T,nDim>& B);
01154     virtual Tensor_A_minus_B_inplace_functional3D<T,nDim>* clone() const;
01155     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01156     virtual BlockDomain::DomainT appliesTo() const;
01157 };
01158 
01159 template<typename T, int nDim>
01160 class Tensor_A_times_B_inplace_functional3D :
01161     public BoxProcessingFunctional3D_TT<T,nDim,T,nDim>
01162 {
01163 public:
01164     virtual void process(Box3D domain, TensorField3D<T,nDim>& A,
01165                                        TensorField3D<T,nDim>& B);
01166     virtual Tensor_A_times_B_inplace_functional3D<T,nDim>* clone() const;
01167     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01168     virtual BlockDomain::DomainT appliesTo() const;
01169 };
01170 
01171 template<typename T, int nDim>
01172 class Tensor_A_times_alpha_functional3D : public BoxProcessingFunctional3D_TT<T,nDim,T,nDim>
01173 {
01174 public:
01175     Tensor_A_times_alpha_functional3D(T alpha_);
01176     virtual void process(Box3D domain, TensorField3D<T,nDim>& A,
01177                                        TensorField3D<T,nDim>& result);
01178     virtual Tensor_A_times_alpha_functional3D<T,nDim>* clone() const;
01179     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01180     virtual BlockDomain::DomainT appliesTo() const;
01181 private:
01182     T alpha;
01183 };
01184 
01185 template<typename T, int nDim>
01186 class Tensor_A_times_alpha_inplace_functional3D :
01187     public BoxProcessingFunctional3D_T<T,nDim>
01188 {
01189 public:
01190     Tensor_A_times_alpha_inplace_functional3D(T alpha_);
01191     virtual void process(Box3D domain, TensorField3D<T,nDim>& A);
01192     virtual Tensor_A_times_alpha_inplace_functional3D<T,nDim>* clone() const;
01193     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01194     virtual BlockDomain::DomainT appliesTo() const;
01195 private:
01196     T alpha;
01197 };
01198 
01199 template<typename T, int nDim>
01200 class Tensor_A_dividedBy_B_inplace_functional3D :
01201     public BoxProcessingFunctional3D_TT<T,nDim,T,nDim>
01202 {
01203 public:
01204     virtual void process(Box3D domain, TensorField3D<T,nDim>& A,
01205                                        TensorField3D<T,nDim>& B);
01206     virtual Tensor_A_dividedBy_B_inplace_functional3D<T,nDim>* clone() const;
01207     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01208     virtual BlockDomain::DomainT appliesTo() const;
01209 };
01210 
01211 /* ************* Class LBMsmoothen3D ******************* */
01212 
01213 template<typename T, template<typename U> class Descriptor>
01214 class LBMsmoothen3D : public BoxProcessingFunctional3D_SS<T,T>
01215 {
01216 public:
01217     virtual void process(Box3D domain,
01218                          ScalarField3D<T>& data, ScalarField3D<T>& result);
01219     virtual LBMsmoothen3D<T,Descriptor>* clone() const;
01220     virtual BlockDomain::DomainT appliesTo() const;
01221     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01222 };
01223 
01224 }  // namespace plb
01225 
01226 #endif  // DATA_ANALYSIS_FUNCTIONAL_3D_H
01227 
01228 // Explicitly include generic algorithms which are never precompiled (not even in precompiled version)
01229 #include "dataProcessors/dataAnalysisGenerics3D.h"
01230