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

dataAnalysisFunctional2D.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_2D_H
00029 #define DATA_ANALYSIS_FUNCTIONAL_2D_H
00030 
00031 #include "core/globalDefs.h"
00032 #include "atomicBlock/dataProcessingFunctional2D.h"
00033 #include "atomicBlock/reductiveDataProcessingFunctional2D.h"
00034 #include "latticeBoltzmann/geometricOperationTemplates.h"
00035 
00036 namespace plb {
00037 
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 BoxSumRhoBarFunctional2D : public ReductiveBoxProcessingFunctional2D_L<T,Descriptor>
00047 {
00048 public:
00049     BoxSumRhoBarFunctional2D();
00050     virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& lattice);
00051     virtual BoxSumRhoBarFunctional2D<T,Descriptor>* clone() const;
00052     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00053         modified[0] = modif::nothing;
00054     }
00055     T getSumRhoBar() const;
00056 private:
00057     plint sumRhoBarId;
00058 };
00059 
00060 template<typename T, template<typename U> class Descriptor> 
00061 class BoxSumEnergyFunctional2D : public ReductiveBoxProcessingFunctional2D_L<T,Descriptor>
00062 {
00063 public:
00064     BoxSumEnergyFunctional2D();
00065     virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& lattice);
00066     virtual BoxSumEnergyFunctional2D<T,Descriptor>* clone() const;
00067     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00068         modified[0] = modif::nothing;
00069     }
00070     T getSumEnergy() const;
00071     virtual void getDimensionsX(std::vector<int>& dimensions) const;
00072     virtual void getDimensionsT(std::vector<int>& dimensions) const;
00073 private:
00074     plint sumEnergyId;
00075 };
00076 
00077 template<typename T, template<typename U> class Descriptor, class BoolMask> 
00078 class CountLatticeElementsFunctional2D : public ReductiveBoxProcessingFunctional2D_L<T,Descriptor>
00079 {
00080 public:
00081     CountLatticeElementsFunctional2D(BoolMask boolMask_);
00082     virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& lattice);
00083     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00084         modified[0] = modif::nothing;
00085     }
00086     virtual CountLatticeElementsFunctional2D<T,Descriptor,BoolMask>* clone() const;
00087     plint getCount() const;
00088 private:
00089     plint countId;
00090     BoolMask boolMask;
00091 };
00092 
00093 
00094 /* *************** Data Functionals for BlockLattice ***************** */
00095 
00096 template<typename T, template<typename U> class Descriptor> 
00097 class CopyPopulationsFunctional2D :
00098     public BoxProcessingFunctional2D_LL<T,Descriptor,T,Descriptor>
00099 {
00100 public:
00101     virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& latticeFrom,
00102                                        BlockLattice2D<T,Descriptor>& latticeTo);
00103     virtual CopyPopulationsFunctional2D<T,Descriptor>* clone() const;
00104     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00105 };
00106 
00107 template<typename T1, template<typename U1> class Descriptor1, typename T2, template<typename U2> class Descriptor2>
00108 class CopyConvertPopulationsFunctional2D :
00109 public BoxProcessingFunctional2D_LL<T1,Descriptor1,T2,Descriptor2>
00110 {
00111 public:
00112     virtual void process(Box2D domain, BlockLattice2D<T1,Descriptor1>& latticeFrom,
00113                                        BlockLattice2D<T2,Descriptor2>& latticeTo);
00114     virtual CopyConvertPopulationsFunctional2D<T1,Descriptor1,T2,Descriptor2>* clone() const;
00115     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00116 };
00117 
00118 template<typename T, template<typename U> class Descriptor> 
00119 class LatticeCopyAllFunctional2D :
00120     public BoxProcessingFunctional2D_LL<T,Descriptor,T,Descriptor>
00121 {
00122 public:
00123     virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& latticeFrom,
00124                                        BlockLattice2D<T,Descriptor>& latticeTo);
00125     virtual LatticeCopyAllFunctional2D<T,Descriptor>* clone() const;
00126     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00127     virtual BlockDomain::DomainT appliesTo() const;
00128 };
00129 
00130 template<typename T, template<typename U> class Descriptor> 
00131 class LatticeRegenerateFunctional2D :
00132     public BoxProcessingFunctional2D_LL<T,Descriptor,T,Descriptor>
00133 {
00134 public:
00135     virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& latticeFrom,
00136                                        BlockLattice2D<T,Descriptor>& latticeTo);
00137     virtual LatticeRegenerateFunctional2D<T,Descriptor>* clone() const;
00138     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00139 };
00140 
00141 
00142 template<typename T, template<typename U> class Descriptor> 
00143 class BoxDensityFunctional2D : public BoxProcessingFunctional2D_LS<T,Descriptor,T>
00144 {
00145 public:
00146     virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& lattice,
00147                                        ScalarField2D<T>& scalarField);
00148     virtual BoxDensityFunctional2D<T,Descriptor>* clone() const;
00149     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00150     virtual BlockDomain::DomainT appliesTo() const;
00151 };
00152 
00153 template<typename T, template<typename U> class Descriptor> 
00154 class BoxRhoBarFunctional2D : public BoxProcessingFunctional2D_LS<T,Descriptor,T>
00155 {
00156 public:
00157     virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& lattice,
00158                                        ScalarField2D<T>& scalarField);
00159     virtual BoxRhoBarFunctional2D<T,Descriptor>* clone() const;
00160     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00161     virtual BlockDomain::DomainT appliesTo() const;
00162 };
00163 
00164 template<typename T, template<typename U> class Descriptor> 
00165 class BoxRhoBarJfunctional2D : public BoxProcessingFunctional2D
00166 {
00167 public:
00168     virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> fields);
00169     virtual BoxRhoBarJfunctional2D<T,Descriptor>* clone() const;
00170     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00171 };
00172 
00173 template<typename T, template<typename U> class Descriptor> 
00174 class PackedRhoBarJfunctional2D : public BoxProcessingFunctional2D_LN<T,Descriptor,T>
00175 {
00176 public:
00177     virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& lattice,
00178                                        NTensorField2D<T>& rhoBarJ);
00179     virtual PackedRhoBarJfunctional2D<T,Descriptor>* clone() const;
00180     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00181 };
00182 
00183 template<typename T, template<typename U> class Descriptor> 
00184 class BoxKineticEnergyFunctional2D : public BoxProcessingFunctional2D_LS<T,Descriptor,T>
00185 {
00186 public:
00187     virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& lattice,
00188                                        ScalarField2D<T>& scalarField);
00189     virtual BoxKineticEnergyFunctional2D<T,Descriptor>* clone() const;
00190     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00191     virtual BlockDomain::DomainT appliesTo() const;
00192 };
00193 
00194 template<typename T, template<typename U> class Descriptor> 
00195 class BoxVelocityNormFunctional2D : public BoxProcessingFunctional2D_LS<T,Descriptor,T>
00196 {
00197 public:
00198     virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& lattice,
00199                                        ScalarField2D<T>& scalarField);
00200     virtual BoxVelocityNormFunctional2D<T,Descriptor>* clone() const;
00201     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00202     virtual BlockDomain::DomainT appliesTo() const;
00203 };
00204 
00205 template<typename T, template<typename U> class Descriptor> 
00206 class BoxVelocityComponentFunctional2D :
00207         public BoxProcessingFunctional2D_LS<T,Descriptor,T>
00208 {
00209 public:
00210     BoxVelocityComponentFunctional2D(int iComponent_);
00211     virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& lattice,
00212                                        ScalarField2D<T>& scalarField);
00213     virtual BoxVelocityComponentFunctional2D<T,Descriptor>* clone() const;
00214     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00215     virtual BlockDomain::DomainT appliesTo() const;
00216 private:
00217     int iComponent;
00218 };
00219 
00220 template<typename T, template<typename U> class Descriptor> 
00221 class BoxVelocityFunctional2D :
00222     public BoxProcessingFunctional2D_LT<T,Descriptor, T,Descriptor<T>::d>
00223 {
00224 public:
00225     virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& lattice,
00226                                        TensorField2D<T,Descriptor<T>::d>& tensorField);
00227     virtual BoxVelocityFunctional2D<T,Descriptor>* clone() const;
00228     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00229     virtual BlockDomain::DomainT appliesTo() const;
00230 };
00231 
00232 template<typename T, template<typename U> class Descriptor> 
00233 class BoxDeviatoricStressFunctional2D :
00234     public BoxProcessingFunctional2D_LT<T,Descriptor, T,SymmetricTensor<T,Descriptor>::n>
00235 {
00236 public:
00237     virtual void process(Box2D domain,
00238                          BlockLattice2D<T,Descriptor>& lattice,
00239                          TensorField2D<T, SymmetricTensor<T,Descriptor>::n>& PiNeq);
00240     virtual BoxDeviatoricStressFunctional2D<T,Descriptor>* clone() const;
00241     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00242     virtual BlockDomain::DomainT appliesTo() const;
00243 };
00244 
00245 template<typename T, template<typename U> class Descriptor> 
00246 class BoxStrainRateFromStressFunctional2D :
00247     public BoxProcessingFunctional2D_LT<T,Descriptor, T,SymmetricTensor<T,Descriptor>::n>
00248 {
00249 public:
00250     virtual void process(Box2D domain,
00251                          BlockLattice2D<T,Descriptor>& lattice,
00252                          TensorField2D<T, SymmetricTensor<T,Descriptor>::n>& S);
00253     virtual BoxStrainRateFromStressFunctional2D<T,Descriptor>* clone() const;
00254     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00255     virtual BlockDomain::DomainT appliesTo() const;
00256 };
00257 
00258 template<typename T, template<typename U> class Descriptor> 
00259 class BoxTemperatureFunctional2D : public BoxProcessingFunctional2D_LS<T,Descriptor,T>
00260 {
00261 public:
00262     virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& lattice,
00263                                        ScalarField2D<T>& scalarField);
00264     virtual BoxTemperatureFunctional2D<T,Descriptor>* clone() const;
00265     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00266     virtual BlockDomain::DomainT appliesTo() const;
00267 };
00268 
00269 template<typename T, template<typename U> class Descriptor> 
00270 class BoxSoundSpeedFunctional2D : public BoxProcessingFunctional2D_LS<T,Descriptor,T>
00271 {
00272 public:
00273     virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& lattice,
00274                                        ScalarField2D<T>& scalarField);
00275     virtual BoxSoundSpeedFunctional2D<T,Descriptor>* clone() const;
00276     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00277     virtual BlockDomain::DomainT appliesTo() const;
00278 };
00279 
00280 template<typename T, template<typename U> class Descriptor> 
00281 class BoxPopulationFunctional2D : public BoxProcessingFunctional2D_LS<T,Descriptor,T>
00282 {
00283 public:
00284     BoxPopulationFunctional2D(plint iComponent_);
00285     virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& lattice,
00286                                        ScalarField2D<T>& population);
00287     virtual BoxPopulationFunctional2D<T,Descriptor>* clone() const;
00288     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00289     virtual BlockDomain::DomainT appliesTo() const;
00290 private:
00291     plint iComponent;
00292 };
00293 
00294 template<typename T, template<typename U> class Descriptor> 
00295 class BoxEquilibriumFunctional2D : public BoxProcessingFunctional2D_LS<T,Descriptor,T>
00296 {
00297 public:
00298     BoxEquilibriumFunctional2D(plint iComponent_);
00299     virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& lattice,
00300                                        ScalarField2D<T>& equilibrium);
00301     virtual BoxEquilibriumFunctional2D<T,Descriptor>* clone() const;
00302     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00303     virtual BlockDomain::DomainT appliesTo() const;
00304 private:
00305     plint iComponent;
00306 };
00307 
00308 template<typename T, template<typename U> class Descriptor> 
00309 class BoxAllPopulationsFunctional2D : public BoxProcessingFunctional2D_LT<T,Descriptor,T,Descriptor<T>::q>
00310 {
00311 public:
00312     BoxAllPopulationsFunctional2D();
00313     virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& lattice,
00314                                        TensorField2D<T,Descriptor<T>::q>& populations);
00315     virtual BoxAllPopulationsFunctional2D<T,Descriptor>* clone() const;
00316     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00317     virtual BlockDomain::DomainT appliesTo() const;
00318 };
00319 
00320 template<typename T, template<typename U> class Descriptor>
00321 class BoxAllPopulationsToLatticeFunctional2D :
00322     public BoxProcessingFunctional2D_LT<T,Descriptor,T,Descriptor<T>::q>
00323 {
00324 public:
00325     BoxAllPopulationsToLatticeFunctional2D();
00326     virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& lattice,
00327                          TensorField2D<T,Descriptor<T>::q>& populations);
00328     virtual BoxAllPopulationsToLatticeFunctional2D<T,Descriptor>* clone() const;
00329     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00330     virtual BlockDomain::DomainT appliesTo() const;
00331 };
00332 
00333 template<typename T, template<typename U> class Descriptor> 
00334 class BoxOmegaFunctional2D : public BoxProcessingFunctional2D_LS<T,Descriptor,T>
00335 {
00336 public:
00337     virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& lattice,
00338                          ScalarField2D<T>& scalarField);
00339     virtual BoxOmegaFunctional2D<T,Descriptor>* clone() const;
00340     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00341     virtual BlockDomain::DomainT appliesTo() const;
00342 };
00343 
00344 
00345 /* *************** PART II ******************************************* */
00346 /* *************** Analysis of the scalar-field ********************** */
00347 /* ******************************************************************* */
00348 
00349 /* *************** Reductive Data Functionals for ScalarField ******** */
00350 
00355 template<typename T>
00356 class BoxScalarSumFunctional2D : public ReductiveBoxProcessingFunctional2D_S<T>
00357 {
00358 public:
00359     BoxScalarSumFunctional2D();
00360     virtual void process(Box2D domain, ScalarField2D<T>& scalarField);
00361     virtual BoxScalarSumFunctional2D<T>* clone() const;
00362     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00363         modified[0] = modif::nothing;
00364     }
00365     T getSumScalar() const;
00366 private:
00367     plint sumScalarId;
00368 };
00369 
00374 template<typename T>
00375 class MaskedBoxScalarAverageFunctional2D : public ReductiveBoxProcessingFunctional2D_SS<T,int>
00376 {
00377 public:
00378     MaskedBoxScalarAverageFunctional2D(int flag_);
00379     virtual void process( Box2D domain,
00380                           ScalarField2D<T>& scalarField,
00381                           ScalarField2D<int>& mask );
00382     virtual MaskedBoxScalarAverageFunctional2D<T>* clone() const;
00383     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00384         modified[0] = modif::nothing;
00385         modified[1] = modif::nothing;
00386     }
00387     T getAverageScalar() const;
00388 private:
00389     plint averageScalarId;
00390     int flag;
00391 };
00392 
00397 template<typename T>
00398 class BoxScalarMinFunctional2D : public ReductiveBoxProcessingFunctional2D_S<T>
00399 {
00400 public:
00401     BoxScalarMinFunctional2D();
00402     virtual void process(Box2D domain, ScalarField2D<T>& scalarField);
00403     virtual BoxScalarMinFunctional2D<T>* clone() const;
00404     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00405         modified[0] = modif::nothing;
00406     }
00407     T getMinScalar() const;
00408 private:
00409     plint maxScalarId;
00410 };
00411 
00416 template<typename T>
00417 class BoxScalarMaxFunctional2D : public ReductiveBoxProcessingFunctional2D_S<T>
00418 {
00419 public:
00420     BoxScalarMaxFunctional2D();
00421     virtual void process(Box2D domain, ScalarField2D<T>& scalarField);
00422     virtual BoxScalarMaxFunctional2D<T>* clone() const;
00423     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00424         modified[0] = modif::nothing;
00425     }
00426     T getMaxScalar() const;
00427 private:
00428     plint maxScalarId;
00429 };
00430 
00435 template<typename T>
00436 class BoundedBoxScalarSumFunctional2D : public BoundedReductiveBoxProcessingFunctional2D_S<T>
00437 {
00438 public:
00439     BoundedBoxScalarSumFunctional2D();
00440     virtual void processBulk(Box2D domain, ScalarField2D<T>& scalarField);
00441     virtual void processEdge( int direction, int orientation, Box2D domain,
00442                               ScalarField2D<T>& scalarField );
00443     virtual void processCorner( int normalX, int normalY, Box2D domain,
00444                                 ScalarField2D<T>& scalarField );
00445     virtual BoundedBoxScalarSumFunctional2D<T>* clone() const;
00446     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00447         modified[0] = modif::nothing;
00448     }
00449     T getSumScalar() const;
00450 private:
00451     plint sumScalarId;
00452 };
00453 
00454 template<typename T, class BoolMask> 
00455 class CountScalarElementsFunctional2D : public ReductiveBoxProcessingFunctional2D_S<T>
00456 {
00457 public:
00458     CountScalarElementsFunctional2D(BoolMask boolMask_);
00459     virtual void process(Box2D domain, ScalarField2D<T>& field);
00460     virtual CountScalarElementsFunctional2D<T,BoolMask>* clone() const;
00461     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00462         modified[0] = modif::nothing;
00463     }
00464     plint getCount() const;
00465 private:
00466     plint countId;
00467     BoolMask boolMask;
00468 };
00469 
00470 /* *************** Data Functionals for scalar-fields **************** */
00471 
00472 template<typename T>
00473 class ComputeAbsoluteValueFunctional2D : public BoxProcessingFunctional2D_SS<T,T>
00474 {
00475 public:
00476     virtual void process(Box2D domain, ScalarField2D<T>& A,
00477                                        ScalarField2D<T>& B);
00478     virtual ComputeAbsoluteValueFunctional2D<T>* clone() const;
00479     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00480     virtual BlockDomain::DomainT appliesTo() const;
00481 };
00482 
00483 template<typename T>
00484 class ComputeScalarSqrtFunctional2D : public BoxProcessingFunctional2D_SS<T,T>
00485 {
00486 public:
00487     virtual void process(Box2D domain, ScalarField2D<T>& A,
00488                                        ScalarField2D<T>& B);
00489     virtual ComputeScalarSqrtFunctional2D<T>* clone() const;
00490     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00491     virtual BlockDomain::DomainT appliesTo() const;
00492 };
00493 
00494 template<typename T>
00495 class ComputeScalarLogFunctional2D : public BoxProcessingFunctional2D_SS<T,T>
00496 {
00497 public:
00498     virtual void process(Box2D domain, ScalarField2D<T>& A,
00499                                        ScalarField2D<T>& B);
00500     virtual ComputeScalarLogFunctional2D<T>* clone() const;
00501     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00502     virtual BlockDomain::DomainT appliesTo() const;
00503 };
00504 
00505 template<typename T1, typename T2>
00506 class CopyConvertScalarFunctional2D : public BoxProcessingFunctional2D_SS<T1,T2>
00507 {
00508 public:
00509     virtual void process(Box2D domain, ScalarField2D<T1>& field1, ScalarField2D<T2>& field2);
00510     virtual CopyConvertScalarFunctional2D<T1,T2>* clone() const;
00511     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00512     virtual BlockDomain::DomainT appliesTo() const;
00513 };
00514 
00515 template<typename T>
00516 class ExtractScalarSubDomainFunctional2D : public BoxProcessingFunctional2D_SS<T,T>
00517 {
00518 public:
00519     virtual void process(Box2D domain, ScalarField2D<T>& field1, ScalarField2D<T>& field2);
00520     virtual ExtractScalarSubDomainFunctional2D<T>* clone() const;
00521     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00522     virtual BlockDomain::DomainT appliesTo() const;
00523 };
00524 
00525 template<typename T, class Function>
00526 class ApplyScalarFunctional2D : public BoxProcessingFunctional2D_S<T> {
00527 public:
00528     ApplyScalarFunctional2D(Function f_);
00529     virtual void process(Box2D domain, ScalarField2D<T>& field);
00530     virtual ApplyScalarFunctional2D<T,Function>* clone() const;
00531     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00532     virtual BlockDomain::DomainT appliesTo() const;
00533 private:
00534     Function f;
00535 };
00536 
00537 template<typename T, class EvalFunction>
00538 class EvaluateScalarFunctional2D : public BoxProcessingFunctional2D_SS<T,T> {
00539 public:
00540     EvaluateScalarFunctional2D(EvalFunction f_);
00541     virtual void process(Box2D domain, ScalarField2D<T>& field,
00542                                        ScalarField2D<T>& result);
00543     virtual EvaluateScalarFunctional2D<T,EvalFunction>* clone() const;
00544     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00545     virtual BlockDomain::DomainT appliesTo() const;
00546 private:
00547     EvalFunction f;
00548 };
00549 
00550 template<typename T>
00551 class A_lt_alpha_functional2D : public BoxProcessingFunctional2D_SS<T,int>
00552 {
00553 public:
00554     A_lt_alpha_functional2D(T alpha_);
00555     virtual void process(Box2D domain, ScalarField2D<T>& A,
00556                                        ScalarField2D<int>& result);
00557     virtual A_lt_alpha_functional2D<T>* clone() const;
00558     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00559     virtual BlockDomain::DomainT appliesTo() const;
00560 private:
00561     T alpha;
00562 };
00563 
00564 template<typename T>
00565 class A_gt_alpha_functional2D : public BoxProcessingFunctional2D_SS<T,int>
00566 {
00567 public:
00568     A_gt_alpha_functional2D(T alpha_);
00569     virtual void process(Box2D domain, ScalarField2D<T>& A,
00570                                        ScalarField2D<int>& result);
00571     virtual A_gt_alpha_functional2D<T>* clone() const;
00572     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00573     virtual BlockDomain::DomainT appliesTo() const;
00574 private:
00575     T alpha;
00576 };
00577 
00578 template<typename T>
00579 class A_plus_alpha_functional2D : public BoxProcessingFunctional2D_SS<T,T>
00580 {
00581 public:
00582     A_plus_alpha_functional2D(T alpha_);
00583     virtual void process(Box2D domain, ScalarField2D<T>& A,
00584                                        ScalarField2D<T>& result);
00585     virtual A_plus_alpha_functional2D<T>* clone() const;
00586     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00587     virtual BlockDomain::DomainT appliesTo() const;
00588 private:
00589     T alpha;
00590 };
00591 
00592 template<typename T>
00593 class A_minus_alpha_functional2D : public BoxProcessingFunctional2D_SS<T,T>
00594 {
00595 public:
00596     A_minus_alpha_functional2D(T alpha_);
00597     virtual void process(Box2D domain, ScalarField2D<T>& A,
00598                                        ScalarField2D<T>& result);
00599     virtual A_minus_alpha_functional2D<T>* clone() const;
00600     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00601     virtual BlockDomain::DomainT appliesTo() const;
00602 private:
00603     T alpha;
00604 };
00605 
00606 template<typename T>
00607 class Alpha_minus_A_functional2D : public BoxProcessingFunctional2D_SS<T,T>
00608 {
00609 public:
00610     Alpha_minus_A_functional2D(T alpha_);
00611     virtual void process(Box2D domain, ScalarField2D<T>& A,
00612                                        ScalarField2D<T>& result);
00613     virtual Alpha_minus_A_functional2D<T>* clone() const;
00614     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00615     virtual BlockDomain::DomainT appliesTo() const;
00616 private:
00617     T alpha;
00618 };
00619 
00620 template<typename T>
00621 class A_times_alpha_functional2D : public BoxProcessingFunctional2D_SS<T,T>
00622 {
00623 public:
00624     A_times_alpha_functional2D(T alpha_);
00625     virtual void process(Box2D domain, ScalarField2D<T>& A,
00626                                        ScalarField2D<T>& result);
00627     virtual A_times_alpha_functional2D<T>* clone() const;
00628     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00629     virtual BlockDomain::DomainT appliesTo() const;
00630 private:
00631     T alpha;
00632 };
00633 
00634 template<typename T>
00635 class A_dividedBy_alpha_functional2D : public BoxProcessingFunctional2D_SS<T,T>
00636 {
00637 public:
00638     A_dividedBy_alpha_functional2D(T alpha_);
00639     virtual void process(Box2D domain, ScalarField2D<T>& A,
00640                                        ScalarField2D<T>& result);
00641     virtual A_dividedBy_alpha_functional2D<T>* clone() const;
00642     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00643     virtual BlockDomain::DomainT appliesTo() const;
00644 private:
00645     T alpha;
00646 };
00647 
00648 template<typename T>
00649 class Alpha_dividedBy_A_functional2D : public BoxProcessingFunctional2D_SS<T,T>
00650 {
00651 public:
00652     Alpha_dividedBy_A_functional2D(T alpha_);
00653     virtual void process(Box2D domain, ScalarField2D<T>& A,
00654                                        ScalarField2D<T>& result);
00655     virtual Alpha_dividedBy_A_functional2D<T>* clone() const;
00656     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00657     virtual BlockDomain::DomainT appliesTo() const;
00658 private:
00659     T alpha;
00660 };
00661 
00662 template<typename T>
00663 class A_plus_alpha_inplace_functional2D : public BoxProcessingFunctional2D_S<T>
00664 {
00665 public:
00666     A_plus_alpha_inplace_functional2D(T alpha_);
00667     virtual void process(Box2D domain, ScalarField2D<T>& A);
00668     virtual A_plus_alpha_inplace_functional2D<T>* clone() const;
00669     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00670     virtual BlockDomain::DomainT appliesTo() const;
00671 private:
00672     T alpha;
00673 };
00674 
00675 template<typename T>
00676 class A_minus_alpha_inplace_functional2D : public BoxProcessingFunctional2D_S<T>
00677 {
00678 public:
00679     A_minus_alpha_inplace_functional2D(T alpha_);
00680     virtual void process(Box2D domain, ScalarField2D<T>& A);
00681     virtual A_minus_alpha_inplace_functional2D<T>* clone() const;
00682     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00683     virtual BlockDomain::DomainT appliesTo() const;
00684 private:
00685     T alpha;
00686 };
00687 
00688 template<typename T>
00689 class A_times_alpha_inplace_functional2D : public BoxProcessingFunctional2D_S<T>
00690 {
00691 public:
00692     A_times_alpha_inplace_functional2D(T alpha_);
00693     virtual void process(Box2D domain, ScalarField2D<T>& A);
00694     virtual A_times_alpha_inplace_functional2D<T>* clone() const;
00695     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00696     virtual BlockDomain::DomainT appliesTo() const;
00697 private:
00698     T alpha;
00699 };
00700 
00701 template<typename T>
00702 class A_dividedBy_alpha_inplace_functional2D : public BoxProcessingFunctional2D_S<T>
00703 {
00704 public:
00705     A_dividedBy_alpha_inplace_functional2D(T alpha_);
00706     virtual void process(Box2D domain, ScalarField2D<T>& A);
00707     virtual A_dividedBy_alpha_inplace_functional2D<T>* clone() const;
00708     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00709     virtual BlockDomain::DomainT appliesTo() const;
00710 private:
00711     T alpha;
00712 };
00713 
00714 
00715 template<typename T>
00716 class A_lt_B_functional2D : public BoxProcessingFunctional2D
00717 {
00718 public:
00719     virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> scalarFields);
00720     virtual A_lt_B_functional2D<T>* clone() const;
00721     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00722     virtual BlockDomain::DomainT appliesTo() const;
00723 };
00724 
00725 
00726 template<typename T>
00727 class A_gt_B_functional2D : public BoxProcessingFunctional2D
00728 {
00729 public:
00730     virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> scalarFields);
00731     virtual A_gt_B_functional2D<T>* clone() const;
00732     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00733     virtual BlockDomain::DomainT appliesTo() const;
00734 };
00735 
00736 template<typename T>
00737 class A_plus_B_functional2D : public ScalarFieldBoxProcessingFunctional2D<T>
00738 {
00739 public:
00740     virtual void process(Box2D domain, std::vector<ScalarField2D<T>*> scalarFields);
00741     virtual A_plus_B_functional2D<T>* clone() const;
00742     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00743     virtual BlockDomain::DomainT appliesTo() const;
00744 };
00745 
00746 template<typename T>
00747 class A_minus_B_functional2D : public ScalarFieldBoxProcessingFunctional2D<T>
00748 {
00749 public:
00750     virtual void process(Box2D domain, std::vector<ScalarField2D<T>*> scalarFields);
00751     virtual A_minus_B_functional2D<T>* clone() const;
00752     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00753     virtual BlockDomain::DomainT appliesTo() const;
00754 };
00755 
00756 template<typename T>
00757 class A_times_B_functional2D : public ScalarFieldBoxProcessingFunctional2D<T>
00758 {
00759 public:
00760     virtual void process(Box2D domain, std::vector<ScalarField2D<T>*> scalarFields);
00761     virtual A_times_B_functional2D<T>* clone() const;
00762     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00763     virtual BlockDomain::DomainT appliesTo() const;
00764 };
00765 
00766 template<typename T>
00767 class A_dividedBy_B_functional2D : public ScalarFieldBoxProcessingFunctional2D<T>
00768 {
00769 public:
00770     virtual void process(Box2D domain, std::vector<ScalarField2D<T>*> scalarFields);
00771     virtual A_dividedBy_B_functional2D<T>* clone() const;
00772     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00773     virtual BlockDomain::DomainT appliesTo() const;
00774 };
00775 
00776 template<typename T>
00777 class A_plus_B_inplace_functional2D : public BoxProcessingFunctional2D_SS<T,T>
00778 {
00779 public:
00780     virtual void process(Box2D domain, ScalarField2D<T>& A, ScalarField2D<T>& B);
00781     virtual A_plus_B_inplace_functional2D<T>* clone() const;
00782     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00783     virtual BlockDomain::DomainT appliesTo() const;
00784 };
00785 
00786 template<typename T>
00787 class A_minus_B_inplace_functional2D : public BoxProcessingFunctional2D_SS<T,T>
00788 {
00789 public:
00790     virtual void process(Box2D domain, ScalarField2D<T>& A, ScalarField2D<T>& B);
00791     virtual A_minus_B_inplace_functional2D<T>* clone() const;
00792     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00793     virtual BlockDomain::DomainT appliesTo() const;
00794 };
00795 
00796 template<typename T>
00797 class A_times_B_inplace_functional2D : public BoxProcessingFunctional2D_SS<T,T>
00798 {
00799 public:
00800     virtual void process(Box2D domain, ScalarField2D<T>& A, ScalarField2D<T>& B);
00801     virtual A_times_B_inplace_functional2D<T>* clone() const;
00802     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00803     virtual BlockDomain::DomainT appliesTo() const;
00804 };
00805 
00806 template<typename T>
00807 class A_dividedBy_B_inplace_functional2D : public BoxProcessingFunctional2D_SS<T,T>
00808 {
00809 public:
00810     virtual void process(Box2D domain, ScalarField2D<T>& A, ScalarField2D<T>& B);
00811     virtual A_dividedBy_B_inplace_functional2D<T>* clone() const;
00812     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00813     virtual BlockDomain::DomainT appliesTo() const;
00814 };
00815 
00816 /* *************** PART III ****************************************** */
00817 /* *************** Analysis of the tensor-field ********************** */
00818 /* ******************************************************************* */
00819 
00820 template<typename T, int nDim>
00821 class ComputeTensorSqrtFunctional2D : public BoxProcessingFunctional2D_TT<T,nDim,T,nDim>
00822 {
00823 public:
00824     virtual void process(Box2D domain, TensorField2D<T,nDim>& A,
00825                                        TensorField2D<T,nDim>& B);
00826     virtual ComputeTensorSqrtFunctional2D<T,nDim>* clone() const;
00827     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00828     virtual BlockDomain::DomainT appliesTo() const;
00829 };
00830 
00831 template<typename T, int nDim, class BoolMask> 
00832 class CountTensorElementsFunctional2D :
00833     public ReductiveBoxProcessingFunctional2D_T<T,nDim>
00834 {
00835 public:
00836     CountTensorElementsFunctional2D(BoolMask boolMask_);
00837     virtual void process(Box2D domain, TensorField2D<T,nDim>& field);
00838     virtual CountTensorElementsFunctional2D<T,nDim,BoolMask>* clone() const;
00839     plint getCount() const;
00840 private:
00841     plint countId;
00842     BoolMask boolMask;
00843 };
00844 
00845 template<typename T1, typename T2, int nDim>
00846 class CopyConvertTensorFunctional2D : public BoxProcessingFunctional2D_TT<T1,nDim,T2,nDim>
00847 {
00848 public:
00849     virtual void process(Box2D domain, TensorField2D<T1,nDim>& field1, TensorField2D<T2,nDim>& field2);
00850     virtual CopyConvertTensorFunctional2D<T1,T2,nDim>* clone() const;
00851     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00852     virtual BlockDomain::DomainT appliesTo() const;
00853 };
00854 
00855 template<typename T, int nDim>
00856 class ExtractTensorSubDomainFunctional2D :
00857     public BoxProcessingFunctional2D_TT<T,nDim,T,nDim>
00858 {
00859 public:
00860     virtual void process(Box2D domain, TensorField2D<T,nDim>& field1, TensorField2D<T,nDim>& field2);
00861     virtual ExtractTensorSubDomainFunctional2D<T,nDim>* clone() const;
00862     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00863     virtual BlockDomain::DomainT appliesTo() const;
00864 };
00865 
00866 template<typename T, int nDim>
00867 class ExtractTensorComponentFunctional2D :
00868     public BoxProcessingFunctional2D_ST<T,T,nDim>
00869 {
00870 public:
00871     ExtractTensorComponentFunctional2D(int iComponent_);
00872     virtual void process(Box2D domain, ScalarField2D<T>& scalarField,
00873                                        TensorField2D<T,nDim>& tensorField);
00874     virtual ExtractTensorComponentFunctional2D<T,nDim>* clone() const;
00875     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00876     virtual BlockDomain::DomainT appliesTo() const;
00877 private:
00878     int iComponent;
00879 };
00880 
00881 template<typename T, int nDim>
00882 class ComputeNormFunctional2D : public BoxProcessingFunctional2D_ST<T,T,nDim>
00883 {
00884 public:
00885     virtual void process(Box2D domain, ScalarField2D<T>& scalarField,
00886                                        TensorField2D<T,nDim>& tensorField);
00887     virtual ComputeNormFunctional2D<T,nDim>* clone() const;
00888     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00889     virtual BlockDomain::DomainT appliesTo() const;
00890 };
00891 
00892 template<typename T, int nDim>
00893 class ComputeNormSqrFunctional2D : public BoxProcessingFunctional2D_ST<T,T,nDim>
00894 {
00895 public:
00896     virtual void process(Box2D domain, ScalarField2D<T>& scalarField,
00897                                        TensorField2D<T,nDim>& tensorField);
00898     virtual ComputeNormSqrFunctional2D<T,nDim>* clone() const;
00899     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00900     virtual BlockDomain::DomainT appliesTo() const;
00901 };
00902 
00903 template<typename T>
00904 class ComputeSymmetricTensorNormFunctional2D :
00905     public BoxProcessingFunctional2D_ST<T,T,3>
00906 {
00907 public:
00908     virtual void process(Box2D domain, ScalarField2D<T>& scalarField,
00909                                        TensorField2D<T,3>& tensorField);
00910     virtual ComputeSymmetricTensorNormFunctional2D<T>* clone() const;
00911     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00912     virtual BlockDomain::DomainT appliesTo() const;
00913 };
00914 
00915 template<typename T>
00916 class ComputeSymmetricTensorNormSqrFunctional2D :
00917     public BoxProcessingFunctional2D_ST<T,T,3>
00918 {
00919 public:
00920     virtual void process(Box2D domain, ScalarField2D<T>& scalarField,
00921                                        TensorField2D<T,3>& tensorField);
00922     virtual ComputeSymmetricTensorNormSqrFunctional2D<T>* clone() const;
00923     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00924     virtual BlockDomain::DomainT appliesTo() const;
00925 };
00926 
00927 template<typename T>
00928 class ComputeSymmetricTensorTraceFunctional2D :
00929     public BoxProcessingFunctional2D_ST<T,T,3>
00930 {
00931 public:
00932     virtual void process(Box2D domain, ScalarField2D<T>& scalarField,
00933                                        TensorField2D<T,3>& tensorField);
00934     virtual ComputeSymmetricTensorTraceFunctional2D<T>* clone() const;
00935     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00936     virtual BlockDomain::DomainT appliesTo() const;
00937 };
00938 
00939 template<typename T, int nDim>
00940 class BoxBulkVorticityFunctional2D : public BoxProcessingFunctional2D_ST<T,T,nDim>
00941 {
00942 public:
00943     virtual void process(Box2D domain, ScalarField2D<T>& vorticity,
00944                                        TensorField2D<T,nDim>& velocity);
00945     virtual BoxBulkVorticityFunctional2D<T,nDim>* clone() const;
00946     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00947     virtual BlockDomain::DomainT appliesTo() const;
00948 };
00949 
00950 template<typename T, int nDim>
00951 class BoxVorticityFunctional2D : public BoundedBoxProcessingFunctional2D_ST<T,T,nDim>
00952 {
00953 public:
00954     virtual void processBulk( Box2D domain, ScalarField2D<T>& vorticity,
00955                                             TensorField2D<T,nDim>& velocity );
00956     virtual void processEdge( int direction, int orientation, Box2D domain,
00957                               ScalarField2D<T>& vorticity,
00958                               TensorField2D<T,nDim>& velocity );
00959     virtual void processCorner( int normalX, int normalY, Box2D domain,
00960                                 ScalarField2D<T>& vorticity,
00961                                 TensorField2D<T,nDim>& velocity );
00962     virtual BoxVorticityFunctional2D<T,nDim>* clone() const;
00963     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00964     virtual BlockDomain::DomainT appliesTo() const;
00965 };
00966 
00967 template<typename T, int nDim>
00968 class BoxBulkStrainRateFunctional2D :
00969     public BoxProcessingFunctional2D_TT<T,nDim,T,SymmetricTensorImpl<T,nDim>::n>
00970 {
00971 public:
00972     virtual void process(Box2D domain, TensorField2D<T,nDim>& velocity,
00973                                        TensorField2D<T,SymmetricTensorImpl<T,nDim>::n>& S);
00974     virtual BoxBulkStrainRateFunctional2D<T,nDim>* clone() const;
00975     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00976     virtual BlockDomain::DomainT appliesTo() const;
00977 };
00978 
00979 template<typename T, int nDim>
00980 class BoxStrainRateFunctional2D :
00981     public BoundedBoxProcessingFunctional2D_TT<T,nDim,T,SymmetricTensorImpl<T,nDim>::n>
00982 {
00983 public:
00984     virtual void processBulk( Box2D domain, TensorField2D<T,nDim>& velocity,
00985                                             TensorField2D<T,SymmetricTensorImpl<T,nDim>::n>& S );
00986     virtual void processEdge( int direction, int orientation, Box2D domain,
00987                               TensorField2D<T,nDim>& velocity,
00988                               TensorField2D<T,SymmetricTensorImpl<T,nDim>::n>& S );
00989     virtual void processCorner( int normalX, int normalY, Box2D domain,
00990                                 TensorField2D<T,nDim>& velocity,
00991                                 TensorField2D<T,SymmetricTensorImpl<T,nDim>::n>& S );
00992     virtual BoxStrainRateFunctional2D<T,nDim>* clone() const;
00993     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
00994     virtual BlockDomain::DomainT appliesTo() const;
00995 };
00996 
00997 template<typename T, int nDim>
00998 class Tensor_A_times_alpha_functional2D : public BoxProcessingFunctional2D_TT<T,nDim,T,nDim>
00999 {
01000 public:
01001     Tensor_A_times_alpha_functional2D(T alpha_);
01002     virtual void process(Box2D domain, TensorField2D<T,nDim>& A,
01003                          TensorField2D<T,nDim>& result);
01004     virtual Tensor_A_times_alpha_functional2D<T,nDim>* clone() const;
01005     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01006     virtual BlockDomain::DomainT appliesTo() const;
01007 private:
01008     T alpha;
01009 };
01010 
01011 template<typename T, int nDim>
01012 class Tensor_A_plus_B_functional2D : public TensorFieldBoxProcessingFunctional2D<T,nDim>
01013 {
01014 public:
01015     virtual void process(Box2D domain, std::vector<TensorField2D<T,nDim>*> tensorFields);
01016     virtual Tensor_A_plus_B_functional2D<T,nDim>* clone() const;
01017     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01018     virtual BlockDomain::DomainT appliesTo() const;
01019 };
01020 
01021 template<typename T, int nDim>
01022 class Tensor_A_minus_B_functional2D : public TensorFieldBoxProcessingFunctional2D<T,nDim>
01023 {
01024 public:
01025     virtual void process(Box2D domain, std::vector<TensorField2D<T,nDim>*> tensorFields);
01026     virtual Tensor_A_minus_B_functional2D<T,nDim>* clone() const;
01027     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01028     virtual BlockDomain::DomainT appliesTo() const;
01029 };
01030 
01031 template<typename T, int nDim>
01032 class Tensor_A_times_B_functional2D : public TensorFieldBoxProcessingFunctional2D<T,nDim>
01033 {
01034 public:
01035     virtual void process(Box2D domain, std::vector<TensorField2D<T,nDim>*> tensorFields);
01036     virtual Tensor_A_times_B_functional2D<T,nDim>* clone() const;
01037     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01038     virtual BlockDomain::DomainT appliesTo() const;
01039 };
01040 
01041 template<typename T, int nDim>
01042 class Tensor_A_dividedBy_B_functional2D : public TensorFieldBoxProcessingFunctional2D<T,nDim>
01043 {
01044 public:
01045     virtual void process(Box2D domain, std::vector<TensorField2D<T,nDim>*> tensorFields);
01046     virtual Tensor_A_dividedBy_B_functional2D<T,nDim>* clone() const;
01047     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01048     virtual BlockDomain::DomainT appliesTo() const;
01049 };
01050 
01051 template<typename T, int nDim>
01052 class Tensor_A_plus_B_inplace_functional2D :
01053     public BoxProcessingFunctional2D_TT<T,nDim,T,nDim>
01054 {
01055 public:
01056     virtual void process(Box2D domain, TensorField2D<T,nDim>& A, TensorField2D<T,nDim>& B);
01057     virtual Tensor_A_plus_B_inplace_functional2D<T,nDim>* clone() const;
01058     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01059     virtual BlockDomain::DomainT appliesTo() const;
01060 };
01061 
01062 template<typename T, int nDim>
01063 class Tensor_A_minus_B_inplace_functional2D :
01064     public BoxProcessingFunctional2D_TT<T,nDim,T,nDim>
01065 {
01066 public:
01067     virtual void process(Box2D domain, TensorField2D<T,nDim>& A, TensorField2D<T,nDim>& B);
01068     virtual Tensor_A_minus_B_inplace_functional2D<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, int nDim>
01074 class Tensor_A_times_B_inplace_functional2D :
01075     public BoxProcessingFunctional2D_TT<T,nDim,T,nDim>
01076 {
01077 public:
01078     virtual void process(Box2D domain, TensorField2D<T,nDim>& A,
01079                                        TensorField2D<T,nDim>& B);
01080     virtual Tensor_A_times_B_inplace_functional2D<T,nDim>* clone() const;
01081     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01082     virtual BlockDomain::DomainT appliesTo() const;
01083 };
01084 
01085 template<typename T, int nDim>
01086 class Tensor_A_times_alpha_inplace_functional2D :
01087     public BoxProcessingFunctional2D_T<T,nDim>
01088 {
01089 public:
01090     Tensor_A_times_alpha_inplace_functional2D(T alpha_);
01091     virtual void process(Box2D domain, TensorField2D<T,nDim>& A);
01092     virtual Tensor_A_times_alpha_inplace_functional2D<T,nDim>* clone() const;
01093     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01094     virtual BlockDomain::DomainT appliesTo() const;
01095 private:
01096     T alpha;
01097 };
01098 
01099 template<typename T, int nDim>
01100 class Tensor_A_dividedBy_B_inplace_functional2D :
01101     public BoxProcessingFunctional2D_TT<T,nDim,T,nDim>
01102 {
01103 public:
01104     virtual void process(Box2D domain, TensorField2D<T,nDim>& A,
01105                                        TensorField2D<T,nDim>& B);
01106     virtual Tensor_A_dividedBy_B_inplace_functional2D<T,nDim>* clone() const;
01107     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const;
01108     virtual BlockDomain::DomainT appliesTo() const;
01109 };
01110 
01111 }  // namespace plb
01112 
01113 #endif  // DATA_ANALYSIS_FUNCTIONAL_2D_H
01114 
01115 // Explicitly include generic algorithms which are never precompiled (not even in precompiled version)
01116 #include "dataProcessors/dataAnalysisGenerics2D.h"
01117