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

reductiveMultiDataProcessorWrapper3D.hh

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 
00025 
00026 #ifndef REDUCTIVE_MULTI_DATA_PROCESSOR_WRAPPER_3D_HH
00027 #define REDUCTIVE_MULTI_DATA_PROCESSOR_WRAPPER_3D_HH
00028 
00029 #include "multiBlock/reductiveMultiDataProcessorWrapper3D.h"
00030 #include "multiBlock/multiBlockLattice3D.h"
00031 #include "multiBlock/multiDataField3D.h"
00032 #include "multiBlock/multiBlockOperations3D.h"
00033 #include "atomicBlock/dataProcessor3D.h"
00034 #include "core/plbDebug.h"
00035 
00036 namespace plb {
00037 
00038 /* *************** LatticeBoxProcessing3D ****************************************** */
00039 
00040 template<typename T, template<typename U> class Descriptor>
00041 void applyProcessingFunctional (
00042         ReductiveLatticeBoxProcessingFunctional3D<T,Descriptor>& functional,
00043         Box3D domain,
00044         std::vector<MultiBlockLattice3D<T,Descriptor>*> lattices )
00045 {
00046     std::vector<MultiBlock3D*> multiBlocks(lattices.size());
00047     for (pluint iLattice=0; iLattice<lattices.size(); ++iLattice) {
00048         multiBlocks[iLattice] = dynamic_cast<MultiBlock3D*>(lattices[iLattice]);
00049     }
00050     ReductiveBoxProcessorGenerator3D generator(functional.clone(), domain);
00051     executeDataProcessor( generator, multiBlocks );
00052     functional.getStatistics() = generator.getFunctional().getStatistics();
00053 }
00054 
00055 
00056 /* *************** MultiScalarFieldBoxProcessing3D ******************************* */
00057 
00058 template<typename T>
00059 void applyProcessingFunctional(ReductiveScalarFieldBoxProcessingFunctional3D<T>& functional,
00060                                Box3D domain,
00061                                std::vector<MultiScalarField3D<T>*> fields )
00062 {
00063     std::vector<MultiBlock3D*> multiBlocks(fields.size());
00064     for (pluint iField=0; iField<fields.size(); ++iField) {
00065         multiBlocks[iField] = dynamic_cast<MultiBlock3D*>(fields[iField]);
00066     }
00067     ReductiveBoxProcessorGenerator3D generator(functional.clone(), domain);
00068     executeDataProcessor( generator, multiBlocks );
00069     functional.getStatistics() = generator.getFunctional().getStatistics();
00070 }
00071 
00072 
00073 /* *************** MultiTensorFieldBoxProcessing3D ******************************* */
00074 
00075 template<typename T, int nDim>
00076 void applyProcessingFunctional (
00077         ReductiveTensorFieldBoxProcessingFunctional3D<T,nDim>& functional,
00078         Box3D domain,
00079         std::vector<MultiTensorField3D<T,nDim>*> fields )
00080 {
00081     std::vector<MultiBlock3D*> multiBlocks(fields.size());
00082     for (pluint iField=0; iField<fields.size(); ++iField) {
00083         multiBlocks[iField] = dynamic_cast<MultiBlock3D*>(fields[iField]);
00084     }
00085     ReductiveBoxProcessorGenerator3D generator(functional.clone(), domain);
00086     executeDataProcessor( generator, multiBlocks );
00087     functional.getStatistics() = generator.getFunctional().getStatistics();
00088 }
00089 
00090 /* *************** MultiNTensorFieldBoxProcessing3D ******************************* */
00091 
00092 template<typename T>
00093 void applyProcessingFunctional (
00094         ReductiveNTensorFieldBoxProcessingFunctional3D<T>& functional,
00095         Box3D domain,
00096         std::vector<MultiNTensorField3D<T>*> fields )
00097 {
00098     std::vector<MultiBlock3D*> multiBlocks(fields.size());
00099     for (pluint iField=0; iField<fields.size(); ++iField) {
00100         multiBlocks[iField] = dynamic_cast<MultiBlock3D*>(fields[iField]);
00101     }
00102     ReductiveBoxProcessorGenerator3D generator(functional.clone(), domain);
00103     executeDataProcessor( generator, multiBlocks );
00104     functional.getStatistics() = generator.getFunctional().getStatistics();
00105 }
00106 
00107 /* *************** ReductiveBoxProcessing3D_L ******************************************* */
00108 
00109 template<typename T, template<typename U> class Descriptor>
00110 void applyProcessingFunctional(ReductiveBoxProcessingFunctional3D_L<T,Descriptor>& functional,
00111                                Box3D domain, MultiBlockLattice3D<T,Descriptor>& lattice)
00112 {
00113     ReductiveBoxProcessorGenerator3D generator(functional.clone(), domain);
00114     executeDataProcessor( generator, lattice );
00115     functional.getStatistics() = generator.getFunctional().getStatistics();
00116 }
00117 
00118 
00119 /* *************** ReductiveBoxProcessing3D_S ******************************************* */
00120 
00121 template<typename T>
00122 void applyProcessingFunctional(ReductiveBoxProcessingFunctional3D_S<T>& functional,
00123                                Box3D domain, MultiScalarField3D<T>& field)
00124 {
00125     ReductiveBoxProcessorGenerator3D generator(functional.clone(), domain);
00126     executeDataProcessor( generator, field );
00127     functional.getStatistics() = generator.getFunctional().getStatistics();
00128 }
00129 
00130 
00131 /* *************** ReductiveBoxProcessing3D_T ******************************************* */
00132 
00133 template<typename T, int nDim>
00134 void applyProcessingFunctional(ReductiveBoxProcessingFunctional3D_T<T,nDim>& functional,
00135                                Box3D domain, MultiTensorField3D<T,nDim>& field)
00136 {
00137     ReductiveBoxProcessorGenerator3D generator(functional.clone(), domain);
00138     executeDataProcessor( generator, field );
00139     functional.getStatistics() = generator.getFunctional().getStatistics();
00140 }
00141 
00142 /* *************** ReductiveBoxProcessing3D_N ******************************************* */
00143 
00144 template<typename T>
00145 void applyProcessingFunctional(ReductiveBoxProcessingFunctional3D_N<T>& functional,
00146                                Box3D domain, MultiNTensorField3D<T>& field)
00147 {
00148     ReductiveBoxProcessorGenerator3D generator(functional.clone(), domain);
00149     executeDataProcessor( generator, field );
00150     functional.getStatistics() = generator.getFunctional().getStatistics();
00151 }
00152 
00153 /* *************** MaskedReductiveBoxProcessing3D_N ******************************************* */
00154 
00155 template<typename T>
00156 void applyProcessingFunctional(MaskedReductiveBoxProcessingFunctional3D_N<T>& functional,
00157                                Box3D domain,
00158                                MultiNTensorField3D<T>& field,
00159                                MultiNTensorField3D<int>& mask)
00160 {
00161     ReductiveBoxProcessorGenerator3D generator(functional.clone(), domain);
00162     executeDataProcessor( generator, field, mask );
00163     functional.getStatistics() = generator.getFunctional().getStatistics();
00164 }
00165 
00166 /* *************** ReductiveBoxProcessing3D_LL******************************************* */
00167 
00168 template<typename T1, template<typename U1> class Descriptor1,
00169          typename T2, template<typename U2> class Descriptor2>
00170 void applyProcessingFunctional (
00171         ReductiveBoxProcessingFunctional3D_LL<T1,Descriptor1,T2,Descriptor2>& functional,
00172         Box3D domain,
00173         MultiBlockLattice3D<T1,Descriptor1>& lattice1,
00174         MultiBlockLattice3D<T2,Descriptor2>& lattice2 )
00175 {
00176     ReductiveBoxProcessorGenerator3D generator(functional.clone(), domain);
00177     executeDataProcessor( generator, lattice1, lattice2 );
00178     functional.getStatistics() = generator.getFunctional().getStatistics();
00179 }
00180 
00181 
00182 /* *************** ReductiveBoxProcessing3D_SS ****************************************** */
00183 
00184 template<typename T1, typename T2>
00185 void applyProcessingFunctional(ReductiveBoxProcessingFunctional3D_SS<T1,T2>& functional,
00186                                Box3D domain,
00187                                MultiScalarField3D<T1>& field1,
00188                                MultiScalarField3D<T2>& field2 )
00189 {
00190     ReductiveBoxProcessorGenerator3D generator(functional.clone(), domain);
00191     executeDataProcessor( generator, field1, field2 );
00192     functional.getStatistics() = generator.getFunctional().getStatistics();
00193 }
00194 
00195 /* *************** ReductiveBoxProcessing3D_TT ****************************************** */
00196 
00197 template<typename T1, int nDim1, typename T2, int nDim2>
00198 void applyProcessingFunctional (
00199         ReductiveBoxProcessingFunctional3D_TT<T1,nDim1,T2,nDim2>& functional,
00200         Box3D domain,
00201         MultiTensorField3D<T1,nDim1>& field1,
00202         MultiTensorField3D<T2,nDim2>& field2 )
00203 {
00204     ReductiveBoxProcessorGenerator3D generator(functional.clone(), domain);
00205     executeDataProcessor( generator, field1, field2 );
00206     functional.getStatistics() = generator.getFunctional().getStatistics();
00207 }
00208 
00209 /* *************** ReductiveBoxProcessing3D_NN ****************************************** */
00210 
00211 template<typename T1, typename T2>
00212 void applyProcessingFunctional (
00213         ReductiveBoxProcessingFunctional3D_NN<T1,T2>& functional,
00214         Box3D domain,
00215         MultiNTensorField3D<T1>& field1,
00216         MultiNTensorField3D<T2>& field2 )
00217 {
00218     ReductiveBoxProcessorGenerator3D generator(functional.clone(), domain);
00219     executeDataProcessor( generator, field1, field2 );
00220     functional.getStatistics() = generator.getFunctional().getStatistics();
00221 }
00222 
00223 /* *************** MaskedReductiveBoxProcessing3D_NN ****************************************** */
00224 
00225 template<typename T1, typename T2>
00226 void applyProcessingFunctional (
00227         MaskedReductiveBoxProcessingFunctional3D_NN<T1,T2>& functional,
00228         Box3D domain,
00229         MultiNTensorField3D<T1>& field1,
00230         MultiNTensorField3D<T2>& field2,
00231         MultiNTensorField3D<int>& mask )
00232 {
00233     std::vector<MultiBlock3D*> multiBlocks(3);
00234     multiBlocks[0] = dynamic_cast<MultiBlock3D*>(&field1);
00235     multiBlocks[1] = dynamic_cast<MultiBlock3D*>(&field2);
00236     multiBlocks[2] = dynamic_cast<MultiBlock3D*>(&mask);
00237     ReductiveBoxProcessorGenerator3D generator(functional.clone(), domain);
00238     executeDataProcessor( generator, multiBlocks );
00239     functional.getStatistics() = generator.getFunctional().getStatistics();
00240 }
00241 
00242 /* *************** ReductiveBoxProcessing3D_ST ****************************************** */
00243 
00244 template<typename T1, typename T2, int nDim>
00245 void applyProcessingFunctional(ReductiveBoxProcessingFunctional3D_ST<T1,T2,nDim>& functional,
00246                                Box3D domain,
00247                                MultiScalarField3D<T1>& field1,
00248                                MultiTensorField3D<T2,nDim>& field2 )
00249 {
00250     ReductiveBoxProcessorGenerator3D generator(functional.clone(), domain);
00251     executeDataProcessor( generator, field1, field2 );
00252     functional.getStatistics() = generator.getFunctional().getStatistics();
00253 }
00254 
00255 
00256 /* *************** ReductiveBoxProcessing3D_SN ****************************************** */
00257 
00258 template<typename T1, typename T2>
00259 void applyProcessingFunctional(ReductiveBoxProcessingFunctional3D_SN<T1,T2>& functional,
00260                                Box3D domain,
00261                                MultiScalarField3D<T1>& field1,
00262                                MultiNTensorField3D<T2>& field2 )
00263 {
00264     ReductiveBoxProcessorGenerator3D generator(functional.clone(), domain);
00265     executeDataProcessor( generator, field1, field2 );
00266     functional.getStatistics() = generator.getFunctional().getStatistics();
00267 }
00268 
00269 
00270 /* *************** ReductiveBoxProcessing3D_LS ****************************************** */
00271 
00272 template<typename T1, template<typename U> class Descriptor, typename T2>
00273 void applyProcessingFunctional (
00274         ReductiveBoxProcessingFunctional3D_LS<T1,Descriptor,T2>& functional,
00275         Box3D domain,
00276         MultiBlockLattice3D<T1,Descriptor>& lattice,
00277         MultiScalarField3D<T2>& field )
00278 {
00279     ReductiveBoxProcessorGenerator3D generator(functional.clone(), domain);
00280     executeDataProcessor( generator, lattice, field );
00281     functional.getStatistics() = generator.getFunctional().getStatistics();
00282 }
00283 
00284 
00285 /* *************** ReductiveBoxProcessing3D_LT ****************************************** */
00286 
00287 template<typename T1, template<typename U> class Descriptor, typename T2, int nDim>
00288 void applyProcessingFunctional (
00289         ReductiveBoxProcessingFunctional3D_LT<T1,Descriptor,T2,nDim>& functional,
00290         Box3D domain,
00291         MultiBlockLattice3D<T1,Descriptor>& lattice,
00292         MultiTensorField3D<T2,nDim>& field )
00293 {
00294     ReductiveBoxProcessorGenerator3D generator(functional.clone(), domain);
00295     executeDataProcessor( generator, lattice, field );
00296     functional.getStatistics() = generator.getFunctional().getStatistics();
00297 }
00298 
00299 /* *************** ReductiveBoxProcessing3D_LN ****************************************** */
00300 
00301 template<typename T1, template<typename U> class Descriptor, typename T2>
00302 void applyProcessingFunctional (
00303         ReductiveBoxProcessingFunctional3D_LN<T1,Descriptor,T2>& functional,
00304         Box3D domain,
00305         MultiBlockLattice3D<T1,Descriptor>& lattice,
00306         MultiNTensorField3D<T2>& field )
00307 {
00308     ReductiveBoxProcessorGenerator3D generator(functional.clone(), domain);
00309     executeDataProcessor( generator, lattice, field );
00310     functional.getStatistics() = generator.getFunctional().getStatistics();
00311 }
00312 
00313 /* *************** MaskedReductiveBoxProcessing3D_LN ****************************************** */
00314 
00315 template<typename T1, template<typename U> class Descriptor, typename T2>
00316 void applyProcessingFunctional (
00317         MaskedReductiveBoxProcessingFunctional3D_LN<T1,Descriptor,T2>& functional,
00318         Box3D domain,
00319         MultiBlockLattice3D<T1,Descriptor>& lattice,
00320         MultiNTensorField3D<T2>& field,
00321         MultiNTensorField3D<int>& mask )
00322 {
00323     std::vector<MultiBlock3D*> multiBlocks(3);
00324     multiBlocks[0] = dynamic_cast<MultiBlock3D*>(&lattice);
00325     multiBlocks[1] = dynamic_cast<MultiBlock3D*>(&field);
00326     multiBlocks[2] = dynamic_cast<MultiBlock3D*>(&mask);
00327     ReductiveBoxProcessorGenerator3D generator(functional.clone(), domain);
00328     executeDataProcessor( generator, multiBlocks );
00329     functional.getStatistics() = generator.getFunctional().getStatistics();
00330 }
00331 
00332 /* *************** LatticeDotProcessing3D ****************************************** */
00333 
00334 template<typename T, template<typename U> class Descriptor>
00335 void applyProcessingFunctional (
00336         ReductiveLatticeDotProcessingFunctional3D<T,Descriptor>& functional,
00337         DotList3D const& dotList,
00338         std::vector<MultiBlockLattice3D<T,Descriptor>*> lattices )
00339 {
00340     std::vector<MultiBlock3D*> multiBlocks(lattices.size());
00341     for (pluint iLattice=0; iLattice<lattices.size(); ++iLattice) {
00342         multiBlocks[iLattice] = dynamic_cast<MultiBlock3D*>(lattices[iLattice]);
00343     }
00344     ReductiveDotProcessorGenerator3D generator(functional.clone(), dotList);
00345     executeDataProcessor( generator, multiBlocks );
00346     functional.getStatistics() = generator.getFunctional().getStatistics();
00347 }
00348 
00349 
00350 /* *************** ScalarFieldDotProcessing3D ****************************************** */
00351 
00352 template<typename T>
00353 void applyProcessingFunctional(ReductiveScalarFieldDotProcessingFunctional3D<T>& functional,
00354                                DotList3D const& dotList,
00355                                std::vector<MultiScalarField3D<T>*> fields )
00356 {
00357     std::vector<MultiBlock3D*> multiBlocks(fields.size());
00358     for (pluint iField=0; iField<fields.size(); ++iField) {
00359         multiBlocks[iField] = dynamic_cast<MultiBlock3D*>(fields[iField]);
00360     }
00361     ReductiveDotProcessorGenerator3D generator(functional.clone(), dotList);
00362     executeDataProcessor( generator, multiBlocks );
00363     functional.getStatistics() = generator.getFunctional().getStatistics();
00364 }
00365 
00366 
00367 
00368 /* *************** TensorFieldDotProcessing3D ****************************************** */
00369 
00370 template<typename T, int nDim>
00371 void applyProcessingFunctional (
00372         ReductiveTensorFieldDotProcessingFunctional3D<T,nDim>& functional,
00373         DotList3D const& dotList,
00374         std::vector<MultiTensorField3D<T,nDim>*> fields )
00375 {
00376     std::vector<MultiBlock3D*> multiBlocks(fields.size());
00377     for (pluint iField=0; iField<fields.size(); ++iField) {
00378         multiBlocks[iField] = dynamic_cast<MultiBlock3D*>(fields[iField]);
00379     }
00380     ReductiveDotProcessorGenerator3D generator(functional.clone(), dotList);
00381     executeDataProcessor( generator, multiBlocks );
00382     functional.getStatistics() = generator.getFunctional().getStatistics();
00383 }
00384 
00385 /* *************** NTensorFieldDotProcessing3D ****************************************** */
00386 
00387 template<typename T>
00388 void applyProcessingFunctional (
00389         ReductiveNTensorFieldDotProcessingFunctional3D<T>& functional,
00390         DotList3D const& dotList,
00391         std::vector<MultiNTensorField3D<T>*> fields )
00392 {
00393     std::vector<MultiBlock3D*> multiBlocks(fields.size());
00394     for (pluint iField=0; iField<fields.size(); ++iField) {
00395         multiBlocks[iField] = dynamic_cast<MultiBlock3D*>(fields[iField]);
00396     }
00397     ReductiveDotProcessorGenerator3D generator(functional.clone(), dotList);
00398     executeDataProcessor( generator, multiBlocks );
00399     functional.getStatistics() = generator.getFunctional().getStatistics();
00400 }
00401 
00402 /* *************** ReductiveDotProcessing3D_L ******************************************* */
00403 
00404 template<typename T, template<typename U> class Descriptor>
00405 void applyProcessingFunctional(ReductiveDotProcessingFunctional3D_L<T,Descriptor>& functional,
00406                                DotList3D const& dotList,
00407                                MultiBlockLattice3D<T,Descriptor>& lattice)
00408 {
00409     ReductiveDotProcessorGenerator3D generator(functional.clone(), dotList);
00410     executeDataProcessor( generator, lattice );
00411     functional.getStatistics() = generator.getFunctional().getStatistics();
00412 }
00413 
00414 
00415 /* *************** ReductiveDotProcessing3D_S ******************************************* */
00416 
00417 template<typename T>
00418 void applyProcessingFunctional(ReductiveDotProcessingFunctional3D_S<T>& functional,
00419                                DotList3D const& dotList, MultiScalarField3D<T>& field)
00420 {
00421     ReductiveDotProcessorGenerator3D generator(functional.clone(), dotList);
00422     executeDataProcessor( generator, field );
00423     functional.getStatistics() = generator.getFunctional().getStatistics();
00424 }
00425 
00426 
00427 /* *************** ReductiveDotProcessing3D_T ******************************************* */
00428 
00429 template<typename T, int nDim>
00430 void applyProcessingFunctional(ReductiveDotProcessingFunctional3D_T<T,nDim>& functional,
00431                                DotList3D const& dotList,
00432                                MultiTensorField3D<T,nDim>& field)
00433 {
00434     ReductiveDotProcessorGenerator3D generator(functional.clone(), dotList);
00435     executeDataProcessor( generator, field );
00436     functional.getStatistics() = generator.getFunctional().getStatistics();
00437 }
00438 
00439 /* *************** ReductiveDotProcessing3D_N ******************************************* */
00440 
00441 template<typename T>
00442 void applyProcessingFunctional(ReductiveDotProcessingFunctional3D_N<T>& functional,
00443                                DotList3D const& dotList,
00444                                MultiNTensorField3D<T>& field)
00445 {
00446     ReductiveDotProcessorGenerator3D generator(functional.clone(), dotList);
00447     executeDataProcessor( generator, field );
00448     functional.getStatistics() = generator.getFunctional().getStatistics();
00449 }
00450 
00451 /* *************** ReductiveDotProcessing3D_LL******************************************* */
00452 
00453 template<typename T1, template<typename U1> class Descriptor1,
00454          typename T2, template<typename U2> class Descriptor2>
00455 void applyProcessingFunctional (
00456         ReductiveDotProcessingFunctional3D_LL<T1,Descriptor1,T2,Descriptor2>& functional,
00457         DotList3D const& dotList,
00458         MultiBlockLattice3D<T1,Descriptor1>& lattice1,
00459         MultiBlockLattice3D<T2,Descriptor2>& lattice2 )
00460 {
00461     ReductiveDotProcessorGenerator3D generator(functional.clone(), dotList);
00462     executeDataProcessor( generator, lattice1, lattice2 );
00463     functional.getStatistics() = generator.getFunctional().getStatistics();
00464 }
00465 
00466 /* *************** ReductiveDotProcessing3D_SS ****************************************** */
00467 
00468 template<typename T1, typename T2>
00469 void applyProcessingFunctional (
00470         ReductiveDotProcessingFunctional3D_SS<T1,T2>& functional,
00471         DotList3D const& dotList,
00472         MultiScalarField3D<T1>& field1,
00473         MultiScalarField3D<T2>& field2 )
00474 {
00475     ReductiveDotProcessorGenerator3D generator(functional.clone(), dotList);
00476     executeDataProcessor( generator, field1, field2 );
00477     functional.getStatistics() = generator.getFunctional().getStatistics();
00478 }
00479 
00480 /* *************** ReductiveDotProcessing3D_TT ****************************************** */
00481 
00482 template<typename T1, int nDim1, typename T2, int nDim2>
00483 void applyProcessingFunctional (
00484         ReductiveDotProcessingFunctional3D_TT<T1,nDim1,T2,nDim2>& functional,
00485         DotList3D const& dotList,
00486         MultiTensorField3D<T1,nDim1>& field1,
00487         MultiTensorField3D<T2,nDim2>& field2 )
00488 {
00489     ReductiveDotProcessorGenerator3D generator(functional.clone(), dotList);
00490     executeDataProcessor( generator, field1, field2 );
00491     functional.getStatistics() = generator.getFunctional().getStatistics();
00492 }
00493 
00494 
00495 /* *************** ReductiveDotProcessing3D_NN ****************************************** */
00496 
00497 template<typename T1, typename T2>
00498 void applyProcessingFunctional (
00499         ReductiveDotProcessingFunctional3D_NN<T1,T2>& functional,
00500         DotList3D const& dotList,
00501         MultiNTensorField3D<T1>& field1,
00502         MultiNTensorField3D<T2>& field2 )
00503 {
00504     ReductiveDotProcessorGenerator3D generator(functional.clone(), dotList);
00505     executeDataProcessor( generator, field1, field2 );
00506     functional.getStatistics() = generator.getFunctional().getStatistics();
00507 }
00508 
00509 
00510 /* *************** ReductiveDotProcessing3D_ST ****************************************** */
00511 
00512 template<typename T1, typename T2, int nDim>
00513 void applyProcessingFunctional(ReductiveDotProcessingFunctional3D_ST<T1,T2,nDim>& functional,
00514                                DotList3D const& dotList,
00515                                MultiScalarField3D<T1>& field1,
00516                                MultiTensorField3D<T2,nDim>& field2 )
00517 {
00518     ReductiveDotProcessorGenerator3D generator(functional.clone(), dotList);
00519     executeDataProcessor( generator, field1, field2 );
00520     functional.getStatistics() = generator.getFunctional().getStatistics();
00521 }
00522 
00523 
00524 /* *************** ReductiveDotProcessing3D_SN ****************************************** */
00525 
00526 template<typename T1, typename T2>
00527 void applyProcessingFunctional(ReductiveDotProcessingFunctional3D_SN<T1,T2>& functional,
00528                                DotList3D const& dotList,
00529                                MultiScalarField3D<T1>& field1,
00530                                MultiNTensorField3D<T2>& field2 )
00531 {
00532     ReductiveDotProcessorGenerator3D generator(functional.clone(), dotList);
00533     executeDataProcessor( generator, field1, field2 );
00534     functional.getStatistics() = generator.getFunctional().getStatistics();
00535 }
00536 
00537 
00538 /* *************** ReductiveDotProcessing3D_LS ****************************************** */
00539 
00540 template<typename T1, template<typename U> class Descriptor, typename T2>
00541 void applyProcessingFunctional (
00542         ReductiveDotProcessingFunctional3D_LS<T1,Descriptor,T2>& functional,
00543         DotList3D const& dotList,
00544         MultiBlockLattice3D<T1,Descriptor>& lattice,
00545         MultiScalarField3D<T2>& field )
00546 {
00547     ReductiveDotProcessorGenerator3D generator(functional.clone(), dotList);
00548     executeDataProcessor( generator, lattice, field );
00549     functional.getStatistics() = generator.getFunctional().getStatistics();
00550 }
00551 
00552 /* *************** ReductiveDotProcessing3D_LT ****************************************** */
00553 
00554 template<typename T1, template<typename U> class Descriptor, typename T2, int nDim>
00555 void applyProcessingFunctional (
00556         ReductiveDotProcessingFunctional3D_LT<T1,Descriptor,T2,nDim>& functional,
00557         DotList3D const& dotList,
00558         MultiBlockLattice3D<T1,Descriptor>& lattice,
00559         MultiTensorField3D<T2,nDim>& field )
00560 {
00561     ReductiveDotProcessorGenerator3D generator(functional.clone(), dotList);
00562     executeDataProcessor( generator, lattice, field );
00563     functional.getStatistics() = generator.getFunctional().getStatistics();
00564 }
00565 
00566 
00567 /* *************** ReductiveDotProcessing3D_LN ****************************************** */
00568 
00569 template<typename T1, template<typename U> class Descriptor, typename T2>
00570 void applyProcessingFunctional (
00571         ReductiveDotProcessingFunctional3D_LN<T1,Descriptor,T2>& functional,
00572         DotList3D const& dotList,
00573         MultiBlockLattice3D<T1,Descriptor>& lattice,
00574         MultiNTensorField3D<T2>& field )
00575 {
00576     ReductiveDotProcessorGenerator3D generator(functional.clone(), dotList);
00577     executeDataProcessor( generator, lattice, field );
00578     functional.getStatistics() = generator.getFunctional().getStatistics();
00579 }
00580 
00581 
00582 /* *************** BoundedReductiveLatticeBoxProcessing3D **************************** */
00583 
00584 template<typename T, template<typename U> class Descriptor>
00585 void applyProcessingFunctional (
00586         BoundedReductiveLatticeBoxProcessingFunctional3D<T,Descriptor>& functional,
00587         Box3D domain,
00588         std::vector<MultiBlockLattice3D<T,Descriptor>*> lattices,
00589         plint boundaryWidth )
00590 {
00591     std::vector<MultiBlock3D*> multiBlocks(lattices.size());
00592     for (pluint iLattice=0; iLattice<lattices.size(); ++iLattice) {
00593         multiBlocks[iLattice] = dynamic_cast<MultiBlock3D*>(lattices[iLattice]);
00594     }
00595     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00596 }
00597 
00598 
00599 /* *************** BoundedReductiveMultiScalarFieldBoxProcessing3D ************************ */
00600 
00601 template<typename T>
00602 void applyProcessingFunctional (
00603         BoundedReductiveScalarFieldBoxProcessingFunctional3D<T>& functional,
00604         Box3D domain,
00605         std::vector<MultiScalarField3D<T>*> fields,
00606         plint boundaryWidth )
00607 {
00608     std::vector<MultiBlock3D*> multiBlocks(fields.size());
00609     for (pluint iField=0; iField<fields.size(); ++iField) {
00610         multiBlocks[iField] = dynamic_cast<MultiBlock3D*>(fields[iField]);
00611     }
00612     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00613 }
00614 
00615 
00616 /* *************** BoundedReductiveMultiTensorFieldBoxProcessing3D ************************ */
00617 
00618 template<typename T, int nDim>
00619 void applyProcessingFunctional (
00620         BoundedReductiveTensorFieldBoxProcessingFunctional3D<T,nDim>& functional,
00621         Box3D domain,
00622         std::vector<MultiTensorField3D<T,nDim>*> fields, plint boundaryWidth )
00623 {
00624     std::vector<MultiBlock3D*> multiBlocks(fields.size());
00625     for (pluint iField=0; iField<fields.size(); ++iField) {
00626         multiBlocks[iField] = dynamic_cast<MultiBlock3D*>(fields[iField]);
00627     }
00628     applyProcessingFunctional(functional, domain,
00629                               multiBlocks, boundaryWidth);
00630 }
00631 
00632 /* *************** BoundedReductiveMultiNTensorFieldBoxProcessing3D ************************ */
00633 
00634 template<typename T>
00635 void applyProcessingFunctional (
00636         BoundedReductiveNTensorFieldBoxProcessingFunctional3D<T>& functional,
00637         Box3D domain,
00638         std::vector<MultiNTensorField3D<T>*> fields, plint boundaryWidth )
00639 {
00640     std::vector<MultiBlock3D*> multiBlocks(fields.size());
00641     for (pluint iField=0; iField<fields.size(); ++iField) {
00642         multiBlocks[iField] = dynamic_cast<MultiBlock3D*>(fields[iField]);
00643     }
00644     applyProcessingFunctional(functional, domain,
00645                               multiBlocks, boundaryWidth);
00646 }
00647 
00648 /* *************** BoundedReductiveBoxProcessing3D_L ********************************* */
00649 
00650 template<typename T, template<typename U> class Descriptor>
00651 void applyProcessingFunctional (
00652         BoundedReductiveBoxProcessingFunctional3D_L<T,Descriptor>& functional,
00653         Box3D domain, MultiBlockLattice3D<T,Descriptor>& lattice, plint boundaryWidth )
00654 {
00655     std::vector<MultiBlock3D*> multiBlocks(1);
00656     multiBlocks[0] = dynamic_cast<MultiBlock3D*>(&lattice);
00657     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00658 }
00659 
00660 
00661 /* *************** BoundedReductiveBoxProcessing3D_S ********************************* */
00662 
00663 template<typename T>
00664 void applyProcessingFunctional (
00665         BoundedReductiveBoxProcessingFunctional3D_S<T>& functional,
00666         Box3D domain, MultiScalarField3D<T>& field, plint boundaryWidth )
00667 {
00668     std::vector<MultiBlock3D*> multiBlocks(1);
00669     multiBlocks[0] = dynamic_cast<MultiBlock3D*>(&field);
00670     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00671 }
00672 
00673 /* *************** BoundedReductiveBoxProcessing3D_T ********************************* */
00674 
00675 template<typename T, int nDim>
00676 void applyProcessingFunctional (
00677         BoundedReductiveBoxProcessingFunctional3D_T<T,nDim>& functional,
00678         Box3D domain, MultiTensorField3D<T,nDim>& field, plint boundaryWidth )
00679 {
00680     std::vector<MultiBlock3D*> multiBlocks(1);
00681     multiBlocks[0] = dynamic_cast<MultiBlock3D*>(&field);
00682     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00683 }
00684 
00685 /* *************** BoundedReductiveBoxProcessing3D_N ********************************* */
00686 
00687 template<typename T>
00688 void applyProcessingFunctional (
00689         BoundedReductiveBoxProcessingFunctional3D_N<T>& functional,
00690         Box3D domain, MultiNTensorField3D<T>& field, plint boundaryWidth )
00691 {
00692     std::vector<MultiBlock3D*> multiBlocks(1);
00693     multiBlocks[0] = dynamic_cast<MultiBlock3D*>(&field);
00694     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00695 }
00696 
00697 /* *************** BoundedMaskedReductiveBoxProcessing3D_N ********************************* */
00698 
00699 template<typename T>
00700 void applyProcessingFunctional (
00701         BoundedMaskedReductiveBoxProcessingFunctional3D_N<T>& functional,
00702         Box3D domain,
00703         MultiNTensorField3D<T>& field,
00704         MultiNTensorField3D<int>& mask,
00705         plint boundaryWidth )
00706 {
00707     std::vector<MultiBlock3D*> multiBlocks(2);
00708     multiBlocks[0] = dynamic_cast<MultiBlock3D*>(&field);
00709     multiBlocks[1] = dynamic_cast<MultiBlock3D*>(&mask);
00710     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00711 }
00712 
00713 /* *************** BoundedReductiveBoxProcessing3D_LL********************************* */
00714 
00715 template<typename T1, template<typename U1> class Descriptor1,
00716          typename T2, template<typename U2> class Descriptor2>
00717 void applyProcessingFunctional (
00718         BoundedReductiveBoxProcessingFunctional3D_LL<T1,Descriptor1,T2,Descriptor2>& functional,
00719         Box3D domain,
00720         MultiBlockLattice3D<T1,Descriptor1>& lattice1,
00721         MultiBlockLattice3D<T2,Descriptor2>& lattice2,
00722         plint boundaryWidth )
00723 {
00724     std::vector<MultiBlock3D*> multiBlocks(2);
00725     multiBlocks[0] = dynamic_cast<MultiBlock3D*>(&lattice1);
00726     multiBlocks[1] = dynamic_cast<MultiBlock3D*>(&lattice2);
00727     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00728 }
00729 
00730 
00731 /* *************** BoundedReductiveBoxProcessing3D_SS ****************************************** */
00732 
00733 template<typename T1, typename T2>
00734 void applyProcessingFunctional (
00735         BoundedReductiveBoxProcessingFunctional3D_SS<T1,T2>& functional,
00736         Box3D domain,
00737         MultiScalarField3D<T1>& field1,
00738         MultiScalarField3D<T2>& field2,
00739         plint boundaryWidth )
00740 {
00741     std::vector<MultiBlock3D*> multiBlocks(2);
00742     multiBlocks[0] = dynamic_cast<MultiBlock3D*>(&field1);
00743     multiBlocks[1] = dynamic_cast<MultiBlock3D*>(&field2);
00744     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00745 }
00746 
00747 /* *************** BoundedReductiveBoxProcessing3D_TT ********************************** */
00748 
00749 template<typename T1, int nDim1, typename T2, int nDim2>
00750 void applyProcessingFunctional (
00751         BoundedReductiveBoxProcessingFunctional3D_TT<T1,nDim1,T2,nDim2>& functional,
00752         Box3D domain,
00753         MultiTensorField3D<T1,nDim1>& field1,
00754         MultiTensorField3D<T2,nDim2>& field2,
00755         plint boundaryWidth )
00756 {
00757     std::vector<MultiBlock3D*> multiBlocks(2);
00758     multiBlocks[0] = dynamic_cast<MultiBlock3D*>(&field1);
00759     multiBlocks[1] = dynamic_cast<MultiBlock3D*>(&field2);
00760     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00761 }
00762 
00763 
00764 /* *************** BoundedReductiveBoxProcessing3D_NN ********************************** */
00765 
00766 template<typename T1, typename T2>
00767 void applyProcessingFunctional (
00768         BoundedReductiveBoxProcessingFunctional3D_NN<T1,T2>& functional,
00769         Box3D domain,
00770         MultiNTensorField3D<T1>& field1,
00771         MultiNTensorField3D<T2>& field2,
00772         plint boundaryWidth )
00773 {
00774     std::vector<MultiBlock3D*> multiBlocks(2);
00775     multiBlocks[0] = dynamic_cast<MultiBlock3D*>(&field1);
00776     multiBlocks[1] = dynamic_cast<MultiBlock3D*>(&field2);
00777     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00778 }
00779 
00780 
00781 /* *************** BoundedMaskedReductiveBoxProcessing3D_NN ********************************** */
00782 
00783 template<typename T1, typename T2>
00784 void applyProcessingFunctional (
00785         BoundedMaskedReductiveBoxProcessingFunctional3D_NN<T1,T2>& functional,
00786         Box3D domain,
00787         MultiNTensorField3D<T1>& field1,
00788         MultiNTensorField3D<T2>& field2,
00789         MultiNTensorField3D<int>& mask,
00790         plint boundaryWidth )
00791 {
00792     std::vector<MultiBlock3D*> multiBlocks(3);
00793     multiBlocks[0] = dynamic_cast<MultiBlock3D*>(&field1);
00794     multiBlocks[1] = dynamic_cast<MultiBlock3D*>(&field2);
00795     multiBlocks[2] = dynamic_cast<MultiBlock3D*>(&mask);
00796     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00797 }
00798 
00799 
00800 /* *************** BoundedReductiveBoxProcessing3D_ST ******************************** */
00801 
00802 template<typename T1, typename T2, int nDim>
00803 void applyProcessingFunctional (
00804         BoundedReductiveBoxProcessingFunctional3D_ST<T1,T2,nDim>& functional,
00805         Box3D domain,
00806         MultiScalarField3D<T1>& field1,
00807         MultiTensorField3D<T2,nDim>& field2,
00808         plint boundaryWidth )
00809 {
00810     std::vector<MultiBlock3D*> multiBlocks(2);
00811     multiBlocks[0] = dynamic_cast<MultiBlock3D*>(&field1);
00812     multiBlocks[1] = dynamic_cast<MultiBlock3D*>(&field2);
00813     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00814 }
00815 
00816 
00817 /* *************** BoundedReductiveBoxProcessing3D_SN ******************************** */
00818 
00819 template<typename T1, typename T2>
00820 void applyProcessingFunctional (
00821         BoundedReductiveBoxProcessingFunctional3D_SN<T1,T2>& functional,
00822         Box3D domain,
00823         MultiScalarField3D<T1>& field1,
00824         MultiNTensorField3D<T2>& field2,
00825         plint boundaryWidth )
00826 {
00827     std::vector<MultiBlock3D*> multiBlocks(2);
00828     multiBlocks[0] = dynamic_cast<MultiBlock3D*>(&field1);
00829     multiBlocks[1] = dynamic_cast<MultiBlock3D*>(&field2);
00830     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00831 }
00832 
00833 
00834 /* *************** BoundedReductiveBoxProcessing3D_LS ******************************** */
00835 
00836 template<typename T1, template<typename U> class Descriptor, typename T2>
00837 void applyProcessingFunctional (
00838         BoundedReductiveBoxProcessingFunctional3D_LS<T1,Descriptor,T2>& functional,
00839         Box3D domain,
00840         MultiBlockLattice3D<T1,Descriptor>& lattice,
00841         MultiScalarField3D<T2>& field,
00842         plint boundaryWidth )
00843 {
00844     std::vector<MultiBlock3D*> multiBlocks(2);
00845     multiBlocks[0] = dynamic_cast<MultiBlock3D*>(&lattice);
00846     multiBlocks[1] = dynamic_cast<MultiBlock3D*>(&field);
00847     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00848 }
00849 
00850 /* *************** BoundedReductiveBoxProcessing3D_LT ****************************************** */
00851 
00852 template<typename T1, template<typename U> class Descriptor, typename T2, int nDim>
00853 void applyProcessingFunctional (
00854         BoundedReductiveBoxProcessingFunctional3D_LT<T1,Descriptor,T2,nDim>& functional,
00855         Box3D domain,
00856         MultiBlockLattice3D<T1,Descriptor>& lattice,
00857         MultiTensorField3D<T2,nDim>& field,
00858         plint boundaryWidth )
00859 {
00860     std::vector<MultiBlock3D*> multiBlocks(2);
00861     multiBlocks[0] = dynamic_cast<MultiBlock3D*>(&lattice);
00862     multiBlocks[1] = dynamic_cast<MultiBlock3D*>(&field);
00863     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00864 }
00865 
00866 /* *************** BoundedReductiveBoxProcessing3D_LN ****************************************** */
00867 
00868 template<typename T1, template<typename U> class Descriptor, typename T2>
00869 void applyProcessingFunctional (
00870         BoundedReductiveBoxProcessingFunctional3D_LN<T1,Descriptor,T2>& functional,
00871         Box3D domain,
00872         MultiBlockLattice3D<T1,Descriptor>& lattice,
00873         MultiNTensorField3D<T2>& field,
00874         plint boundaryWidth )
00875 {
00876     std::vector<MultiBlock3D*> multiBlocks(2);
00877     multiBlocks[0] = dynamic_cast<MultiBlock3D*>(&lattice);
00878     multiBlocks[1] = dynamic_cast<MultiBlock3D*>(&field);
00879     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00880 }
00881 
00882 /* *************** BoundedReductiveBoxProcessing3D_LN ****************************************** */
00883 
00884 template<typename T1, template<typename U> class Descriptor, typename T2>
00885 void applyProcessingFunctional (
00886         BoundedMaskedReductiveBoxProcessingFunctional3D_LN<T1,Descriptor,T2>& functional,
00887         Box3D domain,
00888         MultiBlockLattice3D<T1,Descriptor>& lattice,
00889         MultiNTensorField3D<T2>& field,
00890         MultiNTensorField3D<int>& mask,
00891         plint boundaryWidth )
00892 {
00893     std::vector<MultiBlock3D*> multiBlocks(2);
00894     multiBlocks[0] = dynamic_cast<MultiBlock3D*>(&lattice);
00895     multiBlocks[1] = dynamic_cast<MultiBlock3D*>(&field);
00896     multiBlocks[2] = dynamic_cast<MultiBlock3D*>(&mask);
00897     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00898 }
00899 
00900 }  // namespace plb
00901 
00902 #endif  // REDUCTIVE_MULTI_DATA_PROCESSOR_WRAPPER_3D_HH