$treeview $search $mathjax
|
Palabos
Version 1.1
$projectbrief
|
$projectbrief
|
$searchbox |
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
1.6.3
1.6.3