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