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