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

reductiveMultiDataProcessorWrapper2D.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_2D_HH
00027 #define REDUCTIVE_MULTI_DATA_PROCESSOR_WRAPPER_2D_HH
00028 
00029 #include "multiBlock/reductiveMultiDataProcessorWrapper2D.h"
00030 #include "multiBlock/multiBlockLattice2D.h"
00031 #include "multiBlock/multiDataField2D.h"
00032 #include "multiBlock/multiBlockOperations2D.h"
00033 #include "atomicBlock/dataProcessor2D.h"
00034 #include "core/plbDebug.h"
00035 
00036 namespace plb {
00037 
00038 /* *************** LatticeBoxProcessing2D ****************************************** */
00039 
00040 template<typename T, template<typename U> class Descriptor>
00041 void applyProcessingFunctional (
00042         ReductiveLatticeBoxProcessingFunctional2D<T,Descriptor>& functional,
00043         Box2D domain,
00044         std::vector<MultiBlockLattice2D<T,Descriptor>*> lattices )
00045 {
00046     std::vector<MultiBlock2D*> multiBlocks(lattices.size());
00047     for (pluint iLattice=0; iLattice<lattices.size(); ++iLattice) {
00048         multiBlocks[iLattice] = dynamic_cast<MultiBlock2D*>(lattices[iLattice]);
00049     }
00050     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00051     executeDataProcessor( generator, multiBlocks );
00052     functional.getStatistics() = generator.getFunctional().getStatistics();
00053 }
00054 
00055 
00056 /* *************** MultiScalarFieldBoxProcessing2D ******************************* */
00057 
00058 template<typename T>
00059 void applyProcessingFunctional(ReductiveScalarFieldBoxProcessingFunctional2D<T>& functional,
00060                                Box2D domain,
00061                                std::vector<MultiScalarField2D<T>*> fields )
00062 {
00063     std::vector<MultiBlock2D*> multiBlocks(fields.size());
00064     for (pluint iField=0; iField<fields.size(); ++iField) {
00065         multiBlocks[iField] = dynamic_cast<MultiBlock2D*>(fields[iField]);
00066     }
00067     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00068     executeDataProcessor( generator, multiBlocks );
00069     functional.getStatistics() = generator.getFunctional().getStatistics();
00070 }
00071 
00072 
00073 /* *************** TensorFieldBoxProcessing2D ******************************* */
00074 
00075 template<typename T, int nDim>
00076 void applyProcessingFunctional (
00077         ReductiveTensorFieldBoxProcessingFunctional2D<T,nDim>& functional,
00078         Box2D domain,
00079         std::vector<MultiTensorField2D<T,nDim>*> fields )
00080 {
00081     std::vector<MultiBlock2D*> multiBlocks(fields.size());
00082     for (pluint iField=0; iField<fields.size(); ++iField) {
00083         multiBlocks[iField] = dynamic_cast<MultiBlock2D*>(fields[iField]);
00084     }
00085     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00086     executeDataProcessor( generator, multiBlocks );
00087     functional.getStatistics() = generator.getFunctional().getStatistics();
00088 }
00089 
00090 /* *************** NTensorFieldBoxProcessing2D ******************************* */
00091 
00092 template<typename T>
00093 void applyProcessingFunctional (
00094         ReductiveNTensorFieldBoxProcessingFunctional2D<T>& functional,
00095         Box2D domain,
00096         std::vector<MultiNTensorField2D<T>*> fields )
00097 {
00098     std::vector<MultiBlock2D*> multiBlocks(fields.size());
00099     for (pluint iField=0; iField<fields.size(); ++iField) {
00100         multiBlocks[iField] = dynamic_cast<MultiBlock2D*>(fields[iField]);
00101     }
00102     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00103     executeDataProcessor( generator, multiBlocks );
00104     functional.getStatistics() = generator.getFunctional().getStatistics();
00105 }
00106 
00107 /* *************** ReductiveBoxProcessing2D_L ******************************************* */
00108 
00109 template<typename T, template<typename U> class Descriptor>
00110 void applyProcessingFunctional(ReductiveBoxProcessingFunctional2D_L<T,Descriptor>& functional,
00111                                Box2D domain, MultiBlockLattice2D<T,Descriptor>& lattice)
00112 {
00113     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00114     executeDataProcessor( generator, lattice );
00115     functional.getStatistics() = generator.getFunctional().getStatistics();
00116 }
00117 
00118 
00119 /* *************** ReductiveBoxProcessing2D_S ******************************************* */
00120 
00121 template<typename T>
00122 void applyProcessingFunctional(ReductiveBoxProcessingFunctional2D_S<T>& functional,
00123                                Box2D domain, MultiScalarField2D<T>& field)
00124 {
00125     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00126     executeDataProcessor( generator, field );
00127     functional.getStatistics() = generator.getFunctional().getStatistics();
00128 }
00129 
00130 
00131 /* *************** ReductiveBoxProcessing2D_T ******************************************* */
00132 
00133 template<typename T, int nDim>
00134 void applyProcessingFunctional(ReductiveBoxProcessingFunctional2D_T<T,nDim>& functional,
00135                                Box2D domain, MultiTensorField2D<T,nDim>& field)
00136 {
00137     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00138     executeDataProcessor( generator, field );
00139     functional.getStatistics() = generator.getFunctional().getStatistics();
00140 }
00141 
00142 /* *************** ReductiveBoxProcessing2D_N ******************************************* */
00143 
00144 template<typename T>
00145 void applyProcessingFunctional(ReductiveBoxProcessingFunctional2D_N<T>& functional,
00146                                Box2D domain, MultiNTensorField2D<T>& field)
00147 {
00148     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00149     executeDataProcessor( generator, field );
00150     functional.getStatistics() = generator.getFunctional().getStatistics();
00151 }
00152 
00153 /* *************** ReductiveBoxProcessing2D_N ******************************************* */
00154 
00155 template<typename T>
00156 void applyProcessingFunctional(MaskedReductiveBoxProcessingFunctional2D_N<T>& functional,
00157                                Box2D domain,
00158                                MultiNTensorField2D<T>& field,
00159                                MultiNTensorField2D<int>& mask)
00160 {
00161     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00162     executeDataProcessor( generator, field, mask );
00163     functional.getStatistics() = generator.getFunctional().getStatistics();
00164 }
00165 
00166 /* *************** ReductiveBoxProcessing2D_LL******************************************* */
00167 
00168 template<typename T1, template<typename U1> class Descriptor1,
00169          typename T2, template<typename U2> class Descriptor2>
00170 void applyProcessingFunctional (
00171         ReductiveBoxProcessingFunctional2D_LL<T1,Descriptor1,T2,Descriptor2>& functional,
00172         Box2D domain,
00173         MultiBlockLattice2D<T1,Descriptor1>& lattice1,
00174         MultiBlockLattice2D<T2,Descriptor2>& lattice2 )
00175 {
00176     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00177     executeDataProcessor( generator, lattice1, lattice2 );
00178     functional.getStatistics() = generator.getFunctional().getStatistics();
00179 }
00180 
00181 
00182 /* *************** ReductiveBoxProcessing2D_SS ****************************************** */
00183 
00184 template<typename T1, typename T2>
00185 void applyProcessingFunctional(ReductiveBoxProcessingFunctional2D_SS<T1,T2>& functional,
00186                                Box2D domain,
00187                                MultiScalarField2D<T1>& field1,
00188                                MultiScalarField2D<T2>& field2 )
00189 {
00190     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00191     executeDataProcessor( generator, field1, field2 );
00192     functional.getStatistics() = generator.getFunctional().getStatistics();
00193 }
00194 
00195 /* *************** ReductiveBoxProcessing2D_TT ****************************************** */
00196 
00197 template<typename T1, int nDim1, typename T2, int nDim2>
00198 void applyProcessingFunctional (
00199         ReductiveBoxProcessingFunctional2D_TT<T1,nDim1,T2,nDim2>& functional,
00200         Box2D domain,
00201         MultiTensorField2D<T1,nDim1>& field1,
00202         MultiTensorField2D<T2,nDim2>& field2 )
00203 {
00204     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00205     executeDataProcessor( generator, field1, field2 );
00206     functional.getStatistics() = generator.getFunctional().getStatistics();
00207 }
00208 
00209 /* *************** ReductiveBoxProcessing2D_NN ****************************************** */
00210 
00211 template<typename T1, typename T2>
00212 void applyProcessingFunctional (
00213         ReductiveBoxProcessingFunctional2D_NN<T1,T2>& functional,
00214         Box2D domain,
00215         MultiNTensorField2D<T1>& field1,
00216         MultiNTensorField2D<T2>& field2 )
00217 {
00218     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00219     executeDataProcessor( generator, field1, field2 );
00220     functional.getStatistics() = generator.getFunctional().getStatistics();
00221 }
00222 
00223 /* *************** ReductiveBoxProcessing2D_NN ****************************************** */
00224 
00225 template<typename T1, typename T2>
00226 void applyProcessingFunctional (
00227         MaskedReductiveBoxProcessingFunctional2D_NN<T1,T2>& functional,
00228         Box2D domain,
00229         MultiNTensorField2D<T1>& field1,
00230         MultiNTensorField2D<T2>& field2,
00231         MultiNTensorField2D<int>& mask )
00232 {
00233     std::vector<MultiBlock2D*> multiBlocks(3);
00234     multiBlocks[0] = dynamic_cast<MultiBlock2D*>(&field1);
00235     multiBlocks[1] = dynamic_cast<MultiBlock2D*>(&field2);
00236     multiBlocks[2] = dynamic_cast<MultiBlock2D*>(&mask);
00237     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00238     executeDataProcessor( generator, multiBlocks );
00239     functional.getStatistics() = generator.getFunctional().getStatistics();
00240 }
00241 
00242 /* *************** ReductiveBoxProcessing2D_ST ****************************************** */
00243 
00244 template<typename T1, typename T2, int nDim>
00245 void applyProcessingFunctional(ReductiveBoxProcessingFunctional2D_ST<T1,T2,nDim>& functional,
00246                                Box2D domain,
00247                                MultiScalarField2D<T1>& field1,
00248                                MultiTensorField2D<T2,nDim>& field2 )
00249 {
00250     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00251     executeDataProcessor( generator, field1, field2 );
00252     functional.getStatistics() = generator.getFunctional().getStatistics();
00253 }
00254 
00255 
00256 /* *************** ReductiveBoxProcessing2D_SN ****************************************** */
00257 
00258 template<typename T1, typename T2>
00259 void applyProcessingFunctional(ReductiveBoxProcessingFunctional2D_SN<T1,T2>& functional,
00260                                Box2D domain,
00261                                MultiScalarField2D<T1>& field1,
00262                                MultiNTensorField2D<T2>& field2 )
00263 {
00264     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00265     executeDataProcessor( generator, field1, field2 );
00266     functional.getStatistics() = generator.getFunctional().getStatistics();
00267 }
00268 
00269 
00270 /* *************** ReductiveBoxProcessing2D_LS ****************************************** */
00271 
00272 template<typename T1, template<typename U> class Descriptor, typename T2>
00273 void applyProcessingFunctional (
00274         ReductiveBoxProcessingFunctional2D_LS<T1,Descriptor,T2>& functional,
00275         Box2D domain,
00276         MultiBlockLattice2D<T1,Descriptor>& lattice,
00277         MultiScalarField2D<T2>& field )
00278 {
00279     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00280     executeDataProcessor( generator, lattice, field );
00281     functional.getStatistics() = generator.getFunctional().getStatistics();
00282 }
00283 
00284 
00285 /* *************** ReductiveBoxProcessing2D_LT ****************************************** */
00286 
00287 template<typename T1, template<typename U> class Descriptor, typename T2, int nDim>
00288 void applyProcessingFunctional (
00289         ReductiveBoxProcessingFunctional2D_LT<T1,Descriptor,T2,nDim>& functional,
00290         Box2D domain,
00291         MultiBlockLattice2D<T1,Descriptor>& lattice,
00292         MultiTensorField2D<T2,nDim>& field )
00293 {
00294     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00295     executeDataProcessor( generator, lattice, field );
00296     functional.getStatistics() = generator.getFunctional().getStatistics();
00297 }
00298 
00299 /* *************** ReductiveBoxProcessing2D_LN ****************************************** */
00300 
00301 template<typename T1, template<typename U> class Descriptor, typename T2>
00302 void applyProcessingFunctional (
00303         ReductiveBoxProcessingFunctional2D_LN<T1,Descriptor,T2>& functional,
00304         Box2D domain,
00305         MultiBlockLattice2D<T1,Descriptor>& lattice,
00306         MultiNTensorField2D<T2>& field )
00307 {
00308     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00309     executeDataProcessor( generator, lattice, field );
00310     functional.getStatistics() = generator.getFunctional().getStatistics();
00311 }
00312 
00313 /* *************** MaskedReductiveBoxProcessing2D_LN ****************************************** */
00314 
00315 template<typename T1, template<typename U> class Descriptor, typename T2>
00316 void applyProcessingFunctional (
00317         MaskedReductiveBoxProcessingFunctional2D_LN<T1,Descriptor,T2>& functional,
00318         Box2D domain,
00319         MultiBlockLattice2D<T1,Descriptor>& lattice,
00320         MultiNTensorField2D<T2>& field,
00321         MultiNTensorField2D<int>& mask )
00322 {
00323     std::vector<MultiBlock2D*> multiBlocks(3);
00324     multiBlocks[0] = dynamic_cast<MultiBlock2D*>(&lattice);
00325     multiBlocks[1] = dynamic_cast<MultiBlock2D*>(&field);
00326     multiBlocks[2] = dynamic_cast<MultiBlock2D*>(&mask);
00327     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00328     executeDataProcessor( generator, multiBlocks );
00329     functional.getStatistics() = generator.getFunctional().getStatistics();
00330 }
00331 
00332 /* *************** LatticeDotProcessing2D ****************************************** */
00333 
00334 template<typename T, template<typename U> class Descriptor>
00335 void applyProcessingFunctional (
00336         ReductiveLatticeDotProcessingFunctional2D<T,Descriptor>& functional,
00337         DotList2D const& dotList,
00338         std::vector<MultiBlockLattice2D<T,Descriptor>*> lattices )
00339 {
00340     std::vector<MultiBlock2D*> multiBlocks(lattices.size());
00341     for (pluint iLattice=0; iLattice<lattices.size(); ++iLattice) {
00342         multiBlocks[iLattice] = dynamic_cast<MultiBlock2D*>(lattices[iLattice]);
00343     }
00344     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00345     executeDataProcessor( generator, multiBlocks );
00346     functional.getStatistics() = generator.getFunctional().getStatistics();
00347 }
00348 
00349 
00350 /* *************** ScalarFieldDotProcessing2D ****************************************** */
00351 
00352 template<typename T>
00353 void applyProcessingFunctional(ReductiveScalarFieldDotProcessingFunctional2D<T>& functional,
00354                                DotList2D const& dotList,
00355                                std::vector<MultiScalarField2D<T>*> fields )
00356 {
00357     std::vector<MultiBlock2D*> multiBlocks(fields.size());
00358     for (pluint iField=0; iField<fields.size(); ++iField) {
00359         multiBlocks[iField] = dynamic_cast<MultiBlock2D*>(fields[iField]);
00360     }
00361     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00362     executeDataProcessor( generator, multiBlocks );
00363     functional.getStatistics() = generator.getFunctional().getStatistics();
00364 }
00365 
00366 
00367 
00368 /* *************** MultiTensorFieldDotProcessing2D ****************************************** */
00369 
00370 template<typename T, int nDim>
00371 void applyProcessingFunctional (
00372         ReductiveTensorFieldDotProcessingFunctional2D<T,nDim>& functional,
00373         DotList2D const& dotList,
00374         std::vector<MultiTensorField2D<T,nDim>*> fields )
00375 {
00376     std::vector<MultiBlock2D*> multiBlocks(fields.size());
00377     for (pluint iField=0; iField<fields.size(); ++iField) {
00378         multiBlocks[iField] = dynamic_cast<MultiBlock2D*>(fields[iField]);
00379     }
00380     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00381     executeDataProcessor( generator, multiBlocks );
00382     functional.getStatistics() = generator.getFunctional().getStatistics();
00383 }
00384 
00385 /* *************** MultiNTensorFieldDotProcessing2D ****************************************** */
00386 
00387 template<typename T>
00388 void applyProcessingFunctional (
00389         ReductiveNTensorFieldDotProcessingFunctional2D<T>& functional,
00390         DotList2D const& dotList,
00391         std::vector<MultiNTensorField2D<T>*> fields )
00392 {
00393     std::vector<MultiBlock2D*> multiBlocks(fields.size());
00394     for (pluint iField=0; iField<fields.size(); ++iField) {
00395         multiBlocks[iField] = dynamic_cast<MultiBlock2D*>(fields[iField]);
00396     }
00397     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00398     executeDataProcessor( generator, multiBlocks );
00399     functional.getStatistics() = generator.getFunctional().getStatistics();
00400 }
00401 
00402 /* *************** ReductiveDotProcessing2D_L ******************************************* */
00403 
00404 template<typename T, template<typename U> class Descriptor>
00405 void applyProcessingFunctional(ReductiveDotProcessingFunctional2D_L<T,Descriptor>& functional,
00406                                DotList2D const& dotList,
00407                                MultiBlockLattice2D<T,Descriptor>& lattice)
00408 {
00409     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00410     executeDataProcessor( generator, lattice );
00411     functional.getStatistics() = generator.getFunctional().getStatistics();
00412 }
00413 
00414 
00415 /* *************** ReductiveDotProcessing2D_S ******************************************* */
00416 
00417 template<typename T>
00418 void applyProcessingFunctional(ReductiveDotProcessingFunctional2D_S<T>& functional,
00419                                DotList2D const& dotList, MultiScalarField2D<T>& field)
00420 {
00421     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00422     executeDataProcessor( generator, field );
00423     functional.getStatistics() = generator.getFunctional().getStatistics();
00424 }
00425 
00426 
00427 /* *************** ReductiveDotProcessing2D_T ******************************************* */
00428 
00429 template<typename T, int nDim>
00430 void applyProcessingFunctional(ReductiveDotProcessingFunctional2D_T<T,nDim>& functional,
00431                                DotList2D const& dotList,
00432                                MultiTensorField2D<T,nDim>& field)
00433 {
00434     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00435     executeDataProcessor( generator, field );
00436     functional.getStatistics() = generator.getFunctional().getStatistics();
00437 }
00438 
00439 /* *************** ReductiveDotProcessing2D_N ******************************************* */
00440 
00441 template<typename T>
00442 void applyProcessingFunctional(ReductiveDotProcessingFunctional2D_N<T>& functional,
00443                                DotList2D const& dotList,
00444                                MultiNTensorField2D<T>& field)
00445 {
00446     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00447     executeDataProcessor( generator, field );
00448     functional.getStatistics() = generator.getFunctional().getStatistics();
00449 }
00450 
00451 /* *************** ReductiveDotProcessing2D_LL******************************************* */
00452 
00453 template<typename T1, template<typename U1> class Descriptor1,
00454          typename T2, template<typename U2> class Descriptor2>
00455 void applyProcessingFunctional (
00456         ReductiveDotProcessingFunctional2D_LL<T1,Descriptor1,T2,Descriptor2>& functional,
00457         DotList2D const& dotList,
00458         MultiBlockLattice2D<T1,Descriptor1>& lattice1,
00459         MultiBlockLattice2D<T2,Descriptor2>& lattice2 )
00460 {
00461     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00462     executeDataProcessor( generator, lattice1, lattice2 );
00463     functional.getStatistics() = generator.getFunctional().getStatistics();
00464 }
00465 
00466 /* *************** ReductiveDotProcessing2D_SS ****************************************** */
00467 
00468 template<typename T1, typename T2>
00469 void applyProcessingFunctional (
00470         ReductiveDotProcessingFunctional2D_SS<T1,T2>& functional,
00471         DotList2D const& dotList,
00472         MultiScalarField2D<T1>& field1,
00473         MultiScalarField2D<T2>& field2 )
00474 {
00475     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00476     executeDataProcessor( generator, field1, field2 );
00477     functional.getStatistics() = generator.getFunctional().getStatistics();
00478 }
00479 
00480 /* *************** ReductiveDotProcessing2D_TT ****************************************** */
00481 
00482 template<typename T1, int nDim1, typename T2, int nDim2>
00483 void applyProcessingFunctional (
00484         ReductiveDotProcessingFunctional2D_TT<T1,nDim1,T2,nDim2>& functional,
00485         DotList2D const& dotList,
00486         MultiTensorField2D<T1,nDim1>& field1,
00487         MultiTensorField2D<T2,nDim2>& field2 )
00488 {
00489     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00490     executeDataProcessor( generator, field1, field2 );
00491     functional.getStatistics() = generator.getFunctional().getStatistics();
00492 }
00493 
00494 /* *************** ReductiveDotProcessing2D_NN ****************************************** */
00495 
00496 template<typename T1, typename T2>
00497 void applyProcessingFunctional (
00498         ReductiveDotProcessingFunctional2D_NN<T1,T2>& functional,
00499         DotList2D const& dotList,
00500         MultiNTensorField2D<T1>& field1,
00501         MultiNTensorField2D<T2>& field2 )
00502 {
00503     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00504     executeDataProcessor( generator, field1, field2 );
00505     functional.getStatistics() = generator.getFunctional().getStatistics();
00506 }
00507 
00508 
00509 /* *************** ReductiveDotProcessing2D_ST ****************************************** */
00510 
00511 template<typename T1, typename T2, int nDim>
00512 void applyProcessingFunctional(ReductiveDotProcessingFunctional2D_ST<T1,T2,nDim>& functional,
00513                                DotList2D const& dotList,
00514                                MultiScalarField2D<T1>& field1,
00515                                MultiTensorField2D<T2,nDim>& field2 )
00516 {
00517     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00518     executeDataProcessor( generator, field1, field2 );
00519     functional.getStatistics() = generator.getFunctional().getStatistics();
00520 }
00521 
00522 
00523 /* *************** ReductiveDotProcessing2D_SN ****************************************** */
00524 
00525 template<typename T1, typename T2>
00526 void applyProcessingFunctional(ReductiveDotProcessingFunctional2D_SN<T1,T2>& functional,
00527                                DotList2D const& dotList,
00528                                MultiScalarField2D<T1>& field1,
00529                                MultiNTensorField2D<T2>& field2 )
00530 {
00531     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00532     executeDataProcessor( generator, field1, field2 );
00533     functional.getStatistics() = generator.getFunctional().getStatistics();
00534 }
00535 
00536 
00537 /* *************** ReductiveDotProcessing2D_LS ****************************************** */
00538 
00539 template<typename T1, template<typename U> class Descriptor, typename T2>
00540 void applyProcessingFunctional (
00541         ReductiveDotProcessingFunctional2D_LS<T1,Descriptor,T2>& functional,
00542         DotList2D const& dotList,
00543         MultiBlockLattice2D<T1,Descriptor>& lattice,
00544         MultiScalarField2D<T2>& field )
00545 {
00546     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00547     executeDataProcessor( generator, lattice, field );
00548     functional.getStatistics() = generator.getFunctional().getStatistics();
00549 }
00550 
00551 /* *************** ReductiveDotProcessing2D_LT ****************************************** */
00552 
00553 template<typename T1, template<typename U> class Descriptor, typename T2, int nDim>
00554 void applyProcessingFunctional (
00555         ReductiveDotProcessingFunctional2D_LT<T1,Descriptor,T2,nDim>& functional,
00556         DotList2D const& dotList,
00557         MultiBlockLattice2D<T1,Descriptor>& lattice,
00558         MultiTensorField2D<T2,nDim>& field )
00559 {
00560     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00561     executeDataProcessor( generator, lattice, field );
00562     functional.getStatistics() = generator.getFunctional().getStatistics();
00563 }
00564 
00565 /* *************** ReductiveDotProcessing2D_LN ****************************************** */
00566 
00567 template<typename T1, template<typename U> class Descriptor, typename T2>
00568 void applyProcessingFunctional (
00569         ReductiveDotProcessingFunctional2D_LN<T1,Descriptor,T2>& functional,
00570         DotList2D const& dotList,
00571         MultiBlockLattice2D<T1,Descriptor>& lattice,
00572         MultiNTensorField2D<T2>& field )
00573 {
00574     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00575     executeDataProcessor( generator, lattice, field );
00576     functional.getStatistics() = generator.getFunctional().getStatistics();
00577 }
00578 
00579 
00580 /* *************** BoundedReductiveLatticeBoxProcessing2D **************************** */
00581 
00582 template<typename T, template<typename U> class Descriptor>
00583 void applyProcessingFunctional (
00584         BoundedReductiveLatticeBoxProcessingFunctional2D<T,Descriptor>& functional,
00585         Box2D domain,
00586         std::vector<MultiBlockLattice2D<T,Descriptor>*> lattices,
00587         plint boundaryWidth )
00588 {
00589     std::vector<MultiBlock2D*> multiBlocks(lattices.size());
00590     for (pluint iLattice=0; iLattice<lattices.size(); ++iLattice) {
00591         multiBlocks[iLattice] = dynamic_cast<MultiBlock2D*>(lattices[iLattice]);
00592     }
00593     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00594 }
00595 
00596 
00597 /* *************** BoundedReductiveMultiScalarFieldBoxProcessing2D ************************ */
00598 
00599 template<typename T>
00600 void applyProcessingFunctional (
00601         BoundedReductiveScalarFieldBoxProcessingFunctional2D<T>& functional,
00602         Box2D domain,
00603         std::vector<MultiScalarField2D<T>*> fields,
00604         plint boundaryWidth )
00605 {
00606     std::vector<MultiBlock2D*> multiBlocks(fields.size());
00607     for (pluint iField=0; iField<fields.size(); ++iField) {
00608         multiBlocks[iField] = dynamic_cast<MultiBlock2D*>(fields[iField]);
00609     }
00610     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00611 }
00612 
00613 
00614 /* *************** BoundedReductiveTensorFieldBoxProcessing2D ************************ */
00615 
00616 template<typename T, int nDim>
00617 void applyProcessingFunctional (
00618         BoundedReductiveTensorFieldBoxProcessingFunctional2D<T,nDim>& functional,
00619         Box2D domain,
00620         std::vector<MultiTensorField2D<T,nDim>*> fields, plint boundaryWidth )
00621 {
00622     std::vector<MultiBlock2D*> multiBlocks(fields.size());
00623     for (pluint iField=0; iField<fields.size(); ++iField) {
00624         multiBlocks[iField] = dynamic_cast<MultiBlock2D*>(fields[iField]);
00625     }
00626     applyProcessingFunctional(functional, domain,
00627                               multiBlocks, boundaryWidth);
00628 }
00629 
00630 /* *************** BoundedReductiveNTensorFieldBoxProcessing2D ************************ */
00631 
00632 template<typename T>
00633 void applyProcessingFunctional (
00634         BoundedReductiveNTensorFieldBoxProcessingFunctional2D<T>& functional,
00635         Box2D domain,
00636         std::vector<MultiNTensorField2D<T>*> fields, plint boundaryWidth )
00637 {
00638     std::vector<MultiBlock2D*> multiBlocks(fields.size());
00639     for (pluint iField=0; iField<fields.size(); ++iField) {
00640         multiBlocks[iField] = dynamic_cast<MultiBlock2D*>(fields[iField]);
00641     }
00642     applyProcessingFunctional(functional, domain,
00643                               multiBlocks, boundaryWidth);
00644 }
00645 
00646 /* *************** BoundedReductiveBoxProcessing2D_L ********************************* */
00647 
00648 template<typename T, template<typename U> class Descriptor>
00649 void applyProcessingFunctional (
00650         BoundedReductiveBoxProcessingFunctional2D_L<T,Descriptor>& functional,
00651         Box2D domain, MultiBlockLattice2D<T,Descriptor>& lattice, plint boundaryWidth )
00652 {
00653     std::vector<MultiBlock2D*> multiBlocks(1);
00654     multiBlocks[0] = dynamic_cast<MultiBlock2D*>(&lattice);
00655     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00656 }
00657 
00658 
00659 /* *************** BoundedReductiveBoxProcessing2D_S ********************************* */
00660 
00661 template<typename T>
00662 void applyProcessingFunctional (
00663         BoundedReductiveBoxProcessingFunctional2D_S<T>& functional,
00664         Box2D domain, MultiScalarField2D<T>& field, plint boundaryWidth )
00665 {
00666     std::vector<MultiBlock2D*> multiBlocks(1);
00667     multiBlocks[0] = dynamic_cast<MultiBlock2D*>(&field);
00668     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00669 }
00670 
00671 /* *************** BoundedReductiveBoxProcessing2D_T ********************************* */
00672 
00673 template<typename T, int nDim>
00674 void applyProcessingFunctional (
00675         BoundedReductiveBoxProcessingFunctional2D_T<T,nDim>& functional,
00676         Box2D domain, MultiTensorField2D<T,nDim>& field, plint boundaryWidth )
00677 {
00678     std::vector<MultiBlock2D*> multiBlocks(1);
00679     multiBlocks[0] = dynamic_cast<MultiBlock2D*>(&field);
00680     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00681 }
00682 
00683 /* *************** BoundedReductiveBoxProcessing2D_N ********************************* */
00684 
00685 template<typename T>
00686 void applyProcessingFunctional (
00687         BoundedReductiveBoxProcessingFunctional2D_N<T>& functional,
00688         Box2D domain, MultiNTensorField2D<T>& field, plint boundaryWidth )
00689 {
00690     std::vector<MultiBlock2D*> multiBlocks(1);
00691     multiBlocks[0] = dynamic_cast<MultiBlock2D*>(&field);
00692     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00693 }
00694 
00695 /* *************** BoundedMaskedReductiveBoxProcessing2D_N ********************************* */
00696 
00697 template<typename T>
00698 void applyProcessingFunctional (
00699         BoundedMaskedReductiveBoxProcessingFunctional2D_N<T>& functional,
00700         Box2D domain,
00701         MultiNTensorField2D<T>& field,
00702         MultiNTensorField2D<int>& mask,
00703         plint boundaryWidth )
00704 {
00705     std::vector<MultiBlock2D*> multiBlocks(2);
00706     multiBlocks[0] = dynamic_cast<MultiBlock2D*>(&field);
00707     multiBlocks[1] = dynamic_cast<MultiBlock2D*>(&mask);
00708     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00709 }
00710 
00711 /* *************** BoundedReductiveBoxProcessing2D_LL********************************* */
00712 
00713 template<typename T1, template<typename U1> class Descriptor1,
00714          typename T2, template<typename U2> class Descriptor2>
00715 void applyProcessingFunctional (
00716         BoundedReductiveBoxProcessingFunctional2D_LL<T1,Descriptor1,T2,Descriptor2>& functional,
00717         Box2D domain,
00718         MultiBlockLattice2D<T1,Descriptor1>& lattice1,
00719         MultiBlockLattice2D<T2,Descriptor2>& lattice2,
00720         plint boundaryWidth )
00721 {
00722     std::vector<MultiBlock2D*> multiBlocks(2);
00723     multiBlocks[0] = dynamic_cast<MultiBlock2D*>(&lattice1);
00724     multiBlocks[1] = dynamic_cast<MultiBlock2D*>(&lattice2);
00725     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00726 }
00727 
00728 
00729 /* *************** BoundedReductiveBoxProcessing2D_SS ****************************************** */
00730 
00731 template<typename T1, typename T2>
00732 void applyProcessingFunctional (
00733         BoundedReductiveBoxProcessingFunctional2D_SS<T1,T2>& functional,
00734         Box2D domain,
00735         MultiScalarField2D<T1>& field1,
00736         MultiScalarField2D<T2>& field2,
00737         plint boundaryWidth )
00738 {
00739     std::vector<MultiBlock2D*> multiBlocks(2);
00740     multiBlocks[0] = dynamic_cast<MultiBlock2D*>(&field1);
00741     multiBlocks[1] = dynamic_cast<MultiBlock2D*>(&field2);
00742     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00743 }
00744 
00745 /* *************** BoundedReductiveBoxProcessing2D_TT ********************************** */
00746 
00747 template<typename T1, int nDim1, typename T2, int nDim2>
00748 void applyProcessingFunctional (
00749         BoundedReductiveBoxProcessingFunctional2D_TT<T1,nDim1,T2,nDim2>& functional,
00750         Box2D domain,
00751         MultiTensorField2D<T1,nDim1>& field1,
00752         MultiTensorField2D<T2,nDim2>& field2,
00753         plint boundaryWidth )
00754 {
00755     std::vector<MultiBlock2D*> multiBlocks(2);
00756     multiBlocks[0] = dynamic_cast<MultiBlock2D*>(&field1);
00757     multiBlocks[1] = dynamic_cast<MultiBlock2D*>(&field2);
00758     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00759 }
00760 
00761 
00762 /* *************** BoundedReductiveBoxProcessing2D_NN ********************************** */
00763 
00764 template<typename T1, typename T2>
00765 void applyProcessingFunctional (
00766         BoundedReductiveBoxProcessingFunctional2D_NN<T1,T2>& functional,
00767         Box2D domain,
00768         MultiNTensorField2D<T1>& field1,
00769         MultiNTensorField2D<T2>& field2,
00770         plint boundaryWidth )
00771 {
00772     std::vector<MultiBlock2D*> multiBlocks(2);
00773     multiBlocks[0] = dynamic_cast<MultiBlock2D*>(&field1);
00774     multiBlocks[1] = dynamic_cast<MultiBlock2D*>(&field2);
00775     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00776 }
00777 
00778 
00779 /* *************** BoundedMaskedReductiveBoxProcessing2D_NN ********************************** */
00780 
00781 template<typename T1, typename T2>
00782 void applyProcessingFunctional (
00783         BoundedMaskedReductiveBoxProcessingFunctional2D_NN<T1,T2>& functional,
00784         Box2D domain,
00785         MultiNTensorField2D<T1>& field1,
00786         MultiNTensorField2D<T2>& field2,
00787         MultiNTensorField2D<int>& mask,
00788         plint boundaryWidth )
00789 {
00790     std::vector<MultiBlock2D*> multiBlocks(3);
00791     multiBlocks[0] = dynamic_cast<MultiBlock2D*>(&field1);
00792     multiBlocks[1] = dynamic_cast<MultiBlock2D*>(&field2);
00793     multiBlocks[2] = dynamic_cast<MultiBlock2D*>(&mask);
00794     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00795 }
00796 
00797 
00798 /* *************** BoundedReductiveBoxProcessing2D_ST ******************************** */
00799 
00800 template<typename T1, typename T2, int nDim>
00801 void applyProcessingFunctional (
00802         BoundedReductiveBoxProcessingFunctional2D_ST<T1,T2,nDim>& functional,
00803         Box2D domain,
00804         MultiScalarField2D<T1>& field1,
00805         MultiTensorField2D<T2,nDim>& field2,
00806         plint boundaryWidth )
00807 {
00808     std::vector<MultiBlock2D*> multiBlocks(2);
00809     multiBlocks[0] = dynamic_cast<MultiBlock2D*>(&field1);
00810     multiBlocks[1] = dynamic_cast<MultiBlock2D*>(&field2);
00811     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00812 }
00813 
00814 
00815 /* *************** BoundedReductiveBoxProcessing2D_SN ******************************** */
00816 
00817 template<typename T1, typename T2>
00818 void applyProcessingFunctional (
00819         BoundedReductiveBoxProcessingFunctional2D_SN<T1,T2>& functional,
00820         Box2D domain,
00821         MultiScalarField2D<T1>& field1,
00822         MultiNTensorField2D<T2>& field2,
00823         plint boundaryWidth )
00824 {
00825     std::vector<MultiBlock2D*> multiBlocks(2);
00826     multiBlocks[0] = dynamic_cast<MultiBlock2D*>(&field1);
00827     multiBlocks[1] = dynamic_cast<MultiBlock2D*>(&field2);
00828     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00829 }
00830 
00831 
00832 /* *************** BoundedReductiveBoxProcessing2D_LS ******************************** */
00833 
00834 template<typename T1, template<typename U> class Descriptor, typename T2>
00835 void applyProcessingFunctional (
00836         BoundedReductiveBoxProcessingFunctional2D_LS<T1,Descriptor,T2>& functional,
00837         Box2D domain,
00838         MultiBlockLattice2D<T1,Descriptor>& lattice,
00839         MultiScalarField2D<T2>& field,
00840         plint boundaryWidth )
00841 {
00842     std::vector<MultiBlock2D*> multiBlocks(2);
00843     multiBlocks[0] = dynamic_cast<MultiBlock2D*>(&lattice);
00844     multiBlocks[1] = dynamic_cast<MultiBlock2D*>(&field);
00845     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00846 }
00847 
00848 /* *************** BoundedReductiveBoxProcessing2D_LT ****************************************** */
00849 
00850 template<typename T1, template<typename U> class Descriptor, typename T2, int nDim>
00851 void applyProcessingFunctional (
00852         BoundedReductiveBoxProcessingFunctional2D_LT<T1,Descriptor,T2,nDim>& functional,
00853         Box2D domain,
00854         MultiBlockLattice2D<T1,Descriptor>& lattice,
00855         MultiTensorField2D<T2,nDim>& field,
00856         plint boundaryWidth )
00857 {
00858     std::vector<MultiBlock2D*> multiBlocks(2);
00859     multiBlocks[0] = dynamic_cast<MultiBlock2D*>(&lattice);
00860     multiBlocks[1] = dynamic_cast<MultiBlock2D*>(&field);
00861     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00862 }
00863 
00864 /* *************** BoundedReductiveBoxProcessing2D_LN ****************************************** */
00865 
00866 template<typename T1, template<typename U> class Descriptor, typename T2>
00867 void applyProcessingFunctional (
00868         BoundedReductiveBoxProcessingFunctional2D_LN<T1,Descriptor,T2>& functional,
00869         Box2D domain,
00870         MultiBlockLattice2D<T1,Descriptor>& lattice,
00871         MultiNTensorField2D<T2>& field,
00872         plint boundaryWidth )
00873 {
00874     std::vector<MultiBlock2D*> multiBlocks(2);
00875     multiBlocks[0] = dynamic_cast<MultiBlock2D*>(&lattice);
00876     multiBlocks[1] = dynamic_cast<MultiBlock2D*>(&field);
00877     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00878 }
00879 
00880 /* *************** BoundedMaskedReductiveBoxProcessing2D_LN ****************************************** */
00881 
00882 template<typename T1, template<typename U> class Descriptor, typename T2>
00883 void applyProcessingFunctional (
00884         BoundedMaskedReductiveBoxProcessingFunctional2D_LN<T1,Descriptor,T2>& functional,
00885         Box2D domain,
00886         MultiBlockLattice2D<T1,Descriptor>& lattice,
00887         MultiNTensorField2D<T2>& field,
00888         MultiNTensorField2D<int>& mask,
00889         plint boundaryWidth )
00890 {
00891     std::vector<MultiBlock2D*> multiBlocks(3);
00892     multiBlocks[0] = dynamic_cast<MultiBlock2D*>(&lattice);
00893     multiBlocks[1] = dynamic_cast<MultiBlock2D*>(&field);
00894     multiBlocks[2] = dynamic_cast<MultiBlock2D*>(&mask);
00895     applyProcessingFunctional(functional, domain, multiBlocks, boundaryWidth);
00896 }
00897 
00898 }  // namespace plb
00899 
00900 #endif  // REDUCTIVE_MULTI_DATA_PROCESSOR_WRAPPER_2D_HH