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

multiGridDataAnalysisWrapper3D.hh

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 
00025 /* Main author: Daniel Lagrava
00026  **/
00027 
00028 
00029 #ifndef MULTI_GRID_DATA_ANALYSIS_WRAPPER_3D_HH
00030 #define MULTI_GRID_DATA_ANALYSIS_WRAPPER_3D_HH
00031 
00032 #include "dataProcessors/dataAnalysisWrapper3D.h"
00033 #include "multiGrid/multiGridDataProcessorWrapper3D.h"
00034 #include "multiGrid/multiGridDataAnalysisWrapper3D.h"
00035 
00036 namespace plb {
00037     
00038 /* *************** Reductive functions ******************************* */
00039 
00040 template<typename T>
00041 T computeAverage(MultiGridScalarField3D<T>& scalarField, Box3D domain) {
00042     BoxScalarSumFunctional3D<T> functional;
00043     applyProcessingFunctional(functional, domain, scalarField, scalarField.getReferenceLevel());
00044     return functional.getSumScalar() / (T) domain.nCells();
00045 }
00046 
00047 template<typename T>
00048 T computeAverage(MultiGridScalarField3D<T>& scalarField) {
00049     return computeAverage(scalarField, scalarField.getBoundingBox());
00050 }
00051 
00052 
00053 template<typename T>
00054 T computeMin(MultiGridScalarField3D<T>& scalarField, Box3D domain) {
00055     BoxScalarMinFunctional3D<T> functional;
00056     applyProcessingFunctional(functional, domain, scalarField, scalarField.getReferenceLevel());
00057     return functional.getMinScalar();
00058 }
00059 
00060 template<typename T>
00061 T computeMin(MultiGridScalarField3D<T>& scalarField) {
00062     return computeMin(scalarField, scalarField.getBoundingBox());
00063 }
00064 
00065 
00066 template<typename T>
00067 T computeMax(MultiGridScalarField3D<T>& scalarField, Box3D domain) {
00068     BoxScalarMaxFunctional3D<T> functional;
00069     applyProcessingFunctional(functional, domain, scalarField,scalarField.getReferenceLevel());
00070     return functional.getMaxScalar();
00071 }
00072 
00073 template<typename T>
00074 T computeMax(MultiGridScalarField3D<T>& scalarField) {
00075     return computeMax(scalarField, scalarField.getBoundingBox());
00076 }
00077 
00078 
00079 template<typename T>
00080 T computeBoundedAverage(MultiGridScalarField3D<T>& scalarField, Box3D domain) {
00081     BoundedBoxScalarSumFunctional3D<T> functional;
00082     plint envelopeWidth=1;
00083     applyProcessingFunctional(functional, domain, scalarField, scalarField.getReferenceLevel(), envelopeWidth);
00084     return functional.getSumScalar() /
00085              (T) ( (domain.getNx()-1)*(domain.getNy()-1)*(domain.getNz()-1));
00086 }
00087 
00088 template<typename T>
00089 T computeBoundedAverage(MultiGridScalarField3D<T>& scalarField) {
00090     return computeBoundedAverage(scalarField, scalarField.getBoundingBox());
00091 }
00092 
00093 
00094 template<typename T, class BoolMask> 
00095 plint count(MultiGridScalarField3D<T>& field, Box3D domain, BoolMask boolMask)
00096 {
00097     CountScalarElementsFunctional3D<T,BoolMask> functional(boolMask);
00098     applyProcessingFunctional(functional, domain, field, field.getReferenceLevel());
00099     return functional.getCount();
00100 }
00101 
00102 template<typename T, class BoolMask> 
00103 plint count(MultiGridScalarField3D<T>& field, BoolMask boolMask)
00104 {
00105     return count(field, field.getBoundingBox(), boolMask);
00106 }
00107 
00108 /* *************** Extract Sub-Lattice ******************************* */
00109 
00110 template<typename T, template<typename U> class Descriptor>
00111 void extractSubDomain( MultiGridLattice3D<T,Descriptor>& lattice,
00112                        MultiGridLattice3D<T,Descriptor>& extractedLattice,
00113                        Box3D domain)
00114 {
00115     applyProcessingFunctional (
00116             new LatticeRegenerateFunctional3D<T,Descriptor>, domain, lattice, extractedLattice,
00117             lattice.getReferenceLevel() );
00118 }
00119 
00120 template<typename T, template<typename U> class Descriptor>
00121 std::auto_ptr<MultiGridLattice3D<T,Descriptor> > extractSubDomain(
00122         MultiGridLattice3D<T,Descriptor>& lattice, Box3D domain )
00123 {
00124     MultiGridLattice3D<T,Descriptor>* extractedLattice = new MultiGridLattice3D<T,Descriptor>(lattice, domain);
00125     extractSubDomain(lattice, *extractedLattice, domain);
00126     return std::auto_ptr<MultiGridLattice3D<T,Descriptor> >(extractedLattice);
00127 }
00128 
00129 
00130 /* *************** Density ******************************************* */
00131 
00132 template<typename T, template<typename U> class Descriptor>
00133 void computeDensity(MultiGridLattice3D<T,Descriptor>& lattice, MultiGridScalarField3D<T>& density, Box3D domain)
00134 {
00135     applyProcessingFunctional (
00136             new BoxDensityFunctional3D<T,Descriptor>, domain, lattice, density,lattice.getReferenceLevel() );
00137 }
00138 
00139 template<typename T, template<typename U> class Descriptor>
00140 std::auto_ptr<MultiGridScalarField3D<T> > computeDensity(MultiGridLattice3D<T,Descriptor>& lattice, Box3D domain)
00141 {
00142     MultiGridScalarField3D<T>* density = new MultiGridScalarField3D<T>(lattice, domain);
00143     computeDensity(lattice, *density, domain);
00144     return std::auto_ptr<MultiGridScalarField3D<T> >(density);
00145 }
00146 
00147 template<typename T, template<typename U> class Descriptor>
00148 std::auto_ptr<MultiGridScalarField3D<T> > computeDensity(MultiGridLattice3D<T,Descriptor>& lattice) {
00149     return computeDensity(lattice, lattice.getBoundingBox());
00150 }
00151 
00152 
00153 /* *************** RhoBar ******************************************* */
00154 
00155 template<typename T, template<typename U> class Descriptor>
00156 void computeRhoBar(MultiGridLattice3D<T,Descriptor>& lattice, MultiGridScalarField3D<T>& rhoBar, Box3D domain)
00157 {
00158     applyProcessingFunctional (
00159             new BoxRhoBarFunctional3D<T,Descriptor>, domain, lattice, rhoBar, lattice.getReferenceLevel() );
00160 }
00161 
00162 template<typename T, template<typename U> class Descriptor>
00163 std::auto_ptr<MultiGridScalarField3D<T> > computeRhoBar(MultiGridLattice3D<T,Descriptor>& lattice, Box3D domain)
00164 {
00165     MultiGridScalarField3D<T>* rhoBar = new MultiGridScalarField3D<T>(lattice, domain);
00166     computeRhoBar(lattice, *rhoBar, domain);
00167     return std::auto_ptr<MultiGridScalarField3D<T> >(rhoBar);
00168 }
00169 
00170 template<typename T, template<typename U> class Descriptor>
00171 std::auto_ptr<MultiGridScalarField3D<T> > computeRhoBar(MultiGridLattice3D<T,Descriptor>& lattice) {
00172     return computeRhoBar(lattice, lattice.getBoundingBox());
00173 }
00174 
00175 
00176 /* *************** Kinetic Energy ************************************ */
00177 
00178 template<typename T, template<typename U> class Descriptor>
00179 void computeKineticEnergy(MultiGridLattice3D<T,Descriptor>& lattice, MultiGridScalarField3D<T>& energy, Box3D domain)
00180 {
00181     applyProcessingFunctional (
00182             new BoxKineticEnergyFunctional3D<T,Descriptor>, domain, lattice, energy, lattice.getReferenceLevel() );
00183 }
00184 
00185 template<typename T, template<typename U> class Descriptor>
00186 std::auto_ptr<MultiGridScalarField3D<T> > computeKineticEnergy(MultiGridLattice3D<T,Descriptor>& lattice, Box3D domain)
00187 {
00188     MultiGridScalarField3D<T>* energy = new MultiGridScalarField3D<T>(lattice, domain);
00189     computeKineticEnergy(lattice, *energy, domain);
00190     return std::auto_ptr<MultiGridScalarField3D<T> >(energy);
00191 }   
00192 
00193 template<typename T, template<typename U> class Descriptor>
00194 std::auto_ptr<MultiGridScalarField3D<T> > computeKineticEnergy(MultiGridLattice3D<T,Descriptor>& lattice) {
00195     return computeKineticEnergy(lattice, lattice.getBoundingBox());
00196 }
00197 
00198 
00199 /* *************** Velocity Norm ************************************* */
00200 
00201 template<typename T, template<typename U> class Descriptor>
00202 void computeVelocityNorm(
00203         MultiGridLattice3D<T,Descriptor>& lattice, MultiGridScalarField3D<T>& velocityNorm, Box3D domain )
00204 {
00205     applyProcessingFunctional (
00206             new BoxVelocityNormFunctional3D<T,Descriptor>, domain, lattice, velocityNorm,
00207                                lattice.getReferenceLevel() );
00208 }
00209 
00210 template<typename T, template<typename U> class Descriptor>
00211 std::auto_ptr<MultiGridScalarField3D<T> > computeVelocityNorm(MultiGridLattice3D<T,Descriptor>& lattice, Box3D domain)
00212 {
00213     MultiGridScalarField3D<T>* velocityNorm = new MultiGridScalarField3D<T>(lattice, domain);
00214     computeVelocityNorm(lattice, *velocityNorm, domain);
00215     return std::auto_ptr<MultiGridScalarField3D<T> >(velocityNorm);
00216 }
00217 
00218 template<typename T, template<typename U> class Descriptor>
00219 std::auto_ptr<MultiGridScalarField3D<T> > computeVelocityNorm(MultiGridLattice3D<T,Descriptor>& lattice) {
00220     return computeVelocityNorm(lattice, lattice.getBoundingBox());
00221 }
00222 
00223 
00224 /* *************** Velocity Component ******************************** */
00225 
00226 template<typename T, template<typename U> class Descriptor>
00227 void computeVelocityComponent(MultiGridLattice3D<T,Descriptor>& lattice, MultiGridScalarField3D<T>& velocityComponent,
00228                               Box3D domain, plint iComponent)
00229 {
00230     applyProcessingFunctional (
00231             new BoxVelocityComponentFunctional3D<T,Descriptor>(iComponent), domain, lattice, velocityComponent,
00232             lattice.getReferenceLevel() );
00233 }
00234 
00235 template<typename T, template<typename U> class Descriptor>
00236 std::auto_ptr<MultiGridScalarField3D<T> > computeVelocityComponent(MultiGridLattice3D<T,Descriptor>& lattice,
00237                                                                Box3D domain, plint iComponent)
00238 {
00239     MultiGridScalarField3D<T>* velocityComponent = new MultiGridScalarField3D<T>(lattice, domain);
00240     computeVelocityComponent(lattice, *velocityComponent, domain, iComponent);
00241     return std::auto_ptr<MultiGridScalarField3D<T> >(velocityComponent);
00242 }
00243 
00244 template<typename T, template<typename U> class Descriptor>
00245 std::auto_ptr<MultiGridScalarField3D<T> > computeVelocityComponent(
00246                 MultiGridLattice3D<T,Descriptor>& lattice, plint iComponent )
00247 {
00248     return computeVelocityComponent(lattice, lattice.getBoundingBox(), iComponent);
00249 }
00250 
00251 
00252 /* *************** Velocity ****************************************** */
00253 
00254 template<typename T, template<typename U> class Descriptor>
00255 void computeVelocity( MultiGridLattice3D<T,Descriptor>& lattice,
00256                       MultiGridTensorField3D<T,Descriptor<T>::d>& velocity, Box3D domain )
00257 {
00258     applyProcessingFunctional (
00259             new BoxVelocityFunctional3D<T,Descriptor>, domain, lattice, velocity, lattice.getReferenceLevel() );
00260 }
00261 
00262 template<typename T, template<typename U> class Descriptor>
00263 std::auto_ptr<MultiGridTensorField3D<T,Descriptor<T>::d> > computeVelocity(MultiGridLattice3D<T,Descriptor>& lattice,
00264 Box3D domain)
00265 {
00266     MultiGridTensorField3D<T,Descriptor<T>::d>* velocity
00267         = new MultiGridTensorField3D<T,Descriptor<T>::d>(lattice, domain);
00268     computeVelocity(lattice, *velocity, domain);
00269     return std::auto_ptr<MultiGridTensorField3D<T,Descriptor<T>::d> >(velocity);
00270 }
00271 
00272 template<typename T, template<typename U> class Descriptor>
00273 std::auto_ptr<MultiGridTensorField3D<T,Descriptor<T>::d> >
00274     computeVelocity(MultiGridLattice3D<T,Descriptor>& lattice)
00275 {
00276     return computeVelocity(lattice, lattice.getBoundingBox());
00277 }
00278 
00279 
00280 /* *************** Deviatoric Stress ********************************* */
00281 
00282 template<typename T, template<typename U> class Descriptor>
00283 void computeDeviatoricStress( MultiGridLattice3D<T,Descriptor>& lattice,
00284                               MultiGridTensorField3D<T,SymmetricTensor<T,Descriptor>::n>& PiNeq,
00285                               Box3D domain )
00286 {
00287     applyProcessingFunctional (
00288             new BoxDeviatoricStressFunctional3D<T,Descriptor>, domain, lattice, PiNeq, lattice.getReferenceLevel() );
00289 }
00290 
00291 template<typename T, template<typename U> class Descriptor>
00292 std::auto_ptr<MultiGridTensorField3D<T,SymmetricTensor<T,Descriptor>::n> >
00293     computeDeviatoricStress(MultiGridLattice3D<T,Descriptor>& lattice, Box3D domain)
00294 {
00295     MultiGridTensorField3D<T,SymmetricTensor<T,Descriptor>::n>* PiNeq
00296         = new MultiGridTensorField3D<T,SymmetricTensor<T,Descriptor>::n>(lattice, domain);
00297     computeDeviatoricStress(lattice, *PiNeq, domain);
00298     return std::auto_ptr<MultiGridTensorField3D<T,SymmetricTensor<T,Descriptor>::n> >(PiNeq);
00299 }
00300 
00301 template<typename T, template<typename U> class Descriptor>
00302 std::auto_ptr<MultiGridTensorField3D<T,SymmetricTensor<T,Descriptor>::n> >
00303     computeDeviatoricStress(MultiGridLattice3D<T,Descriptor>& lattice)
00304 {
00305     return computeDeviatoricStress(lattice, lattice.getBoundingBox());
00306 }
00307 
00308 
00309 /* *************** Strain Rate from Stress *************************** */
00310 
00311 template<typename T, template<typename U> class Descriptor>
00312 void computeStrainRateFromStress( MultiGridLattice3D<T,Descriptor>& lattice,
00313                                   MultiGridTensorField3D<T,SymmetricTensor<T,Descriptor>::n>& S,
00314                                   Box3D domain )
00315 {
00316     applyProcessingFunctional (
00317             new BoxStrainRateFromStressFunctional3D<T,Descriptor>, domain, lattice, S, lattice.getReferenceLevel() );
00318 }
00319 
00320 template<typename T, template<typename U> class Descriptor>
00321 std::auto_ptr<MultiGridTensorField3D<T,SymmetricTensor<T,Descriptor>::n> >
00322     computeStrainRateFromStress(MultiGridLattice3D<T,Descriptor>& lattice, Box3D domain)
00323 {
00324     MultiGridTensorField3D<T,SymmetricTensor<T,Descriptor>::n>* S
00325         = new MultiGridTensorField3D<T,SymmetricTensor<T,Descriptor>::n>(lattice, domain);
00326     computeStrainRateFromStress(lattice, *S, domain);
00327     return std::auto_ptr<MultiGridTensorField3D<T,SymmetricTensor<T,Descriptor>::n> >(S);
00328 }
00329 
00330 template<typename T, template<typename U> class Descriptor>
00331 std::auto_ptr<MultiGridTensorField3D<T,SymmetricTensor<T,Descriptor>::n> >
00332     computeStrainRateFromStress(MultiGridLattice3D<T,Descriptor>& lattice)
00333 {
00334     return computeStrainRateFromStress(lattice, lattice.getBoundingBox());
00335 }
00336 
00337 /* *************** Temperature ******************************************* */
00338 //TODO
00339 
00340 /* *************** SoundSpeed ******************************************* */
00341 //TODO
00342 
00343 /* *************** Population **************************************** */
00344 
00345 template<typename T, template<typename U> class Descriptor>
00346 void computePopulation(MultiGridLattice3D<T,Descriptor>& lattice, MultiGridScalarField3D<T>& population,
00347                        Box3D domain, plint iPop)
00348 {
00349     applyProcessingFunctional (
00350         new BoxPopulationFunctional3D<T,Descriptor>(iPop), domain, lattice, population,lattice.getReferenceLevel());
00351 }
00352 
00353 template<typename T, template<typename U> class Descriptor>
00354 std::auto_ptr<MultiGridScalarField3D<T> > computePopulation(MultiGridLattice3D<T,Descriptor>& lattice,
00355                                                         Box3D domain, plint iPop)
00356 {
00357     MultiGridScalarField3D<T>* population = new MultiGridScalarField3D<T>(lattice, domain);
00358     computePopulation(lattice, *population, domain, iPop);
00359     return std::auto_ptr<MultiGridScalarField3D<T> >(population);
00360 }
00361 
00362 template<typename T, template<typename U> class Descriptor>
00363 std::auto_ptr<MultiGridScalarField3D<T> > computePopulation(MultiGridLattice3D<T,Descriptor>& lattice, plint iPop)
00364 {
00365     return computePopulation(lattice, lattice.getBoundingBox(), iPop);
00366 }
00367 
00368 template<typename T, template<typename U> class Descriptor>
00369 void computeAllPopulations(MultiGridLattice3D<T,Descriptor>& lattice, 
00370                            MultiGridTensorField3D<T,Descriptor<T>::q>& populations,
00371                            Box3D domain)
00372 {
00373     applyProcessingFunctional (
00374        new BoxAllPopulationsFunctional3D<T,Descriptor>(), domain, lattice, populations,lattice.getReferenceLevel());
00375 }
00376 
00377 template<typename T, template<typename U> class Descriptor>
00378 std::auto_ptr<MultiGridScalarField3D<T> > computeAllPopulations(MultiGridLattice3D<T,Descriptor>& lattice,
00379                                                             Box3D domain)
00380 {
00381     MultiGridTensorField3D<T,Descriptor<T>::q>* populations = 
00382             new MultiGridTensorField3D<T,Descriptor<T>::q>(lattice, domain);
00383     computeAllPopulations(lattice, *populations, domain);
00384     return std::auto_ptr<MultiGridTensorField3D<T,Descriptor<T>::q> >(populations);
00385 }
00386 
00387 template<typename T, template<typename U> class Descriptor>
00388 std::auto_ptr<MultiGridTensorField3D<T,Descriptor<T>::q> > computeAllPopulations(MultiGridLattice3D<T,Descriptor>&
00389 lattice)
00390 {
00391     return computeAllPopulations(lattice, lattice.getBoundingBox());
00392 }
00393 
00394 template<typename T, template<typename U> class Descriptor>
00395 void copyPopulations(MultiGridLattice3D<T,Descriptor>& latticeFrom, MultiGridLattice3D<T,Descriptor>& latticeTo,
00396                      Box3D domain)
00397 {
00398     applyProcessingFunctional (
00399             new CopyPopulationsFunctional3D<T,Descriptor>(), domain, latticeFrom, latticeTo );
00400 }
00401 
00402 /* *************** Extract Sub-ScalarField *************************** */
00403 
00404 template<typename T>
00405 void extractSubDomain( MultiGridScalarField3D<T>& field,
00406                        MultiGridScalarField3D<T>& extractedField,
00407                        Box3D domain)
00408 {
00409     applyProcessingFunctional (
00410             new ExtractScalarSubDomainFunctional3D<T>, domain, field, extractedField, field.getReferenceLevel() );
00411 }
00412 
00413 template<typename T>
00414 std::auto_ptr<MultiGridScalarField3D<T> > extractSubDomain(MultiGridScalarField3D<T>& field, Box3D domain)
00415 {
00416     MultiGridScalarField3D<T>* extractedField = new MultiGridScalarField3D<T>(field, domain);
00417     extractSubDomain(field, *extractedField, domain);
00418     return std::auto_ptr<MultiGridScalarField3D<T> >(extractedField);
00419 }
00420 
00421 /* *************** MultiScalarField - Scalar operations *************** */
00422 
00423 template<typename T>
00424 void add(MultiGridScalarField3D<T>& field, T scalar, MultiGridScalarField3D<T>& result, Box3D domain)
00425 {
00426     applyProcessingFunctional (
00427             new A_plus_alpha_functional3D<T>(scalar), domain, field, result, field.getReferenceLevel() );
00428 }
00429 
00430 template<typename T>
00431 std::auto_ptr<MultiGridScalarField3D<T> > add(MultiGridScalarField3D<T>& field, T scalar, Box3D domain)
00432 {
00433     MultiGridScalarField3D<T>* result = new MultiGridScalarField3D<T>(field, domain);
00434     add(field, scalar, *result, domain);
00435     return std::auto_ptr<MultiGridScalarField3D<T> >(result);
00436 }
00437 
00438 template<typename T>
00439 std::auto_ptr<MultiGridScalarField3D<T> > add(MultiGridScalarField3D<T>& field, T scalar)
00440 {
00441     return add(field, scalar, field.getBoundingBox());
00442 }
00443 
00444 
00445 template<typename T>
00446 void add(T scalar, MultiGridScalarField3D<T>& field, MultiGridScalarField3D<T>& result, Box3D domain)
00447 {
00448     applyProcessingFunctional (
00449             new A_plus_alpha_functional3D<T>(scalar), domain, field, result, field.getReferenceLevel() );
00450 }
00451 
00452 template<typename T>
00453 std::auto_ptr<MultiGridScalarField3D<T> > add(T scalar, MultiGridScalarField3D<T>& field, Box3D domain)
00454 {
00455     MultiGridScalarField3D<T>* result = new MultiGridScalarField3D<T>(field, domain);
00456     add(scalar, field, *result, domain);
00457     return std::auto_ptr<MultiGridScalarField3D<T> >(result);
00458 }
00459 
00460 template<typename T>
00461 std::auto_ptr<MultiGridScalarField3D<T> > add(T scalar, MultiGridScalarField3D<T>& field)
00462 {
00463     return add(scalar, field, field.getBoundingBox());
00464 }
00465 
00466 
00467 template<typename T>
00468 void subtract(MultiGridScalarField3D<T>& field, T scalar, MultiGridScalarField3D<T>& result, Box3D domain)
00469 {
00470     applyProcessingFunctional (
00471             new A_minus_alpha_functional3D<T>(scalar), domain, field, result, field.getReferenceLevel() );
00472 }
00473 
00474 template<typename T>
00475 std::auto_ptr<MultiGridScalarField3D<T> > subtract(MultiGridScalarField3D<T>& field, T scalar, Box3D domain)
00476 {
00477     MultiGridScalarField3D<T>* result = new MultiGridScalarField3D<T>(field, domain);
00478     subtract(field, scalar, *result, domain);
00479     return std::auto_ptr<MultiGridScalarField3D<T> >(result);
00480 }
00481 
00482 template<typename T>
00483 std::auto_ptr<MultiGridScalarField3D<T> > subtract(MultiGridScalarField3D<T>& field, T scalar)
00484 {
00485     return subtract(field, scalar, field.getBoundingBox());
00486 }
00487 
00488 
00489 template<typename T>
00490 void subtract(T scalar, MultiGridScalarField3D<T>& field, MultiGridScalarField3D<T>& result, Box3D domain)
00491 {
00492     applyProcessingFunctional (
00493             new Alpha_minus_A_functional3D<T>(scalar), domain, field, result, field.getReferenceLevel() );
00494 }
00495 
00496 template<typename T>
00497 std::auto_ptr<MultiGridScalarField3D<T> > subtract(T scalar, MultiGridScalarField3D<T>& field, Box3D domain)
00498 {
00499     MultiGridScalarField3D<T>* result = new MultiGridScalarField3D<T>(field, domain);
00500     subtract(scalar, field, *result, domain);
00501     return std::auto_ptr<MultiGridScalarField3D<T> >(result);
00502 }
00503 
00504 template<typename T>
00505 std::auto_ptr<MultiGridScalarField3D<T> > subtract(T scalar, MultiGridScalarField3D<T>& field)
00506 {
00507     return subtract(scalar, field, field.getBoundingBox());
00508 }
00509 
00510 
00511 template<typename T>
00512 void multiply(MultiGridScalarField3D<T>& field, T scalar, MultiGridScalarField3D<T>& result, Box3D domain)
00513 {
00514     applyProcessingFunctional (
00515             new A_times_alpha_functional3D<T>(scalar), domain, field, result, field.getReferenceLevel() );
00516 }
00517 
00518 template<typename T>
00519 std::auto_ptr<MultiGridScalarField3D<T> > multiply(MultiGridScalarField3D<T>& field, T scalar, Box3D domain)
00520 {
00521     MultiGridScalarField3D<T>* result = new MultiGridScalarField3D<T>(field, domain);
00522     multiply(field, scalar, *result, domain);
00523     return std::auto_ptr<MultiGridScalarField3D<T> >(result);
00524 }
00525 
00526 template<typename T>
00527 std::auto_ptr<MultiGridScalarField3D<T> > multiply(MultiGridScalarField3D<T>& field, T scalar)
00528 {
00529     return multiply(field, scalar, field.getBoundingBox());
00530 }
00531 
00532 
00533 template<typename T>
00534 void multiply(T scalar, MultiGridScalarField3D<T>& field, MultiGridScalarField3D<T>& result, Box3D domain)
00535 {
00536     applyProcessingFunctional (
00537             new A_times_alpha_functional3D<T>(scalar), domain, field, result, field.getReferenceLevel() );
00538 }
00539 
00540 template<typename T>
00541 std::auto_ptr<MultiGridScalarField3D<T> > multiply(T scalar, MultiGridScalarField3D<T>& field, Box3D domain)
00542 {
00543     MultiGridScalarField3D<T>* result = new MultiGridScalarField3D<T>(field, domain);
00544     multiply(scalar, field, *result, domain);
00545     return std::auto_ptr<MultiGridScalarField3D<T> >(result);
00546 }
00547 
00548 template<typename T>
00549 std::auto_ptr<MultiGridScalarField3D<T> > multiply(T scalar, MultiGridScalarField3D<T>& field)
00550 {
00551     return multiply(scalar, field, field.getBoundingBox());
00552 }
00553 
00554 
00555 template<typename T>
00556 void divide(MultiGridScalarField3D<T>& field, T scalar, MultiGridScalarField3D<T>& result, Box3D domain)
00557 {
00558     applyProcessingFunctional (
00559             new A_dividedBy_alpha_functional3D<T>(scalar), domain, field, result, field.getReferenceLevel() );
00560 }
00561 
00562 template<typename T>
00563 std::auto_ptr<MultiGridScalarField3D<T> > divide(MultiGridScalarField3D<T>& field, T scalar, Box3D domain)
00564 {
00565     MultiGridScalarField3D<T>* result = new MultiGridScalarField3D<T>(field, domain);
00566     divide(field, scalar, *result, domain);
00567     return std::auto_ptr<MultiGridScalarField3D<T> >(result);
00568 }
00569 
00570 template<typename T>
00571 std::auto_ptr<MultiGridScalarField3D<T> > divide(MultiGridScalarField3D<T>& field, T scalar)
00572 {
00573     return divide(field, scalar, field.getBoundingBox());
00574 }
00575 
00576 
00577 template<typename T>
00578 void divide(T scalar, MultiGridScalarField3D<T>& field, MultiGridScalarField3D<T>& result, Box3D domain)
00579 {
00580     applyProcessingFunctional (
00581             new Alpha_dividedBy_A_functional3D<T>(scalar), domain, field, result, field.getReferenceLevel() );
00582 }
00583 
00584 template<typename T>
00585 std::auto_ptr<MultiGridScalarField3D<T> > divide(T scalar, MultiGridScalarField3D<T>& field, Box3D domain)
00586 {
00587     MultiGridScalarField3D<T>* result = new MultiGridScalarField3D<T>(field, domain);
00588     divide(scalar, field, *result, domain);
00589     return std::auto_ptr<MultiGridScalarField3D<T> >(result);
00590 }
00591 
00592 template<typename T>
00593 std::auto_ptr<MultiGridScalarField3D<T> > divide(T scalar, MultiGridScalarField3D<T>& field)
00594 {
00595     return divide(scalar, field, field.getBoundingBox());
00596 }
00597 
00598 
00599 /* *************** MultiScalarField - Scalar inplace operations *************** */
00600 
00601 template<typename T>
00602 void addInPlace(MultiGridScalarField3D<T>& field, T scalar, Box3D domain) {
00603     applyProcessingFunctional (
00604             new A_plus_alpha_inplace_functional3D<T>(scalar), domain, field, field.getReferenceLevel());
00605 }
00606 
00607 template<typename T>
00608 void addInPlace(MultiGridScalarField3D<T>& field, T scalar) {
00609     addInPlace(field, scalar, field.getBoundingBox());
00610 }
00611 
00612 
00613 template<typename T>
00614 void subtractInPlace(MultiGridScalarField3D<T>& field, T scalar, Box3D domain) {
00615     applyProcessingFunctional (
00616             new A_minus_alpha_inplace_functional3D<T>(scalar), domain, field, field.getReferenceLevel());
00617 }
00618 
00619 template<typename T>
00620 void subtractInPlace(MultiGridScalarField3D<T>& field, T scalar) {
00621     subtractInPlace(field, scalar, field.getBoundingBox());
00622 }
00623 
00624 
00625 template<typename T>
00626 void multiplyInPlace(MultiGridScalarField3D<T>& field, T scalar, Box3D domain) {
00627     applyProcessingFunctional (
00628             new A_times_alpha_inplace_functional3D<T>(scalar), domain, field, field.getReferenceLevel());
00629 }
00630 
00631 template<typename T>
00632 void multiplyInPlace(MultiGridScalarField3D<T>& field, T scalar) {
00633     multiplyInPlace(field, scalar, field.getBoundingBox());
00634 }
00635 
00636 
00637 template<typename T>
00638 void divideInPlace(MultiGridScalarField3D<T>& field, T scalar, Box3D domain) {
00639     applyProcessingFunctional (
00640             new A_dividedBy_alpha_inplace_functional3D<T>(scalar), domain, field, field.getReferenceLevel());
00641 }
00642 
00643 template<typename T>
00644 void divideInPlace(MultiGridScalarField3D<T>& field, T scalar) {
00645     divideInPlace(field, scalar, field.getBoundingBox());
00646 }
00647 
00648 
00649 /* *************** MultiScalarField - MultiScalarField operations *************** */
00650 
00651 template<typename T1, typename T2>
00652 void copyConvert(MultiGridScalarField3D<T1>& field, MultiGridScalarField3D<T2>& convertedField, Box3D domain)
00653 {
00654     applyProcessingFunctional (
00655             new CopyConvertScalarFunctional3D<T1,T2>, domain, field, convertedField, field.getReferenceLevel() );
00656 }
00657 
00658 template<typename T1, typename T2>
00659 std::auto_ptr<MultiGridScalarField3D<T2> > copyConvert(MultiGridScalarField3D<T1>& field, Box3D domain)
00660 {
00661     MultiGridScalarField3D<T2>* convertedField = new MultiGridScalarField3D<T2>(field, domain);
00662     copyConvert(field, *convertedField, domain);
00663     return std::auto_ptr<MultiGridScalarField3D<T2> >(convertedField);
00664 }
00665 
00666 template<typename T1, typename T2>
00667 std::auto_ptr<MultiGridScalarField3D<T2> > copyConvert(MultiGridScalarField3D<T1>& field)
00668 {
00669     return copyConvert<T1,T2>(field, field.getBoundingBox());
00670 }
00671 
00672 template<typename T>
00673 void add(MultiGridScalarField3D<T>& A, MultiGridScalarField3D<T>& B, MultiGridScalarField3D<T>& result, Box3D domain)
00674 {
00675     std::vector<MultiGridScalarField3D<T>* > fields;
00676     fields.push_back(&A);
00677     fields.push_back(&B);
00678     fields.push_back(&result);
00679     applyProcessingFunctional (
00680             new A_plus_B_functional3D<T>, domain, fields, A.getReferenceLevel() );
00681 }
00682 
00683 template<typename T>
00684 std::auto_ptr<MultiGridScalarField3D<T> > add(MultiGridScalarField3D<T>& A, MultiGridScalarField3D<T>& B, Box3D domain)
00685 {
00686     MultiGridScalarField3D<T>* result = new MultiGridScalarField3D<T>(A, domain);
00687     add(A, B, *result, domain);
00688     return std::auto_ptr<MultiGridScalarField3D<T> >(result);
00689 }
00690 
00691 template<typename T>
00692 std::auto_ptr<MultiGridScalarField3D<T> > add(MultiGridScalarField3D<T>& A, MultiGridScalarField3D<T>& B)
00693 {
00694     return add(A, B, A.getBoundingBox());
00695 }
00696 
00697 
00698 template<typename T>
00699 void subtract(MultiGridScalarField3D<T>& A, MultiGridScalarField3D<T>& B, MultiGridScalarField3D<T>& result, Box3D
00700 domain)
00701 {
00702     std::vector<MultiGridScalarField3D<T>* > fields;
00703     fields.push_back(&A);
00704     fields.push_back(&B);
00705     fields.push_back(&result);
00706     applyProcessingFunctional (
00707             new A_minus_B_functional3D<T>, domain, fields, A.getReferenceLevel() );
00708 }
00709 
00710 template<typename T>
00711 std::auto_ptr<MultiGridScalarField3D<T> > subtract(MultiGridScalarField3D<T>& A, MultiGridScalarField3D<T>& B, Box3D
00712 domain)
00713 {
00714     MultiGridScalarField3D<T>* result = new MultiGridScalarField3D<T>(A, domain);
00715     subtract(A, B, *result, domain);
00716     return std::auto_ptr<MultiGridScalarField3D<T> >(result);
00717 }
00718 
00719 template<typename T>
00720 std::auto_ptr<MultiGridScalarField3D<T> > subtract(MultiGridScalarField3D<T>& A, MultiGridScalarField3D<T>& B)
00721 {
00722     return subtract(A, B, A.getBoundingBox());
00723 }
00724 
00725 
00726 template<typename T>
00727 void multiply(MultiGridScalarField3D<T>& A, MultiGridScalarField3D<T>& B, MultiGridScalarField3D<T>& result, Box3D
00728 domain)
00729 {
00730     std::vector<MultiGridScalarField3D<T>* > fields;
00731     fields.push_back(&A);
00732     fields.push_back(&B);
00733     fields.push_back(&result);
00734     applyProcessingFunctional (
00735             new A_times_B_functional3D<T>, domain, fields, A.getReferenceLevel() );
00736 }
00737 
00738 template<typename T>
00739 std::auto_ptr<MultiGridScalarField3D<T> > multiply(MultiGridScalarField3D<T>& A, MultiGridScalarField3D<T>& B, Box3D
00740 domain)
00741 {
00742     MultiGridScalarField3D<T>* result = new MultiGridScalarField3D<T>(A, domain);
00743     multiply(A, B, *result, domain);
00744     return std::auto_ptr<MultiGridScalarField3D<T> >(result);
00745 }
00746 
00747 template<typename T>
00748 std::auto_ptr<MultiGridScalarField3D<T> > multiply(MultiGridScalarField3D<T>& A, MultiGridScalarField3D<T>& B)
00749 {
00750     return multiply(A, B, A.getBoundingBox());
00751 }
00752 
00753 template<typename T>
00754 void divide(MultiGridScalarField3D<T>& A, MultiGridScalarField3D<T>& B, MultiGridScalarField3D<T>& result, Box3D domain)
00755 {
00756     std::vector<MultiGridScalarField3D<T>* > fields;
00757     fields.push_back(&A);
00758     fields.push_back(&B);
00759     fields.push_back(&result);
00760     applyProcessingFunctional (
00761             new A_dividedBy_B_functional3D<T>, domain, fields, A.getReferenceLevel() );
00762 }
00763 
00764 template<typename T>
00765 std::auto_ptr<MultiGridScalarField3D<T> > divide(MultiGridScalarField3D<T>& A, MultiGridScalarField3D<T>& B, Box3D
00766 domain)
00767 {
00768     MultiGridScalarField3D<T>* result = new MultiGridScalarField3D<T>(A, domain);
00769     divide(A, B, *result, domain);
00770     return std::auto_ptr<MultiGridScalarField3D<T> >(result);
00771 }
00772 
00773 template<typename T>
00774 std::auto_ptr<MultiGridScalarField3D<T> > divide(MultiGridScalarField3D<T>& A, MultiGridScalarField3D<T>& B)
00775 {
00776     return divide(A, B, A.getBoundingBox());
00777 }
00778 
00779 
00780 /* *************** ScalarField - ScalarField inplace operations *************** */
00781 
00782 template<typename T>
00783 void addInPlace(MultiGridScalarField3D<T>& A, MultiGridScalarField3D<T>& B, Box3D domain) {
00784     applyProcessingFunctional (
00785             new A_plus_B_inplace_functional3D<T>, domain, A, B, A.getReferenceLevel() );
00786 }
00787 
00788 template<typename T>
00789 void addInPlace(MultiGridScalarField3D<T>& A, MultiGridScalarField3D<T>& B) {
00790     addInPlace(A, B, A.getBoundingBox());
00791 }
00792 
00793 
00794 template<typename T>
00795 void subtractInPlace(MultiGridScalarField3D<T>& A, MultiGridScalarField3D<T>& B, Box3D domain) {
00796     applyProcessingFunctional (
00797             new A_minus_B_inplace_functional3D<T>, domain, A, B, A.getReferenceLevel() );
00798 }
00799 
00800 template<typename T>
00801 void subtractInPlace(MultiGridScalarField3D<T>& A, MultiGridScalarField3D<T>& B) {
00802     subtractInPlace(A, B, A.getBoundingBox());
00803 }
00804 
00805 
00806 template<typename T>
00807 void multiplyInPlace(MultiGridScalarField3D<T>& A, MultiGridScalarField3D<T>& B, Box3D domain) {
00808     applyProcessingFunctional (
00809             new A_times_B_inplace_functional3D<T>, domain, A, B, A.getReferenceLevel() );
00810 }
00811 
00812 template<typename T>
00813 void multiplyInPlace(MultiGridScalarField3D<T>& A, MultiGridScalarField3D<T>& B) {
00814     multiplyInPlace(A,B, A.getBoundingBox());
00815 }
00816 
00817 
00818 template<typename T>
00819 void divideInPlace(MultiGridScalarField3D<T>& A, MultiGridScalarField3D<T>& B, Box3D domain) {
00820     applyProcessingFunctional (
00821             new A_dividedBy_B_inplace_functional3D<T>, domain, A, B, A.getReferenceLevel() );
00822 }
00823 
00824 template<typename T>
00825 void divideInPlace(MultiGridScalarField3D<T>& A, MultiGridScalarField3D<T>& B) {
00826     divideInPlace(A, B, A.getBoundingBox());
00827 }
00828 
00829 
00830 /* ******************************************************************* */
00831 /* *************** PART VI : Multi-block wrappers: Tensor-field ****** */
00832 /* ******************************************************************* */
00833 
00834 /* *************** Reductive functions ******************************* */
00835 
00836 template<typename T, plint nDim, class BoolMask> 
00837 plint count(MultiGridTensorField3D<T,nDim>& field, Box3D domain, BoolMask boolMask)
00838 {
00839     CountTensorElementsFunctional3D<T,nDim,BoolMask> functional(boolMask);
00840     applyProcessingFunctional(functional, domain, field, field.getReferenceLevel() );
00841     return functional.getCount();
00842 }
00843 
00844 template<typename T, plint nDim, class BoolMask> 
00845 plint count(MultiGridTensorField3D<T,nDim>& field, BoolMask boolMask)
00846 {
00847     return count(field, field.getBoundingBox(), boolMask);
00848 }
00849 
00850 /* *************** Extract Sub-TensorField *************************** */
00851 
00852 template<typename T, int nDim>
00853 void extractSubDomain( MultiGridTensorField3D<T,nDim>& field,
00854                        MultiGridTensorField3D<T,nDim>& extractedField,
00855                        Box3D domain)
00856 {
00857     applyProcessingFunctional (
00858             new ExtractTensorSubDomainFunctional3D<T,nDim>, domain, field, extractedField,
00859             field.getReferenceLevel() );
00860 }
00861 
00862 template<typename T, int nDim>
00863 std::auto_ptr<MultiGridTensorField3D<T,nDim> > extractSubDomain(MultiGridTensorField3D<T,nDim>& field, Box3D domain)
00864 {
00865     MultiGridTensorField3D<T,nDim>* extractedField = new MultiGridTensorField3D<T,nDim>(field, domain);
00866     extractSubDomain(field, *extractedField, domain);
00867     return std::auto_ptr<MultiGridTensorField3D<T,nDim> >(extractedField);
00868 }
00869 
00870 
00871 /* *************** Component (scalar-field) out of a tensor-field ****** */
00872 
00873 template<typename T, int nDim>
00874 void extractComponent(MultiGridTensorField3D<T,nDim>& tensorField, MultiGridScalarField3D<T>& component, Box3D domain,
00875 int iComponent)
00876 {
00877     applyProcessingFunctional (
00878             new ExtractTensorComponentFunctional3D<T,nDim>(iComponent),
00879             domain, component, tensorField, tensorField.getReferenceLevel() );
00880 }
00881 
00882 template<typename T, int nDim>
00883 std::auto_ptr<MultiGridScalarField3D<T> > extractComponent(MultiGridTensorField3D<T,nDim>& tensorField, Box3D domain,
00884 int iComponent)
00885 {
00886     MultiGridScalarField3D<T>* component = new MultiGridScalarField3D<T>(tensorField, domain);
00887     extractComponent(tensorField, *component, domain, iComponent);
00888     return std::auto_ptr<MultiGridScalarField3D<T> >(component);
00889 }
00890 
00891 template<typename T, int nDim>
00892 std::auto_ptr<MultiGridScalarField3D<T> > extractComponent(MultiGridTensorField3D<T,nDim>& tensorField, int iComponent)
00893 {
00894     return extractComponent(tensorField, tensorField.getBoundingBox(), iComponent);
00895 }
00896 
00897 
00898 /* *************** Vector-norm of each cell in the field *************** */
00899 
00900 template<typename T, int nDim>
00901 void computeNorm(MultiGridTensorField3D<T,nDim>& tensorField, MultiGridScalarField3D<T>& component, Box3D domain)
00902 {
00903     applyProcessingFunctional (
00904             new ComputeNormFunctional3D<T,nDim>, domain, component, tensorField, tensorField.getReferenceLevel() );
00905 }
00906 
00907 template<typename T, int nDim>
00908 std::auto_ptr<MultiGridScalarField3D<T> > computeNorm(MultiGridTensorField3D<T,nDim>& tensorField, Box3D domain)
00909 {
00910     MultiGridScalarField3D<T>* component = new MultiGridScalarField3D<T>(tensorField, domain);
00911     computeNorm(tensorField, *component, domain);
00912     return std::auto_ptr<MultiGridScalarField3D<T> >(component);
00913 }
00914 
00915 template<typename T, int nDim>
00916 std::auto_ptr<MultiGridScalarField3D<T> > computeNorm(MultiGridTensorField3D<T,nDim>& tensorField)
00917 {
00918     return computeNorm(tensorField, tensorField.getBoundingBox());
00919 }
00920 
00921 
00922 /* *************** Squared vector-norm of each cell in the field ******** */
00923 
00924 template<typename T, int nDim>
00925 void computeNormSqr(MultiGridTensorField3D<T,nDim>& tensorField, MultiGridScalarField3D<T>& component, Box3D domain)
00926 {
00927     applyProcessingFunctional (
00928             new ComputeNormSqrFunctional3D<T,nDim>, domain, component, tensorField, tensorField.getReferenceLevel() );
00929 }
00930 
00931 template<typename T, int nDim>
00932 std::auto_ptr<MultiGridScalarField3D<T> > computeNormSqr(MultiGridTensorField3D<T,nDim>& tensorField, Box3D domain)
00933 {
00934     MultiGridScalarField3D<T>* component = new MultiGridScalarField3D<T>(tensorField, domain);
00935     computeNormSqr(tensorField, *component, domain);
00936     return std::auto_ptr<MultiGridScalarField3D<T> >(component);
00937 }
00938 
00939 template<typename T, int nDim>
00940 std::auto_ptr<MultiGridScalarField3D<T> > computeNormSqr(MultiGridTensorField3D<T,nDim>& tensorField)
00941 {
00942     return computeNormSqr(tensorField, tensorField.getBoundingBox());
00943 }
00944 
00945 
00946 /* *************** Tensor-norm of each symmetric tensor of a field ***** */
00947 
00948 template<typename T>
00949 void computeSymmetricTensorNorm(MultiGridTensorField3D<T,3>& tensorField, MultiGridScalarField3D<T>& norm, Box3D domain)
00950 {
00951     applyProcessingFunctional (
00952             new ComputeSymmetricTensorNormFunctional3D<T>, domain, norm, tensorField, tensorField.getReferenceLevel() );
00953 }
00954 
00955 template<typename T>
00956 std::auto_ptr<MultiGridScalarField3D<T> > computeSymmetricTensorNorm(MultiGridTensorField3D<T,3>& tensorField, Box3D
00957 domain)
00958 {
00959     MultiGridScalarField3D<T>* norm = new MultiGridScalarField3D<T>(tensorField, domain);
00960     computeSymmetricTensorNorm(tensorField, *norm, domain);
00961     return std::auto_ptr<MultiGridScalarField3D<T> >(norm);
00962 }
00963 
00964 template<typename T>
00965 std::auto_ptr<MultiGridScalarField3D<T> > computeSymmetricTensorNorm(MultiGridTensorField3D<T,3>& tensorField)
00966 {
00967     return computeSymmetricTensorNorm(tensorField, tensorField.getBoundingBox());
00968 }
00969 
00970 
00971 /* *************** Squared Tensor-norm of each symmetric tensor of a field*/
00972 
00973 template<typename T>
00974 void computeSymmetricTensorNormSqr(MultiGridTensorField3D<T,3>& tensorField, MultiGridScalarField3D<T>& normSqr, Box3D
00975 domain)
00976 {
00977     applyProcessingFunctional (
00978             new ComputeSymmetricTensorNormSqrFunctional3D<T>, 
00979             domain, normSqr, tensorField, tensorField.getReferenceLevel() );
00980 }
00981 
00982 template<typename T>
00983 std::auto_ptr<MultiGridScalarField3D<T> > computeSymmetricTensorNormSqr(MultiGridTensorField3D<T,3>& tensorField, Box3D
00984 domain)
00985 {
00986     MultiGridScalarField3D<T>* normSqr = new MultiGridScalarField3D<T>(tensorField, domain);
00987     computeSymmetricTensorNormSqr(tensorField, *normSqr, domain);
00988     return std::auto_ptr<MultiGridScalarField3D<T> >(normSqr);
00989 }
00990 
00991 template<typename T>
00992 std::auto_ptr<MultiGridScalarField3D<T> > computeSymmetricTensorNormSqr(MultiGridTensorField3D<T,3>& tensorField)
00993 {
00994     return computeSymmetricTensorNormSqr(tensorField, tensorField.getBoundingBox());
00995 }
00996 
00997 
00998 /* *************** Trace of each symmetric tensor of a field ************ */
00999 
01000 template<typename T>
01001 void computeSymmetricTensorTrace(MultiGridTensorField3D<T,3>& tensorField, MultiGridScalarField3D<T>& trace, Box3D
01002 domain)
01003 {
01004     applyProcessingFunctional (
01005             new ComputeSymmetricTensorTraceFunctional3D<T>,
01006             domain, trace, tensorField, tensorField.getReferenceLevel() );
01007 }
01008 
01009 template<typename T>
01010 std::auto_ptr<MultiGridScalarField3D<T> > computeSymmetricTensorTrace(MultiGridTensorField3D<T,3>& tensorField, Box3D
01011 domain)
01012 {
01013     MultiGridScalarField3D<T>* trace = new MultiGridScalarField3D<T>(tensorField, domain);
01014     computeSymmetricTensorTrace(tensorField, *trace, domain);
01015     return std::auto_ptr<MultiGridScalarField3D<T> >(trace);
01016 }
01017 
01018 template<typename T>
01019 std::auto_ptr<MultiGridScalarField3D<T> > computeSymmetricTensorTrace(MultiGridTensorField3D<T,3>& tensorField)
01020 {
01021     return computeSymmetricTensorTrace(tensorField, tensorField.getBoundingBox());
01022 }
01023 
01024 
01025 /* *************** Vorticity from Velocity field *********************** */
01026 
01027 template<typename T>
01028 void computeVorticity(MultiGridTensorField3D<T,2>& velocity, MultiGridScalarField3D<T>& vorticity, Box3D domain)
01029 {
01030     plint envelopeWidth=1;
01031     applyProcessingFunctional (
01032             new BoxVorticityFunctional3D<T,2>, 
01033             domain, vorticity, velocity, velocity.getReferenceLevel(), envelopeWidth );
01034 }
01035 
01036 template<typename T>
01037 std::auto_ptr<MultiGridScalarField3D<T> > computeVorticity(MultiGridTensorField3D<T,2>& velocity, Box3D domain)
01038 {
01039     MultiGridScalarField3D<T>* vorticity = new MultiGridScalarField3D<T>(velocity, domain);
01040     computeVorticity(velocity, *vorticity, domain);
01041     return std::auto_ptr<MultiGridScalarField3D<T> >(vorticity);
01042 }
01043 
01044 template<typename T>
01045 std::auto_ptr<MultiGridScalarField3D<T> > computeVorticity(MultiGridTensorField3D<T,2>& velocity)
01046 {
01047     return computeVorticity(velocity, velocity.getBoundingBox());
01048 }
01049 
01050 
01051 /* *************** Vorticity, witout boundary treatment, from Velocity field  */
01052 
01053 template<typename T>
01054 void computeBulkVorticity(MultiGridTensorField3D<T,2>& velocity, MultiGridScalarField3D<T>& vorticity, Box3D domain)
01055 {
01056     applyProcessingFunctional (
01057             new BoxBulkVorticityFunctional3D<T,2>, domain, vorticity, velocity, velocity.getReferenceLevel() );
01058 }
01059 
01060 template<typename T>
01061 std::auto_ptr<MultiGridScalarField3D<T> > computeBulkVorticity(MultiGridTensorField3D<T,2>& velocity, Box3D domain)
01062 {
01063     MultiGridScalarField3D<T>* vorticity = new MultiGridScalarField3D<T>(velocity, domain);
01064     computeBulkVorticity(velocity, *vorticity, domain);
01065     return std::auto_ptr<MultiGridScalarField3D<T> >(vorticity);
01066 }
01067 
01068 template<typename T>
01069 std::auto_ptr<MultiGridScalarField3D<T> > computeBulkVorticity(MultiGridTensorField3D<T,2>& velocity)
01070 {
01071     return computeBulkVorticity(velocity, velocity.getBoundingBox());
01072 }
01073 
01074 
01075 
01076 /* *************** Strain Rate from Velocity field ********************* */
01077 
01078 template<typename T>
01079 void computeStrainRate(MultiGridTensorField3D<T,2>& velocity, MultiGridTensorField3D<T,3>& S, Box3D domain)
01080 {
01081     plint envelopeWidth=1;
01082     applyProcessingFunctional (
01083             new BoxStrainRateFunctional3D<T,2>, 
01084             domain, velocity, S, velocity.getReferenceLevel(), envelopeWidth );
01085 }
01086 
01087 template<typename T>
01088 std::auto_ptr<MultiGridTensorField3D<T,3> > computeStrainRate(MultiGridTensorField3D<T,2>& velocity, Box3D domain)
01089 {
01090     MultiGridTensorField3D<T,3>* S = new MultiGridTensorField3D<T,3>(velocity, domain);
01091     computeStrainRate(velocity, *S, domain);
01092     return std::auto_ptr<MultiGridTensorField3D<T,3> >(S);
01093 }
01094 
01095 template<typename T>
01096 std::auto_ptr<MultiGridTensorField3D<T,3> > computeStrainRate(MultiGridTensorField3D<T,2>& velocity)
01097 {
01098     return computeStrainRate(velocity, velocity.getBoundingBox());
01099 }
01100 
01101 
01102 /* *************** Str. rate, witout boundary treatment, from Velocity field  */
01103 
01104 template<typename T>
01105 void computeBulkStrainRate(MultiGridTensorField3D<T,2>& velocity, MultiGridTensorField3D<T,3>& S, Box3D domain)
01106 {
01107     plint envelopeWidth=1;
01108     applyProcessingFunctional (
01109             new BoxBulkStrainRateFunctional3D<T,2>, domain, velocity, S, velocity.getReferenceLevel() );
01110 }
01111 
01112 template<typename T>
01113 std::auto_ptr<MultiGridTensorField3D<T,3> > computeBulkStrainRate(MultiGridTensorField3D<T,2>& velocity, Box3D domain)
01114 {
01115     MultiGridTensorField3D<T,3>* S = new MultiGridTensorField3D<T,3>(velocity, domain);
01116     computeBulkStrainRate(velocity, *S, domain);
01117     return std::auto_ptr<MultiGridTensorField3D<T,3> >(S);
01118 }
01119 
01120 template<typename T>
01121 std::auto_ptr<MultiGridTensorField3D<T,3> > computeBulkStrainRate(MultiGridTensorField3D<T,2>& velocity)
01122 {
01123     return computeBulkStrainRate(velocity, velocity.getBoundingBox());
01124 }
01125 
01126 
01127 /* *************** MultiTensorField - MultiTensorField operations *************** */
01128 
01129 
01130 template<typename T1, typename T2, int nDim>
01131 void copyConvert(MultiGridTensorField3D<T1,nDim>& field, MultiGridTensorField3D<T2,nDim>& convertedField, Box3D domain)
01132 {
01133     applyProcessingFunctional (
01134             new CopyConvertTensorFunctional3D<T1,T2,nDim>, 
01135             domain, field, convertedField, field.getReferenceLevel() );
01136 }
01137 
01138 template<typename T1, typename T2, int nDim>
01139 std::auto_ptr<MultiGridTensorField3D<T2,nDim> > copyConvert(MultiGridTensorField3D<T1,nDim>& field, Box3D domain)
01140 {
01141     MultiGridTensorField3D<T2,nDim>* convertedField = new MultiGridTensorField3D<T2,nDim>(field, domain);
01142     copyConvert<T1,T2,nDim>(field, *convertedField, domain);
01143     return std::auto_ptr<MultiGridTensorField3D<T2,nDim> >(convertedField);
01144 }
01145 
01146 template<typename T1, typename T2, int nDim>
01147 std::auto_ptr<MultiGridTensorField3D<T2,nDim> > copyConvert(MultiGridTensorField3D<T1,nDim>& field)
01148 {
01149     return copyConvert<T1,T2,nDim>(field, field.getBoundingBox());
01150 }
01151 
01152 template<typename T, int nDim>
01153 void add(MultiGridTensorField3D<T,nDim>& A, MultiGridTensorField3D<T,nDim>& B, MultiGridTensorField3D<T,nDim>& result,
01154 Box3D domain)
01155 {
01156     std::vector<MultiGridTensorField3D<T,nDim>* > fields;
01157     fields.push_back(&A);
01158     fields.push_back(&B);
01159     fields.push_back(&result);
01160     applyProcessingFunctional (
01161             new Tensor_A_plus_B_functional3D<T,nDim>, domain, fields, A.getReferenceLevel() );
01162 }
01163 
01164 template<typename T, int nDim>
01165 std::auto_ptr<MultiGridTensorField3D<T,nDim> > add(MultiGridTensorField3D<T,nDim>& A, MultiGridTensorField3D<T,nDim>& B,
01166 Box3D domain)
01167 {
01168     MultiGridTensorField3D<T,nDim>* result = new MultiGridTensorField3D<T,nDim>(A, domain);
01169     add(A, B, *result, domain);
01170     return std::auto_ptr<MultiGridTensorField3D<T,nDim> >(result);
01171 }
01172 
01173 template<typename T, int nDim>
01174 std::auto_ptr<MultiGridTensorField3D<T,nDim> > add(MultiGridTensorField3D<T,nDim>& A, MultiGridTensorField3D<T,nDim>& B)
01175 {
01176     return add(A, B, A.getBoundingBox());
01177 }
01178 
01179 
01180 template<typename T, int nDim>
01181 void subtract(MultiGridTensorField3D<T,nDim>& A, MultiGridTensorField3D<T,nDim>& B, MultiGridTensorField3D<T,nDim>&
01182 result, Box3D domain)
01183 {
01184     std::vector<MultiGridTensorField3D<T,nDim>* > fields;
01185     fields.push_back(&A);
01186     fields.push_back(&B);
01187     fields.push_back(&result);
01188     applyProcessingFunctional (
01189             new Tensor_A_minus_B_functional3D<T,nDim>, domain, fields, A.getReferenceLevel() );
01190 }
01191 
01192 template<typename T, int nDim>
01193 std::auto_ptr<MultiGridTensorField3D<T,nDim> > subtract(MultiGridTensorField3D<T,nDim>& A,
01194 MultiGridTensorField3D<T,nDim>& B, Box3D domain)
01195 {
01196     MultiGridTensorField3D<T,nDim>* result = new MultiGridTensorField3D<T,nDim>(A, domain);
01197     subtract(A, B, *result, domain);
01198     return std::auto_ptr<MultiGridTensorField3D<T,nDim> >(result);
01199 }
01200 
01201 template<typename T, int nDim>
01202 std::auto_ptr<MultiGridTensorField3D<T,nDim> > subtract(MultiGridTensorField3D<T,nDim>& A,
01203 MultiGridTensorField3D<T,nDim>& B)
01204 {
01205     return subtract(A, B, A.getBoundingBox());
01206 }
01207 
01208 
01209 template<typename T, int nDim>
01210 void multiply(MultiGridTensorField3D<T,nDim>& A, MultiGridTensorField3D<T,nDim>& B, MultiGridTensorField3D<T,nDim>&
01211 result, Box3D domain)
01212 {
01213     std::vector<MultiGridTensorField3D<T,nDim>* > fields;
01214     fields.push_back(&A);
01215     fields.push_back(&B);
01216     fields.push_back(&result);
01217     applyProcessingFunctional (
01218             new Tensor_A_times_B_functional3D<T,nDim>, domain, fields, A.getReferenceLevel() );
01219 }
01220 
01221 template<typename T, int nDim>
01222 std::auto_ptr<MultiGridTensorField3D<T,nDim> > multiply(MultiGridTensorField3D<T,nDim>& A,
01223 MultiGridTensorField3D<T,nDim>& B, Box3D domain)
01224 {
01225     MultiGridTensorField3D<T,nDim>* result = new MultiGridTensorField3D<T,nDim>(A, domain);
01226     multiply(A, B, *result, domain);
01227     return std::auto_ptr<MultiGridTensorField3D<T,nDim> >(result);
01228 }
01229 
01230 template<typename T, int nDim>
01231 std::auto_ptr<MultiGridTensorField3D<T,nDim> > multiply(MultiGridTensorField3D<T,nDim>& A,
01232 MultiGridTensorField3D<T,nDim>& B)
01233 {
01234     return multiply(A, B, A.getBoundingBox());
01235 }
01236 
01237 template<typename T, int nDim>
01238 void divide(MultiGridTensorField3D<T,nDim>& A, MultiGridTensorField3D<T,nDim>& B, MultiGridTensorField3D<T,nDim>&
01239 result, Box3D domain)
01240 {
01241     std::vector<MultiGridTensorField3D<T,nDim>* > fields;
01242     fields.push_back(&A);
01243     fields.push_back(&B);
01244     fields.push_back(&result);
01245     applyProcessingFunctional (
01246             new Tensor_A_dividedBy_B_functional3D<T,nDim>, domain, fields, A.getReferenceLevel() );
01247 }
01248 
01249 template<typename T, int nDim>
01250 std::auto_ptr<MultiGridTensorField3D<T,nDim> > divide(MultiGridTensorField3D<T,nDim>& A, MultiGridTensorField3D<T,nDim>&
01251 B, Box3D domain)
01252 {
01253     MultiGridTensorField3D<T,nDim>* result = new MultiGridTensorField3D<T,nDim>(A, domain);
01254     divide(A, B, *result, domain);
01255     return std::auto_ptr<MultiGridTensorField3D<T,nDim> >(result);
01256 }
01257 
01258 template<typename T, int nDim>
01259 std::auto_ptr<MultiGridTensorField3D<T,nDim> > divide(MultiGridTensorField3D<T,nDim>& A, MultiGridTensorField3D<T,nDim>&
01260 B)
01261 {
01262     return divide(A, B, A.getBoundingBox());
01263 }
01264 
01265 
01266 /* *************** TensorField - TensorField inplace operations *************** */
01267 
01268 template<typename T, int nDim>
01269 void addInPlace(MultiGridTensorField3D<T,nDim>& A, MultiGridTensorField3D<T,nDim>& B, Box3D domain) {
01270     applyProcessingFunctional (
01271             new Tensor_A_plus_B_inplace_functional3D<T,nDim>, domain, A, B, A.getReferenceLevel() );
01272 }
01273 
01274 template<typename T, int nDim>
01275 void addInPlace(MultiGridTensorField3D<T,nDim>& A, MultiGridTensorField3D<T,nDim>& B) {
01276     addInPlace(A, B, A.getBoundingBox());
01277 }
01278 
01279 
01280 template<typename T, int nDim>
01281 void subtractInPlace(MultiGridTensorField3D<T,nDim>& A, MultiGridTensorField3D<T,nDim>& B, Box3D domain) {
01282     applyProcessingFunctional (
01283             new Tensor_A_minus_B_inplace_functional3D<T,nDim>, domain, A, B );
01284 }
01285 
01286 template<typename T, int nDim>
01287 void subtractInPlace(MultiGridTensorField3D<T,nDim>& A, MultiGridTensorField3D<T,nDim>& B) {
01288     subtractInPlace(A, B, A.getBoundingBox());
01289 }
01290 
01291 
01292 template<typename T, int nDim>
01293 void multiplyInPlace(MultiGridTensorField3D<T,nDim>& A, MultiGridTensorField3D<T,nDim>& B, Box3D domain) {
01294     applyProcessingFunctional (
01295             new Tensor_A_times_B_inplace_functional3D<T,nDim>, domain, A, B, A.getReferenceLevel() );
01296 }
01297 
01298 template<typename T, int nDim>
01299 void multiplyInPlace(MultiGridTensorField3D<T,nDim>& A, MultiGridTensorField3D<T,nDim>& B) {
01300     multiplyInPlace(A,B, A.getBoundingBox());
01301 }
01302 
01303 
01304 template<typename T, int nDim>
01305 void multiplyInPlace(MultiGridTensorField3D<T,nDim>& A, T alpha, Box3D domain) {
01306     applyProcessingFunctional (
01307             new Tensor_A_times_alpha_inplace_functional3D<T,nDim>(alpha), domain, A, A.getReferenceLevel());
01308 }
01309 
01310 template<typename T, int nDim>
01311 void multiplyInPlace(MultiGridTensorField3D<T,nDim>& A, T alpha)
01312 {
01313     multiplyInPlace(A,alpha, A.getBoundingBox());
01314 }
01315 
01316 
01317 template<typename T, int nDim>
01318 void divideInPlace(MultiGridTensorField3D<T,nDim>& A, MultiGridTensorField3D<T,nDim>& B, Box3D domain) {
01319     applyProcessingFunctional (
01320             new Tensor_A_dividedBy_B_inplace_functional3D<T,nDim>, domain, A, B, A.getReferenceLevel() );
01321 }
01322 
01323 template<typename T, int nDim>
01324 void divideInPlace(MultiGridTensorField3D<T,nDim>& A, MultiGridTensorField3D<T,nDim>& B) {
01325     divideInPlace(A, B, A.getBoundingBox());
01326 }
01327 
01328 
01329 } // namespace plb
01330 
01331 #endif // MULTI_GRID_DATA_ANALYSIS_WRAPPER_3D_HH
01332