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

reductiveDataProcessorWrapper2D.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_DATA_PROCESSOR_WRAPPER_2D_HH
00027 #define REDUCTIVE_DATA_PROCESSOR_WRAPPER_2D_HH
00028 
00029 #include "atomicBlock/reductiveDataProcessorWrapper2D.h"
00030 #include "atomicBlock/blockLattice2D.h"
00031 #include "atomicBlock/dataField2D.h"
00032 #include "atomicBlock/dataProcessor2D.h"
00033 #include "atomicBlock/atomicBlockOperations2D.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<BlockLattice2D<T,Descriptor>*> lattices )
00045 {
00046     std::vector<AtomicBlock2D*> atomicBlocks(lattices.size());
00047     for (pluint iLattice=0; iLattice<lattices.size(); ++iLattice) {
00048         atomicBlocks[iLattice] = dynamic_cast<AtomicBlock2D*>(lattices[iLattice]);
00049     }
00050     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00051     executeDataProcessor( generator, atomicBlocks );
00052     functional.getStatistics() = generator.getFunctional().getStatistics();
00053 }
00054 
00055 
00056 /* *************** ScalarFieldBoxProcessing2D ******************************* */
00057 
00058 template<typename T>
00059 void applyProcessingFunctional(ReductiveScalarFieldBoxProcessingFunctional2D<T>& functional,
00060                                Box2D domain,
00061                                std::vector<ScalarField2D<T>*> fields )
00062 {
00063     std::vector<AtomicBlock2D*> atomicBlocks(fields.size());
00064     for (pluint iField=0; iField<fields.size(); ++iField) {
00065         atomicBlocks[iField] = dynamic_cast<AtomicBlock2D*>(fields[iField]);
00066     }
00067     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00068     executeDataProcessor( generator, atomicBlocks );
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<TensorField2D<T,nDim>*> fields )
00080 {
00081     std::vector<AtomicBlock2D*> atomicBlocks(fields.size());
00082     for (pluint iField=0; iField<fields.size(); ++iField) {
00083         atomicBlocks[iField] = dynamic_cast<AtomicBlock2D*>(fields[iField]);
00084     }
00085     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00086     executeDataProcessor( generator, atomicBlocks );
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<NTensorField2D<T>*> fields )
00097 {
00098     std::vector<AtomicBlock2D*> atomicBlocks(fields.size());
00099     for (pluint iField=0; iField<fields.size(); ++iField) {
00100         atomicBlocks[iField] = dynamic_cast<AtomicBlock2D*>(fields[iField]);
00101     }
00102     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00103     executeDataProcessor( generator, atomicBlocks );
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, BlockLattice2D<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, ScalarField2D<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, TensorField2D<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, NTensorField2D<T>& field)
00147 {
00148     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00149     executeDataProcessor( generator, field );
00150     functional.getStatistics() = generator.getFunctional().getStatistics();
00151 }
00152 
00153 /* *************** ReductiveBoxProcessing2D_LL******************************************* */
00154 
00155 template<typename T1, template<typename U1> class Descriptor1,
00156          typename T2, template<typename U2> class Descriptor2>
00157 void applyProcessingFunctional (
00158         ReductiveBoxProcessingFunctional2D_LL<T1,Descriptor1,T2,Descriptor2>& functional,
00159         Box2D domain,
00160         BlockLattice2D<T1,Descriptor1>& lattice1,
00161         BlockLattice2D<T2,Descriptor2>& lattice2 )
00162 {
00163     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00164     executeDataProcessor( generator, lattice1, lattice2 );
00165     functional.getStatistics() = generator.getFunctional().getStatistics();
00166 }
00167 
00168 
00169 /* *************** ReductiveBoxProcessing2D_SS ****************************************** */
00170 
00171 template<typename T1, typename T2>
00172 void applyProcessingFunctional(ReductiveBoxProcessingFunctional2D_SS<T1,T2>& functional,
00173                                Box2D domain,
00174                                ScalarField2D<T1>& field1,
00175                                ScalarField2D<T2>& field2 )
00176 {
00177     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00178     executeDataProcessor( generator, field1, field2 );
00179     functional.getStatistics() = generator.getFunctional().getStatistics();
00180 }
00181 
00182 /* *************** ReductiveBoxProcessing2D_TT ****************************************** */
00183 
00184 template<typename T1, int nDim1, typename T2, int nDim2>
00185 void applyProcessingFunctional (
00186         ReductiveBoxProcessingFunctional2D_TT<T1,nDim1,T2,nDim2>& functional,
00187         Box2D domain,
00188         TensorField2D<T1,nDim1>& field1,
00189         TensorField2D<T2,nDim2>& field2 )
00190 {
00191     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00192     executeDataProcessor( generator, field1, field2 );
00193     functional.getStatistics() = generator.getFunctional().getStatistics();
00194 }
00195 
00196 /* *************** ReductiveBoxProcessing2D_NN ****************************************** */
00197 
00198 template<typename T1, typename T2>
00199 void applyProcessingFunctional (
00200         ReductiveBoxProcessingFunctional2D_NN<T1,T2>& functional,
00201         Box2D domain,
00202         NTensorField2D<T1>& field1,
00203         NTensorField2D<T2>& field2 )
00204 {
00205     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00206     executeDataProcessor( generator, field1, field2 );
00207     functional.getStatistics() = generator.getFunctional().getStatistics();
00208 }
00209 
00210 /* *************** ReductiveBoxProcessing2D_ST ****************************************** */
00211 
00212 template<typename T1, typename T2, int nDim>
00213 void applyProcessingFunctional(ReductiveBoxProcessingFunctional2D_ST<T1,T2,nDim>& functional,
00214                                Box2D domain,
00215                                ScalarField2D<T1>& field1,
00216                                TensorField2D<T2,nDim>& field2 )
00217 {
00218     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00219     executeDataProcessor( generator, field1, field2 );
00220     functional.getStatistics() = generator.getFunctional().getStatistics();
00221 }
00222 
00223 
00224 /* *************** ReductiveBoxProcessing2D_SN ****************************************** */
00225 
00226 template<typename T1, typename T2>
00227 void applyProcessingFunctional(ReductiveBoxProcessingFunctional2D_SN<T1,T2>& functional,
00228                                Box2D domain,
00229                                ScalarField2D<T1>& field1,
00230                                NTensorField2D<T2>& field2 )
00231 {
00232     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00233     executeDataProcessor( generator, field1, field2 );
00234     functional.getStatistics() = generator.getFunctional().getStatistics();
00235 }
00236 
00237 
00238 /* *************** ReductiveBoxProcessing2D_LS ****************************************** */
00239 
00240 template<typename T1, template<typename U> class Descriptor, typename T2>
00241 void applyProcessingFunctional (
00242         ReductiveBoxProcessingFunctional2D_LS<T1,Descriptor,T2>& functional,
00243         Box2D domain,
00244         BlockLattice2D<T1,Descriptor>& lattice,
00245         ScalarField2D<T2>& field )
00246 {
00247     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00248     executeDataProcessor( generator, lattice, field );
00249     functional.getStatistics() = generator.getFunctional().getStatistics();
00250 }
00251 
00252 
00253 /* *************** ReductiveBoxProcessing2D_LT ****************************************** */
00254 
00255 template<typename T1, template<typename U> class Descriptor, typename T2, int nDim>
00256 void applyProcessingFunctional (
00257         ReductiveBoxProcessingFunctional2D_LT<T1,Descriptor,T2,nDim>& functional,
00258         Box2D domain,
00259         BlockLattice2D<T1,Descriptor>& lattice,
00260         TensorField2D<T2,nDim>& field )
00261 {
00262     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00263     executeDataProcessor( generator, lattice, field );
00264     functional.getStatistics() = generator.getFunctional().getStatistics();
00265 }
00266 
00267 /* *************** ReductiveBoxProcessing2D_LN ****************************************** */
00268 
00269 template<typename T1, template<typename U> class Descriptor, typename T2>
00270 void applyProcessingFunctional (
00271         ReductiveBoxProcessingFunctional2D_LN<T1,Descriptor,T2>& functional,
00272         Box2D domain,
00273         BlockLattice2D<T1,Descriptor>& lattice,
00274         NTensorField2D<T2>& field )
00275 {
00276     ReductiveBoxProcessorGenerator2D generator(functional.clone(), domain);
00277     executeDataProcessor( generator, lattice, field );
00278     functional.getStatistics() = generator.getFunctional().getStatistics();
00279 }
00280 
00281 /* *************** LatticeDotProcessing2D ****************************************** */
00282 
00283 template<typename T, template<typename U> class Descriptor>
00284 void applyProcessingFunctional (
00285         ReductiveLatticeDotProcessingFunctional2D<T,Descriptor>& functional,
00286         DotList2D const& dotList,
00287         std::vector<BlockLattice2D<T,Descriptor>*> lattices )
00288 {
00289     std::vector<AtomicBlock2D*> atomicBlocks(lattices.size());
00290     for (pluint iLattice=0; iLattice<lattices.size(); ++iLattice) {
00291         atomicBlocks[iLattice] = dynamic_cast<AtomicBlock2D*>(lattices[iLattice]);
00292     }
00293     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00294     executeDataProcessor( generator, atomicBlocks );
00295     functional.getStatistics() = generator.getFunctional().getStatistics();
00296 }
00297 
00298 
00299 /* *************** ScalarFieldDotProcessing2D ****************************************** */
00300 
00301 template<typename T>
00302 void applyProcessingFunctional(ReductiveScalarFieldDotProcessingFunctional2D<T>& functional,
00303                                DotList2D const& dotList,
00304                                std::vector<ScalarField2D<T>*> fields )
00305 {
00306     std::vector<AtomicBlock2D*> atomicBlocks(fields.size());
00307     for (pluint iField=0; iField<fields.size(); ++iField) {
00308         atomicBlocks[iField] = dynamic_cast<AtomicBlock2D*>(fields[iField]);
00309     }
00310     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00311     executeDataProcessor( generator, atomicBlocks );
00312     functional.getStatistics() = generator.getFunctional().getStatistics();
00313 }
00314 
00315 
00316 
00317 /* *************** TensorFieldDotProcessing2D ****************************************** */
00318 
00319 template<typename T, int nDim>
00320 void applyProcessingFunctional (
00321         ReductiveTensorFieldDotProcessingFunctional2D<T,nDim>& functional,
00322         DotList2D const& dotList,
00323         std::vector<TensorField2D<T,nDim>*> fields )
00324 {
00325     std::vector<AtomicBlock2D*> atomicBlocks(fields.size());
00326     for (pluint iField=0; iField<fields.size(); ++iField) {
00327         atomicBlocks[iField] = dynamic_cast<AtomicBlock2D*>(fields[iField]);
00328     }
00329     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00330     executeDataProcessor( generator, atomicBlocks );
00331     functional.getStatistics() = generator.getFunctional().getStatistics();
00332 }
00333 
00334 /* *************** NTensorFieldDotProcessing2D ****************************************** */
00335 
00336 template<typename T>
00337 void applyProcessingFunctional (
00338         ReductiveNTensorFieldDotProcessingFunctional2D<T>& functional,
00339         DotList2D const& dotList,
00340         std::vector<NTensorField2D<T>*> fields )
00341 {
00342     std::vector<AtomicBlock2D*> atomicBlocks(fields.size());
00343     for (pluint iField=0; iField<fields.size(); ++iField) {
00344         atomicBlocks[iField] = dynamic_cast<AtomicBlock2D*>(fields[iField]);
00345     }
00346     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00347     executeDataProcessor( generator, atomicBlocks );
00348     functional.getStatistics() = generator.getFunctional().getStatistics();
00349 }
00350 
00351 /* *************** ReductiveDotProcessing2D_L ******************************************* */
00352 
00353 template<typename T, template<typename U> class Descriptor>
00354 void applyProcessingFunctional(ReductiveDotProcessingFunctional2D_L<T,Descriptor>& functional,
00355                                DotList2D const& dotList,
00356                                BlockLattice2D<T,Descriptor>& lattice)
00357 {
00358     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00359     executeDataProcessor( generator, lattice );
00360     functional.getStatistics() = generator.getFunctional().getStatistics();
00361 }
00362 
00363 
00364 /* *************** ReductiveDotProcessing2D_S ******************************************* */
00365 
00366 template<typename T>
00367 void applyProcessingFunctional(ReductiveDotProcessingFunctional2D_S<T>& functional,
00368                                DotList2D const& dotList, ScalarField2D<T>& field)
00369 {
00370     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00371     executeDataProcessor( generator, field );
00372     functional.getStatistics() = generator.getFunctional().getStatistics();
00373 }
00374 
00375 
00376 /* *************** ReductiveDotProcessing2D_T ******************************************* */
00377 
00378 template<typename T, int nDim>
00379 void applyProcessingFunctional(ReductiveDotProcessingFunctional2D_T<T,nDim>& functional,
00380                                DotList2D const& dotList,
00381                                TensorField2D<T,nDim>& field)
00382 {
00383     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00384     executeDataProcessor( generator, field );
00385     functional.getStatistics() = generator.getFunctional().getStatistics();
00386 }
00387 
00388 /* *************** ReductiveDotProcessing2D_N ******************************************* */
00389 
00390 template<typename T>
00391 void applyProcessingFunctional(ReductiveDotProcessingFunctional2D_N<T>& functional,
00392                                DotList2D const& dotList,
00393                                NTensorField2D<T>& field)
00394 {
00395     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00396     executeDataProcessor( generator, field );
00397     functional.getStatistics() = generator.getFunctional().getStatistics();
00398 }
00399 
00400 /* *************** ReductiveDotProcessing2D_LL******************************************* */
00401 
00402 template<typename T1, template<typename U1> class Descriptor1,
00403          typename T2, template<typename U2> class Descriptor2>
00404 void applyProcessingFunctional (
00405         ReductiveDotProcessingFunctional2D_LL<T1,Descriptor1,T2,Descriptor2>& functional,
00406         DotList2D const& dotList,
00407         BlockLattice2D<T1,Descriptor1>& lattice1,
00408         BlockLattice2D<T2,Descriptor2>& lattice2 )
00409 {
00410     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00411     executeDataProcessor( generator, lattice1, lattice2 );
00412     functional.getStatistics() = generator.getFunctional().getStatistics();
00413 }
00414 
00415 /* *************** ReductiveDotProcessing2D_SS ****************************************** */
00416 
00417 template<typename T1, typename T2>
00418 void applyProcessingFunctional (
00419         ReductiveDotProcessingFunctional2D_SS<T1,T2>& functional,
00420         DotList2D const& dotList,
00421         ScalarField2D<T1>& field1,
00422         ScalarField2D<T2>& field2 )
00423 {
00424     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00425     executeDataProcessor( generator, field1, field2 );
00426     functional.getStatistics() = generator.getFunctional().getStatistics();
00427 }
00428 
00429 /* *************** ReductiveDotProcessing2D_TT ****************************************** */
00430 
00431 template<typename T1, int nDim1, typename T2, int nDim2>
00432 void applyProcessingFunctional (
00433         ReductiveDotProcessingFunctional2D_TT<T1,nDim1,T2,nDim2>& functional,
00434         DotList2D const& dotList,
00435         TensorField2D<T1,nDim1>& field1,
00436         TensorField2D<T2,nDim2>& field2 )
00437 {
00438     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00439     executeDataProcessor( generator, field1, field2 );
00440     functional.getStatistics() = generator.getFunctional().getStatistics();
00441 }
00442 
00443 
00444 /* *************** ReductiveDotProcessing2D_NN ****************************************** */
00445 
00446 template<typename T1, typename T2>
00447 void applyProcessingFunctional (
00448         ReductiveDotProcessingFunctional2D_NN<T1,T2>& functional,
00449         DotList2D const& dotList,
00450         NTensorField2D<T1>& field1,
00451         NTensorField2D<T2>& field2 )
00452 {
00453     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00454     executeDataProcessor( generator, field1, field2 );
00455     functional.getStatistics() = generator.getFunctional().getStatistics();
00456 }
00457 
00458 
00459 /* *************** ReductiveDotProcessing2D_ST ****************************************** */
00460 
00461 template<typename T1, typename T2, int nDim>
00462 void applyProcessingFunctional(ReductiveDotProcessingFunctional2D_ST<T1,T2,nDim>& functional,
00463                                DotList2D const& dotList,
00464                                ScalarField2D<T1>& field1,
00465                                TensorField2D<T2,nDim>& field2 )
00466 {
00467     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00468     executeDataProcessor( generator, field1, field2 );
00469     functional.getStatistics() = generator.getFunctional().getStatistics();
00470 }
00471 
00472 
00473 /* *************** ReductiveDotProcessing2D_SN ****************************************** */
00474 
00475 template<typename T1, typename T2>
00476 void applyProcessingFunctional(ReductiveDotProcessingFunctional2D_SN<T1,T2>& functional,
00477                                DotList2D const& dotList,
00478                                ScalarField2D<T1>& field1,
00479                                NTensorField2D<T2>& field2 )
00480 {
00481     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00482     executeDataProcessor( generator, field1, field2 );
00483     functional.getStatistics() = generator.getFunctional().getStatistics();
00484 }
00485 
00486 
00487 /* *************** ReductiveDotProcessing2D_LS ****************************************** */
00488 
00489 template<typename T1, template<typename U> class Descriptor, typename T2>
00490 void applyProcessingFunctional (
00491         ReductiveDotProcessingFunctional2D_LS<T1,Descriptor,T2>& functional,
00492         DotList2D const& dotList,
00493         BlockLattice2D<T1,Descriptor>& lattice,
00494         ScalarField2D<T2>& field )
00495 {
00496     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00497     executeDataProcessor( generator, lattice, field );
00498     functional.getStatistics() = generator.getFunctional().getStatistics();
00499 }
00500 
00501 /* *************** ReductiveDotProcessing2D_LT ****************************************** */
00502 
00503 template<typename T1, template<typename U> class Descriptor, typename T2, int nDim>
00504 void applyProcessingFunctional (
00505         ReductiveDotProcessingFunctional2D_LT<T1,Descriptor,T2,nDim>& functional,
00506         DotList2D const& dotList,
00507         BlockLattice2D<T1,Descriptor>& lattice,
00508         TensorField2D<T2,nDim>& field )
00509 {
00510     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00511     executeDataProcessor( generator, lattice, field );
00512     functional.getStatistics() = generator.getFunctional().getStatistics();
00513 }
00514 
00515 
00516 /* *************** ReductiveDotProcessing2D_LN ****************************************** */
00517 
00518 template<typename T1, template<typename U> class Descriptor, typename T2>
00519 void applyProcessingFunctional (
00520         ReductiveDotProcessingFunctional2D_LN<T1,Descriptor,T2>& functional,
00521         DotList2D const& dotList,
00522         BlockLattice2D<T1,Descriptor>& lattice,
00523         NTensorField2D<T2>& field )
00524 {
00525     ReductiveDotProcessorGenerator2D generator(functional.clone(), dotList);
00526     executeDataProcessor( generator, lattice, field );
00527     functional.getStatistics() = generator.getFunctional().getStatistics();
00528 }
00529 
00530 
00531 /* *************** BoundedReductiveLatticeBoxProcessing2D **************************** */
00532 
00533 template<typename T, template<typename U> class Descriptor>
00534 void applyProcessingFunctional (
00535         BoundedReductiveLatticeBoxProcessingFunctional2D<T,Descriptor>& functional,
00536         Box2D domain,
00537         std::vector<BlockLattice2D<T,Descriptor>*> lattices,
00538         plint boundaryWidth )
00539 {
00540     std::vector<AtomicBlock2D*> atomicBlocks(lattices.size());
00541     for (pluint iLattice=0; iLattice<lattices.size(); ++iLattice) {
00542         atomicBlocks[iLattice] = dynamic_cast<AtomicBlock2D*>(lattices[iLattice]);
00543     }
00544     applyProcessingFunctional(functional, domain, atomicBlocks, boundaryWidth);
00545 }
00546 
00547 
00548 /* *************** BoundedReductiveScalarFieldBoxProcessing2D ************************ */
00549 
00550 template<typename T>
00551 void applyProcessingFunctional (
00552         BoundedReductiveScalarFieldBoxProcessingFunctional2D<T>& functional,
00553         Box2D domain,
00554         std::vector<ScalarField2D<T>*> fields,
00555         plint boundaryWidth )
00556 {
00557     std::vector<AtomicBlock2D*> atomicBlocks(fields.size());
00558     for (pluint iField=0; iField<fields.size(); ++iField) {
00559         atomicBlocks[iField] = dynamic_cast<AtomicBlock2D*>(fields[iField]);
00560     }
00561     applyProcessingFunctional(functional, domain, atomicBlocks, boundaryWidth);
00562 }
00563 
00564 
00565 /* *************** BoundedReductiveTensorFieldBoxProcessing2D ************************ */
00566 
00567 template<typename T, int nDim>
00568 void applyProcessingFunctional (
00569         BoundedReductiveTensorFieldBoxProcessingFunctional2D<T,nDim>& functional,
00570         Box2D domain,
00571         std::vector<TensorField2D<T,nDim>*> fields, plint boundaryWidth )
00572 {
00573     std::vector<AtomicBlock2D*> atomicBlocks(fields.size());
00574     for (pluint iField=0; iField<fields.size(); ++iField) {
00575         atomicBlocks[iField] = dynamic_cast<AtomicBlock2D*>(fields[iField]);
00576     }
00577     applyProcessingFunctional(functional, domain,
00578                               atomicBlocks, boundaryWidth);
00579 }
00580 
00581 /* *************** BoundedReductiveNTensorFieldBoxProcessing2D ************************ */
00582 
00583 template<typename T>
00584 void applyProcessingFunctional (
00585         BoundedReductiveNTensorFieldBoxProcessingFunctional2D<T>& functional,
00586         Box2D domain,
00587         std::vector<NTensorField2D<T>*> fields, plint boundaryWidth )
00588 {
00589     std::vector<AtomicBlock2D*> atomicBlocks(fields.size());
00590     for (pluint iField=0; iField<fields.size(); ++iField) {
00591         atomicBlocks[iField] = dynamic_cast<AtomicBlock2D*>(fields[iField]);
00592     }
00593     applyProcessingFunctional(functional, domain,
00594                               atomicBlocks, boundaryWidth);
00595 }
00596 
00597 /* *************** BoundedReductiveBoxProcessing2D_L ********************************* */
00598 
00599 template<typename T, template<typename U> class Descriptor>
00600 void applyProcessingFunctional (
00601         BoundedReductiveBoxProcessingFunctional2D_L<T,Descriptor>& functional,
00602         Box2D domain, BlockLattice2D<T,Descriptor>& lattice, plint boundaryWidth )
00603 {
00604     std::vector<AtomicBlock2D*> atomicBlocks(1);
00605     atomicBlocks[0] = dynamic_cast<AtomicBlock2D*>(&lattice);
00606     applyProcessingFunctional(functional, domain, atomicBlocks, boundaryWidth);
00607 }
00608 
00609 
00610 /* *************** BoundedReductiveBoxProcessing2D_S ********************************* */
00611 
00612 template<typename T>
00613 void applyProcessingFunctional (
00614         BoundedReductiveBoxProcessingFunctional2D_S<T>& functional,
00615         Box2D domain, ScalarField2D<T>& field, plint boundaryWidth )
00616 {
00617     std::vector<AtomicBlock2D*> atomicBlocks(1);
00618     atomicBlocks[0] = dynamic_cast<AtomicBlock2D*>(&field);
00619     applyProcessingFunctional(functional, domain, atomicBlocks, boundaryWidth);
00620 }
00621 
00622 /* *************** BoundedReductiveBoxProcessing2D_T ********************************* */
00623 
00624 template<typename T, int nDim>
00625 void applyProcessingFunctional (
00626         BoundedReductiveBoxProcessingFunctional2D_T<T,nDim>& functional,
00627         Box2D domain, TensorField2D<T,nDim>& field, plint boundaryWidth )
00628 {
00629     std::vector<AtomicBlock2D*> atomicBlocks(1);
00630     atomicBlocks[0] = dynamic_cast<AtomicBlock2D*>(&field);
00631     applyProcessingFunctional(functional, domain, atomicBlocks, boundaryWidth);
00632 }
00633 
00634 /* *************** BoundedReductiveBoxProcessing2D_N ********************************* */
00635 
00636 template<typename T>
00637 void applyProcessingFunctional (
00638         BoundedReductiveBoxProcessingFunctional2D_N<T>& functional,
00639         Box2D domain, NTensorField2D<T>& field, plint boundaryWidth )
00640 {
00641     std::vector<AtomicBlock2D*> atomicBlocks(1);
00642     atomicBlocks[0] = dynamic_cast<AtomicBlock2D*>(&field);
00643     applyProcessingFunctional(functional, domain, atomicBlocks, boundaryWidth);
00644 }
00645 
00646 /* *************** BoundedReductiveBoxProcessing2D_LL********************************* */
00647 
00648 template<typename T1, template<typename U1> class Descriptor1,
00649          typename T2, template<typename U2> class Descriptor2>
00650 void applyProcessingFunctional (
00651         BoundedReductiveBoxProcessingFunctional2D_LL<T1,Descriptor1,T2,Descriptor2>& functional,
00652         Box2D domain,
00653         BlockLattice2D<T1,Descriptor1>& lattice1,
00654         BlockLattice2D<T2,Descriptor2>& lattice2,
00655         plint boundaryWidth )
00656 {
00657     std::vector<AtomicBlock2D*> atomicBlocks(2);
00658     atomicBlocks[0] = dynamic_cast<AtomicBlock2D*>(&lattice1);
00659     atomicBlocks[1] = dynamic_cast<AtomicBlock2D*>(&lattice2);
00660     applyProcessingFunctional(functional, domain, atomicBlocks, boundaryWidth);
00661 }
00662 
00663 
00664 /* *************** BoundedReductiveBoxProcessing2D_SS ****************************************** */
00665 
00666 template<typename T1, typename T2>
00667 void applyProcessingFunctional (
00668         BoundedReductiveBoxProcessingFunctional2D_SS<T1,T2>& functional,
00669         Box2D domain,
00670         ScalarField2D<T1>& field1,
00671         ScalarField2D<T2>& field2,
00672         plint boundaryWidth )
00673 {
00674     std::vector<AtomicBlock2D*> atomicBlocks(2);
00675     atomicBlocks[0] = dynamic_cast<AtomicBlock2D*>(&field1);
00676     atomicBlocks[1] = dynamic_cast<AtomicBlock2D*>(&field2);
00677     applyProcessingFunctional(functional, domain, atomicBlocks, boundaryWidth);
00678 }
00679 
00680 /* *************** BoundedReductiveBoxProcessing2D_TT ********************************** */
00681 
00682 template<typename T1, int nDim1, typename T2, int nDim2>
00683 void applyProcessingFunctional (
00684         BoundedReductiveBoxProcessingFunctional2D_TT<T1,nDim1,T2,nDim2>& functional,
00685         Box2D domain,
00686         TensorField2D<T1,nDim1>& field1,
00687         TensorField2D<T2,nDim2>& field2,
00688         plint boundaryWidth )
00689 {
00690     std::vector<AtomicBlock2D*> atomicBlocks(2);
00691     atomicBlocks[0] = dynamic_cast<AtomicBlock2D*>(&field1);
00692     atomicBlocks[1] = dynamic_cast<AtomicBlock2D*>(&field2);
00693     applyProcessingFunctional(functional, domain, atomicBlocks, boundaryWidth);
00694 }
00695 
00696 
00697 /* *************** BoundedReductiveBoxProcessing2D_NN ********************************** */
00698 
00699 template<typename T1, typename T2>
00700 void applyProcessingFunctional (
00701         BoundedReductiveBoxProcessingFunctional2D_NN<T1,T2>& functional,
00702         Box2D domain,
00703         NTensorField2D<T1>& field1,
00704         NTensorField2D<T2>& field2,
00705         plint boundaryWidth )
00706 {
00707     std::vector<AtomicBlock2D*> atomicBlocks(2);
00708     atomicBlocks[0] = dynamic_cast<AtomicBlock2D*>(&field1);
00709     atomicBlocks[1] = dynamic_cast<AtomicBlock2D*>(&field2);
00710     applyProcessingFunctional(functional, domain, atomicBlocks, boundaryWidth);
00711 }
00712 
00713 
00714 /* *************** BoundedReductiveBoxProcessing2D_ST ******************************** */
00715 
00716 template<typename T1, typename T2, int nDim>
00717 void applyProcessingFunctional (
00718         BoundedReductiveBoxProcessingFunctional2D_ST<T1,T2,nDim>& functional,
00719         Box2D domain,
00720         ScalarField2D<T1>& field1,
00721         TensorField2D<T2,nDim>& field2,
00722         plint boundaryWidth )
00723 {
00724     std::vector<AtomicBlock2D*> atomicBlocks(2);
00725     atomicBlocks[0] = dynamic_cast<AtomicBlock2D*>(&field1);
00726     atomicBlocks[1] = dynamic_cast<AtomicBlock2D*>(&field2);
00727     applyProcessingFunctional(functional, domain, atomicBlocks, boundaryWidth);
00728 }
00729 
00730 /* *************** BoundedReductiveBoxProcessing2D_SN ******************************** */
00731 
00732 template<typename T1, typename T2>
00733 void applyProcessingFunctional (
00734         BoundedReductiveBoxProcessingFunctional2D_SN<T1,T2>& functional,
00735         Box2D domain,
00736         ScalarField2D<T1>& field1,
00737         NTensorField2D<T2>& field2,
00738         plint boundaryWidth )
00739 {
00740     std::vector<AtomicBlock2D*> atomicBlocks(2);
00741     atomicBlocks[0] = dynamic_cast<AtomicBlock2D*>(&field1);
00742     atomicBlocks[1] = dynamic_cast<AtomicBlock2D*>(&field2);
00743     applyProcessingFunctional(functional, domain, atomicBlocks, boundaryWidth);
00744 }
00745 
00746 
00747 /* *************** BoundedReductiveBoxProcessing2D_LS ******************************** */
00748 
00749 template<typename T1, template<typename U> class Descriptor, typename T2>
00750 void applyProcessingFunctional (
00751         BoundedReductiveBoxProcessingFunctional2D_LS<T1,Descriptor,T2>& functional,
00752         Box2D domain,
00753         BlockLattice2D<T1,Descriptor>& lattice,
00754         ScalarField2D<T2>& field,
00755         plint boundaryWidth )
00756 {
00757     std::vector<AtomicBlock2D*> atomicBlocks(2);
00758     atomicBlocks[0] = dynamic_cast<AtomicBlock2D*>(&lattice);
00759     atomicBlocks[1] = dynamic_cast<AtomicBlock2D*>(&field);
00760     applyProcessingFunctional(functional, domain, atomicBlocks, boundaryWidth);
00761 }
00762 
00763 /* *************** BoundedReductiveBoxProcessing2D_LT ****************************************** */
00764 
00765 template<typename T1, template<typename U> class Descriptor, typename T2, int nDim>
00766 void applyProcessingFunctional (
00767         BoundedReductiveBoxProcessingFunctional2D_LT<T1,Descriptor,T2,nDim>& functional,
00768         Box2D domain,
00769         BlockLattice2D<T1,Descriptor>& lattice,
00770         TensorField2D<T2,nDim>& field,
00771         plint boundaryWidth )
00772 {
00773     std::vector<AtomicBlock2D*> atomicBlocks(2);
00774     atomicBlocks[0] = dynamic_cast<AtomicBlock2D*>(&lattice);
00775     atomicBlocks[1] = dynamic_cast<AtomicBlock2D*>(&field);
00776     applyProcessingFunctional(functional, domain, atomicBlocks, boundaryWidth);
00777 }
00778 
00779 /* *************** BoundedReductiveBoxProcessing2D_LN ****************************************** */
00780 
00781 template<typename T1, template<typename U> class Descriptor, typename T2>
00782 void applyProcessingFunctional (
00783         BoundedReductiveBoxProcessingFunctional2D_LN<T1,Descriptor,T2>& functional,
00784         Box2D domain,
00785         BlockLattice2D<T1,Descriptor>& lattice,
00786         NTensorField2D<T2>& field,
00787         plint boundaryWidth )
00788 {
00789     std::vector<AtomicBlock2D*> atomicBlocks(2);
00790     atomicBlocks[0] = dynamic_cast<AtomicBlock2D*>(&lattice);
00791     atomicBlocks[1] = dynamic_cast<AtomicBlock2D*>(&field);
00792     applyProcessingFunctional(functional, domain, atomicBlocks, boundaryWidth);
00793 }
00794 
00795 }  // namespace plb
00796 
00797 #endif  // REDUCTIVE_DATA_PROCESSOR_WRAPPER_2D_HH