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