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

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