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

dataAnalysisWrapper3D.h

Go to the documentation of this file.
00001 /* This file is part of the Palabos library.
00002  *
00003  * Copyright (C) 2011 FlowKit Sarl
00004  * Avenue de Chailly 23
00005  * 1012 Lausanne, Switzerland
00006  * E-mail contact: contact@flowkit.com
00007  *
00008  * The most recent release of Palabos can be downloaded at 
00009  * <http://www.palabos.org/>
00010  *
00011  * The library Palabos is free software: you can redistribute it and/or
00012  * modify it under the terms of the GNU Affero General Public License as
00013  * published by the Free Software Foundation, either version 3 of the
00014  * License, or (at your option) any later version.
00015  *
00016  * The library is distributed in the hope that it will be useful,
00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019  * GNU Affero General Public License for more details.
00020  *
00021  * You should have received a copy of the GNU Affero General Public License
00022  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
00023 */
00024 
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