Palabos  Version 1.0
dataProcessingFunctional3D.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 DATA_PROCESSING_FUNCTIONAL_3D_HH
00027 #define DATA_PROCESSING_FUNCTIONAL_3D_HH
00028 
00029 #include "atomicBlock/dataProcessorWrapper3D.h"
00030 #include "atomicBlock/blockLattice3D.h"
00031 #include "atomicBlock/dataField3D.h"
00032 #include "atomicBlock/dataProcessor3D.h"
00033 #include "core/plbDebug.h"
00034 
00035 namespace plb {
00036 
00037 /* *************** BoxProcessing3D_L ******************************************* */
00038 
00039 template<typename T, template<typename U> class Descriptor>
00040 void BoxProcessingFunctional3D_L<T,Descriptor>::processGenericBlocks (
00041         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00042 {
00043     process(domain, dynamic_cast<BlockLattice3D<T,Descriptor>&>(*atomicBlocks[0]));
00044 }
00045 
00046 template<typename T, template<typename U> class Descriptor>
00047 void MaskedBoxProcessingFunctional3D_L<T,Descriptor>::processGenericBlocks (
00048         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00049 {
00050     process( domain,
00051              dynamic_cast<BlockLattice3D<T,Descriptor>&>(*atomicBlocks[0]),
00052              dynamic_cast<NTensorField3D<int>&>(*atomicBlocks[1])
00053            );
00054 }
00055 
00056 /* *************** BoxProcessing3D_S ******************************************* */
00057 
00058 template<typename T>
00059 void BoxProcessingFunctional3D_S<T>::processGenericBlocks (
00060         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00061 {
00062     process(domain, dynamic_cast<ScalarField3D<T>&>(*atomicBlocks[0]));
00063 }
00064 
00065 /* *************** BoxProcessing3D_T ******************************************* */
00066 
00067 template<typename T, int nDim>
00068 void BoxProcessingFunctional3D_T<T,nDim>::processGenericBlocks (
00069         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00070 {
00071     process(domain, dynamic_cast<TensorField3D<T,nDim>&>(*atomicBlocks[0]));
00072 }
00073 
00074 /* *************** BoxProcessing3D_N ******************************************* */
00075 
00076 template<typename T>
00077 void BoxProcessingFunctional3D_N<T>::processGenericBlocks (
00078         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00079 {
00080     process(domain, dynamic_cast<NTensorField3D<T>&>(*atomicBlocks[0]));
00081 }
00082 
00083 /* *************** MaskedBoxProcessing3D_N ******************************************* */
00084 
00085 template<typename T>
00086 void MaskedBoxProcessingFunctional3D_N<T>::processGenericBlocks (
00087         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00088 {
00089     process(domain,
00090             dynamic_cast<NTensorField3D<T>&>(*atomicBlocks[0]),
00091             dynamic_cast<NTensorField3D<int>&>(*atomicBlocks[1]));
00092 }
00093 
00094 /* *************** BoxProcessing3D_LL******************************************* */
00095 
00096 template<typename T1, template<typename U1> class Descriptor1,
00097          typename T2, template<typename U2> class Descriptor2>
00098 void BoxProcessingFunctional3D_LL<T1,Descriptor1,T2,Descriptor2>::processGenericBlocks (
00099         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00100 {
00101     PLB_PRECONDITION( atomicBlocks.size() == 2 );
00102     process ( domain,
00103               dynamic_cast<BlockLattice3D<T1,Descriptor1>&>(*atomicBlocks[0]),
00104               dynamic_cast<BlockLattice3D<T2,Descriptor2>&>(*atomicBlocks[1]) );
00105 }
00106 
00107 
00108 /* *************** BoxProcessing3D_SS ****************************************** */
00109 
00110 template<typename T1, typename T2>
00111 void BoxProcessingFunctional3D_SS<T1,T2>::processGenericBlocks (
00112         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00113 {
00114     process ( domain,
00115               dynamic_cast<ScalarField3D<T1>&>(*atomicBlocks[0]),
00116               dynamic_cast<ScalarField3D<T2>&>(*atomicBlocks[1]) );
00117 }
00118 
00119 
00120 /* *************** BoxProcessing3D_TT ****************************************** */
00121 
00122 template<typename T1, int nDim1, typename T2, int nDim2>
00123 void BoxProcessingFunctional3D_TT<T1,nDim1,T2,nDim2>::processGenericBlocks (
00124         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00125 {
00126     process ( domain,
00127               dynamic_cast<TensorField3D<T1,nDim1>&>(*atomicBlocks[0]),
00128               dynamic_cast<TensorField3D<T2,nDim2>&>(*atomicBlocks[1]) );
00129 }
00130 
00131 
00132 /* *************** BoxProcessing3D_NN ****************************************** */
00133 
00134 template<typename T1, typename T2>
00135 void BoxProcessingFunctional3D_NN<T1,T2>::processGenericBlocks (
00136         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00137 {
00138     process ( domain,
00139               dynamic_cast<NTensorField3D<T1>&>(*atomicBlocks[0]),
00140               dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]) );
00141 }
00142 
00143 
00144 /* *************** MaskedBoxProcessing3D_NN ****************************************** */
00145 
00146 template<typename T1, typename T2>
00147 void MaskedBoxProcessingFunctional3D_NN<T1,T2>::processGenericBlocks (
00148         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00149 {
00150     process ( domain,
00151               dynamic_cast<NTensorField3D<T1>&>(*atomicBlocks[0]),
00152               dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]),
00153               dynamic_cast<NTensorField3D<int>&>(*atomicBlocks[2]) );
00154 }
00155 
00156 
00157 /* *************** BoxProcessing3D_ST ****************************************** */
00158 
00159 template<typename T1, typename T2, int nDim>
00160 void BoxProcessingFunctional3D_ST<T1,T2,nDim>::processGenericBlocks (
00161         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00162 {
00163     process ( domain,
00164               dynamic_cast<ScalarField3D<T1>&>(*atomicBlocks[0]),
00165               dynamic_cast<TensorField3D<T2,nDim>&>(*atomicBlocks[1]) );
00166 }
00167 
00168 
00169 /* *************** BoxProcessing3D_SN ****************************************** */
00170 
00171 template<typename T1, typename T2>
00172 void BoxProcessingFunctional3D_SN<T1,T2>::processGenericBlocks (
00173         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00174 {
00175     process ( domain,
00176               dynamic_cast<ScalarField3D<T1>&>(*atomicBlocks[0]),
00177               dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]) );
00178 }
00179 
00180 
00181 /* *************** BoxProcessing3D_LS ****************************************** */
00182 
00183 template<typename T1, template<typename U> class Descriptor, typename T2>
00184 void BoxProcessingFunctional3D_LS<T1,Descriptor,T2>::processGenericBlocks (
00185         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00186 {
00187     process ( domain,
00188               dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
00189               dynamic_cast<ScalarField3D<T2>&>(*atomicBlocks[1]) );
00190 }
00191 
00192 /* *************** BoxProcessing3D_LT ****************************************** */
00193 
00194 template<typename T1, template<typename U> class Descriptor,
00195          typename T2, int nDim>
00196 void BoxProcessingFunctional3D_LT<T1,Descriptor,T2,nDim>::processGenericBlocks (
00197         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00198 {
00199     process ( domain,
00200               dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
00201               dynamic_cast<TensorField3D<T2,nDim>&>(*atomicBlocks[1]) );
00202 }
00203 
00204 /* *************** BoxProcessing3D_LN ****************************************** */
00205 
00206 template<typename T1, template<typename U> class Descriptor, typename T2>
00207 void BoxProcessingFunctional3D_LN<T1,Descriptor,T2>::processGenericBlocks (
00208         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00209 {
00210     process ( domain,
00211               dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
00212               dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]) );
00213 }
00214 
00215 /* *************** MaskedBoxProcessing3D_LN ****************************************** */
00216 
00217 template<typename T1, template<typename U> class Descriptor, typename T2>
00218 void MaskedBoxProcessingFunctional3D_LN<T1,Descriptor,T2>::processGenericBlocks (
00219         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00220 {
00221     process ( domain,
00222               dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
00223               dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]),
00224               dynamic_cast<NTensorField3D<int>&>(*atomicBlocks[2]) );
00225 }
00226 
00227 /* *************** LatticeBoxProcessing3D ************************************** */
00228 
00229 template<typename T, template<typename U> class Descriptor>
00230 void LatticeBoxProcessingFunctional3D<T,Descriptor>::processGenericBlocks (
00231         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00232 {
00233     std::vector<BlockLattice3D<T,Descriptor>*> lattices(atomicBlocks.size());
00234     for (pluint iLattice=0; iLattice<atomicBlocks.size(); ++iLattice) {
00235         lattices[iLattice] = dynamic_cast<BlockLattice3D<T,Descriptor>*>(atomicBlocks[iLattice]);
00236     }
00237     process(domain, lattices);
00238 }
00239 
00240 /* *************** ScalarFieldBoxProcessing3D *********************************** */
00241 
00242 template<typename T>
00243 void ScalarFieldBoxProcessingFunctional3D<T>::processGenericBlocks (
00244         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00245 {
00246     std::vector<ScalarField3D<T>*> fields(atomicBlocks.size());
00247     for (pluint iField=0; iField<atomicBlocks.size(); ++iField) {
00248         fields[iField] = dynamic_cast<ScalarField3D<T>*>(atomicBlocks[iField]);
00249     }
00250     process(domain, fields);
00251 }
00252 
00253 /* *************** TensorFieldBoxProcessing3D *********************************** */
00254 
00255 template<typename T, int nDim>
00256 void TensorFieldBoxProcessingFunctional3D<T,nDim>::processGenericBlocks (
00257         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00258 {
00259     std::vector<TensorField3D<T,nDim>*> fields(atomicBlocks.size());
00260     for (pluint iField=0; iField<atomicBlocks.size(); ++iField) {
00261         fields[iField] = dynamic_cast<TensorField3D<T,nDim>*>(atomicBlocks[iField]);
00262     }
00263     process(domain, fields);
00264 }
00265 
00266 /* *************** NTensorFieldBoxProcessing3D *********************************** */
00267 
00268 template<typename T>
00269 void NTensorFieldBoxProcessingFunctional3D<T>::processGenericBlocks (
00270         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00271 {
00272     std::vector<NTensorField3D<T>*> fields(atomicBlocks.size());
00273     for (pluint iField=0; iField<atomicBlocks.size(); ++iField) {
00274         fields[iField] = dynamic_cast<NTensorField3D<T>*>(atomicBlocks[iField]);
00275     }
00276     process(domain, fields);
00277 }
00278 
00279 
00280 template<typename T>
00281 void MaskedNTensorFieldBoxProcessingFunctional3D<T>::processGenericBlocks (
00282         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00283 {
00284     std::vector<NTensorField3D<T>*> fields(atomicBlocks.size()-1);
00285     for (pluint iField=0; iField<atomicBlocks.size()-1; ++iField) {
00286         fields[iField] = dynamic_cast<NTensorField3D<T>*>(atomicBlocks[iField]);
00287     }
00288     NTensorField3D<int>& mask = dynamic_cast<NTensorField3D<int>&>(*atomicBlocks.back());
00289     process(domain, fields, mask);
00290 }
00291 
00292 /* *************** DotProcessing3D_L ******************************************* */
00293 
00294 template<typename T, template<typename U> class Descriptor>
00295 void DotProcessingFunctional3D_L<T,Descriptor>::processGenericBlocks (
00296         DotList3D const& dotList, std::vector<AtomicBlock3D*> atomicBlocks )
00297 {
00298     process(dotList, dynamic_cast<BlockLattice3D<T,Descriptor>&>(*atomicBlocks[0]));
00299 }
00300 
00301 /* *************** DotProcessing3D_S ******************************************* */
00302 
00303 template<typename T>
00304 void DotProcessingFunctional3D_S<T>::processGenericBlocks (
00305         DotList3D const& dotList, std::vector<AtomicBlock3D*> atomicBlocks )
00306 {
00307     process(dotList, dynamic_cast<ScalarField3D<T>&>(*atomicBlocks[0]));
00308 }
00309 
00310 /* *************** DotProcessing3D_T ******************************************* */
00311 
00312 template<typename T, int nDim>
00313 void DotProcessingFunctional3D_T<T,nDim>::processGenericBlocks (
00314         DotList3D const& dotList, std::vector<AtomicBlock3D*> atomicBlocks )
00315 {
00316     process(dotList, dynamic_cast<TensorField3D<T,nDim>&>(*atomicBlocks[0]));
00317 }
00318 
00319 /* *************** DotProcessing3D_N ******************************************* */
00320 
00321 template<typename T>
00322 void DotProcessingFunctional3D_N<T>::processGenericBlocks (
00323         DotList3D const& dotList, std::vector<AtomicBlock3D*> atomicBlocks )
00324 {
00325     process(dotList, dynamic_cast<NTensorField3D<T>&>(*atomicBlocks[0]));
00326 }
00327 
00328 /* *************** DotProcessing3D_LL******************************************* */
00329 
00330 template<typename T1, template<typename U1> class Descriptor1,
00331          typename T2, template<typename U2> class Descriptor2>
00332 void DotProcessingFunctional3D_LL<T1,Descriptor1,T2,Descriptor2>::processGenericBlocks (
00333         DotList3D const& dotList, std::vector<AtomicBlock3D*> atomicBlocks ) {
00334     PLB_PRECONDITION( atomicBlocks.size() == 2 );
00335     process ( dotList,
00336               dynamic_cast<BlockLattice3D<T1,Descriptor1>&>(*atomicBlocks[0]),
00337               dynamic_cast<BlockLattice3D<T2,Descriptor2>&>(*atomicBlocks[1]) );
00338 }
00339 
00340 
00341 /* *************** DotProcessing3D_SS ****************************************** */
00342 
00343 template<typename T1, typename T2>
00344 void DotProcessingFunctional3D_SS<T1,T2>::processGenericBlocks (
00345         DotList3D const& dotList, std::vector<AtomicBlock3D*> atomicBlocks )
00346 {
00347     process ( dotList,
00348               dynamic_cast<ScalarField3D<T1>&>(*atomicBlocks[0]),
00349               dynamic_cast<ScalarField3D<T2>&>(*atomicBlocks[1]) );
00350 }
00351 
00352 
00353 /* *************** DotProcessing3D_TT ****************************************** */
00354 
00355 template<typename T1, int nDim1, typename T2, int nDim2>
00356 void DotProcessingFunctional3D_TT<T1,nDim1,T2,nDim2>::processGenericBlocks (
00357         DotList3D const& dotList, std::vector<AtomicBlock3D*> atomicBlocks )
00358 {
00359     process ( dotList,
00360               dynamic_cast<TensorField3D<T1,nDim1>&>(*atomicBlocks[0]),
00361               dynamic_cast<TensorField3D<T2,nDim2>&>(*atomicBlocks[1]) );
00362 }
00363 
00364 
00365 /* *************** DotProcessing3D_NN ****************************************** */
00366 
00367 template<typename T1, typename T2>
00368 void DotProcessingFunctional3D_NN<T1,T2>::processGenericBlocks (
00369         DotList3D const& dotList, std::vector<AtomicBlock3D*> atomicBlocks )
00370 {
00371     process ( dotList,
00372               dynamic_cast<NTensorField3D<T1>&>(*atomicBlocks[0]),
00373               dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]) );
00374 }
00375 
00376 
00377 /* *************** DotProcessing3D_ST ****************************************** */
00378 
00379 template<typename T1, typename T2, int nDim>
00380 void DotProcessingFunctional3D_ST<T1,T2,nDim>::processGenericBlocks (
00381         DotList3D const& dotList, std::vector<AtomicBlock3D*> atomicBlocks )
00382 {
00383     process ( dotList,
00384               dynamic_cast<ScalarField3D<T1>&>(*atomicBlocks[0]),
00385               dynamic_cast<TensorField3D<T2,nDim>&>(*atomicBlocks[1]) );
00386 }
00387 
00388 
00389 /* *************** DotProcessing3D_SN ****************************************** */
00390 
00391 template<typename T1, typename T2>
00392 void DotProcessingFunctional3D_SN<T1,T2>::processGenericBlocks (
00393         DotList3D const& dotList, std::vector<AtomicBlock3D*> atomicBlocks )
00394 {
00395     process ( dotList,
00396               dynamic_cast<ScalarField3D<T1>&>(*atomicBlocks[0]),
00397               dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]) );
00398 }
00399 
00400 
00401 /* *************** DotProcessing3D_LS ****************************************** */
00402 
00403 template<typename T1, template<typename U> class Descriptor, typename T2>
00404 void DotProcessingFunctional3D_LS<T1,Descriptor,T2>::processGenericBlocks (
00405         DotList3D const& dotList, std::vector<AtomicBlock3D*> atomicBlocks )
00406 {
00407     process ( dotList,
00408               dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
00409               dynamic_cast<ScalarField3D<T2>&>(*atomicBlocks[1]) );
00410 }
00411 
00412 
00413 /* *************** DotProcessing3D_LT ****************************************** */
00414 
00415 template<typename T1, template<typename U> class Descriptor,
00416          typename T2, int nDim>
00417 void DotProcessingFunctional3D_LT<T1,Descriptor,T2,nDim>::processGenericBlocks (
00418         DotList3D const& dotList, std::vector<AtomicBlock3D*> atomicBlocks )
00419 {
00420     process ( dotList,
00421               dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
00422               dynamic_cast<TensorField3D<T2,nDim>&>(*atomicBlocks[1]) );
00423 }
00424 
00425 /* *************** DotProcessing3D_LN ****************************************** */
00426 
00427 template<typename T1, template<typename U> class Descriptor, typename T2>
00428 void DotProcessingFunctional3D_LN<T1,Descriptor,T2>::processGenericBlocks (
00429         DotList3D const& dotList, std::vector<AtomicBlock3D*> atomicBlocks )
00430 {
00431     process ( dotList,
00432               dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
00433               dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]) );
00434 }
00435 
00436 /* *************** LatticeDotProcessing3D ******************************************* */
00437 
00438 template<typename T, template<typename U> class Descriptor>
00439 void LatticeDotProcessingFunctional3D<T,Descriptor>::processGenericBlocks (
00440         DotList3D const& dotList, std::vector<AtomicBlock3D*> atomicBlocks )
00441 {
00442     std::vector<BlockLattice3D<T,Descriptor>*> lattices(atomicBlocks.size());
00443     for (pluint iLattice=0; iLattice<atomicBlocks.size(); ++iLattice) {
00444         lattices[iLattice] = dynamic_cast<BlockLattice3D<T,Descriptor>*> (
00445                 atomicBlocks[iLattice] );
00446     }
00447     process(dotList, lattices);
00448 }
00449 
00450 /* *************** ScalarFieldDotProcessing3D ********************************* */
00451 
00452 template<typename T>
00453 void ScalarFieldDotProcessingFunctional3D<T>::processGenericBlocks (
00454         DotList3D const& dotList, std::vector<AtomicBlock3D*> atomicBlocks )
00455 {
00456     std::vector<ScalarField3D<T>*> fields(atomicBlocks.size());
00457     for (pluint iField=0; iField<atomicBlocks.size(); ++iField) {
00458         fields[iField] = dynamic_cast<ScalarField3D<T>*>(atomicBlocks[iField]);
00459     }
00460     process(dotList, fields);
00461 }
00462 
00463 /* *************** TensorFieldDotProcessing3D ********************************* */
00464 
00465 template<typename T, int nDim>
00466 void TensorFieldDotProcessingFunctional3D<T,nDim>::processGenericBlocks (
00467         DotList3D const& dotList, std::vector<AtomicBlock3D*> atomicBlocks )
00468 {
00469     std::vector<TensorField3D<T,nDim>*> fields(atomicBlocks.size());
00470     for (pluint iField=0; iField<atomicBlocks.size(); ++iField) {
00471         fields[iField] = dynamic_cast<TensorField3D<T,nDim>*>(atomicBlocks[iField]);
00472     }
00473     process(dotList, fields);
00474 }
00475 
00476 /* *************** TensorFieldDotProcessing3D ********************************* */
00477 
00478 template<typename T>
00479 void NTensorFieldDotProcessingFunctional3D<T>::processGenericBlocks (
00480         DotList3D const& dotList, std::vector<AtomicBlock3D*> atomicBlocks )
00481 {
00482     std::vector<NTensorField3D<T>*> fields(atomicBlocks.size());
00483     for (pluint iField=0; iField<atomicBlocks.size(); ++iField) {
00484         fields[iField] = dynamic_cast<NTensorField3D<T>*>(atomicBlocks[iField]);
00485     }
00486     process(dotList, fields);
00487 }
00488 
00489 /* *************** BoundedBoxProcessing3D_L ******************************************* */
00490 
00491 template<typename T, template<typename U> class Descriptor>
00492 void BoundedBoxProcessingFunctional3D_L<T,Descriptor>::processBulkGeneric (
00493         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00494 {
00495     processBulk(domain, dynamic_cast<BlockLattice3D<T,Descriptor>&>(*atomicBlocks[0]));
00496 }
00497 
00498 template<typename T, template<typename U> class Descriptor>
00499 void BoundedBoxProcessingFunctional3D_L<T,Descriptor>::processPlaneGeneric (
00500         int direction, int orientation,
00501         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00502 {
00503     processPlane(direction, orientation, domain, dynamic_cast<BlockLattice3D<T,Descriptor>&>(*atomicBlocks[0]));
00504 }
00505 
00506 template<typename T, template<typename U> class Descriptor>
00507 void BoundedBoxProcessingFunctional3D_L<T,Descriptor>::processEdgeGeneric (
00508         int plane, int normal1, int normal2,
00509         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00510 {
00511     processEdge(plane,normal1,normal2, domain, dynamic_cast<BlockLattice3D<T,Descriptor>&>(*atomicBlocks[0]));
00512 }
00513 
00514 template<typename T, template<typename U> class Descriptor>
00515 void BoundedBoxProcessingFunctional3D_L<T,Descriptor>::processCornerGeneric (
00516         int normalX, int normalY, int normalZ,
00517         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00518 {
00519     processCorner(normalX, normalY, normalZ, domain, dynamic_cast<BlockLattice3D<T,Descriptor>&>(*atomicBlocks[0]));
00520 }
00521 
00522 /* *************** BoundedBoxProcessing3D_S ******************************************* */
00523 
00524 template<typename T>
00525 void BoundedBoxProcessingFunctional3D_S<T>::processBulkGeneric (
00526         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00527 {
00528     processBulk(domain, dynamic_cast<ScalarField3D<T>&>(*atomicBlocks[0]));
00529 }
00530 
00531 template<typename T>
00532 void BoundedBoxProcessingFunctional3D_S<T>::processPlaneGeneric (
00533         int direction, int orientation,
00534         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00535 {
00536     processPlane(direction, orientation, domain, dynamic_cast<ScalarField3D<T>&>(*atomicBlocks[0]));
00537 }
00538 
00539 template<typename T>
00540 void BoundedBoxProcessingFunctional3D_S<T>::processEdgeGeneric (
00541         int plane, int normal1, int normal2,
00542         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00543 {
00544     processEdge(plane,normal1,normal2, domain, dynamic_cast<ScalarField3D<T>&>(*atomicBlocks[0]));
00545 }
00546 
00547 template<typename T>
00548 void BoundedBoxProcessingFunctional3D_S<T>::processCornerGeneric (
00549         int normalX, int normalY, int normalZ,
00550         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00551 {
00552     processCorner(normalX, normalY, normalZ, domain, dynamic_cast<ScalarField3D<T>&>(*atomicBlocks[0]));
00553 }
00554 
00555 /* *************** BoundedBoxProcessing3D_T ******************************************* */
00556 
00557 template<typename T, int nDim>
00558 void BoundedBoxProcessingFunctional3D_T<T,nDim>::processBulkGeneric (
00559         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00560 {
00561     processBulk(domain, dynamic_cast<TensorField3D<T,nDim>&>(*atomicBlocks[0]));
00562 }
00563 
00564 template<typename T, int nDim>
00565 void BoundedBoxProcessingFunctional3D_T<T,nDim>::processPlaneGeneric (
00566         int direction, int orientation,
00567         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00568 {
00569     processPlane(direction, orientation, domain, dynamic_cast<TensorField3D<T,nDim>&>(*atomicBlocks[0]));
00570 }
00571 
00572 template<typename T, int nDim>
00573 void BoundedBoxProcessingFunctional3D_T<T,nDim>::processEdgeGeneric (
00574         int plane, int normal1, int normal2,
00575         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00576 {
00577     processEdge(plane,normal1,normal2, domain, dynamic_cast<TensorField3D<T,nDim>&>(*atomicBlocks[0]));
00578 }
00579 
00580 template<typename T, int nDim>
00581 void BoundedBoxProcessingFunctional3D_T<T,nDim>::processCornerGeneric (
00582         int normalX, int normalY, int normalZ,
00583         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00584 {
00585     processCorner(normalX, normalY, normalZ, domain, dynamic_cast<TensorField3D<T,nDim>&>(*atomicBlocks[0]));
00586 }
00587 
00588 
00589 /* *************** BoundedBoxProcessing3D_N ******************************************* */
00590 
00591 template<typename T>
00592 void BoundedBoxProcessingFunctional3D_N<T>::processBulkGeneric (
00593         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00594 {
00595     processBulk(domain, dynamic_cast<NTensorField3D<T>&>(*atomicBlocks[0]));
00596 }
00597 
00598 template<typename T>
00599 void BoundedBoxProcessingFunctional3D_N<T>::processPlaneGeneric (
00600         int direction, int orientation,
00601         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00602 {
00603     processPlane(direction, orientation, domain, dynamic_cast<NTensorField3D<T>&>(*atomicBlocks[0]));
00604 }
00605 
00606 template<typename T>
00607 void BoundedBoxProcessingFunctional3D_N<T>::processEdgeGeneric (
00608         int plane, int normal1, int normal2,
00609         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00610 {
00611     processEdge(plane,normal1,normal2, domain, dynamic_cast<NTensorField3D<T>&>(*atomicBlocks[0]));
00612 }
00613 
00614 template<typename T>
00615 void BoundedBoxProcessingFunctional3D_N<T>::processCornerGeneric (
00616         int normalX, int normalY, int normalZ,
00617         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00618 {
00619     processCorner(normalX, normalY, normalZ, domain, dynamic_cast<NTensorField3D<T>&>(*atomicBlocks[0]));
00620 }
00621 
00622 
00623 /* *************** BoundedMaskedBoxProcessing3D_N ******************************************* */
00624 
00625 template<typename T>
00626 void BoundedMaskedBoxProcessingFunctional3D_N<T>::processBulkGeneric (
00627         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00628 {
00629     processBulk(domain,
00630                 dynamic_cast<NTensorField3D<T>&>(*atomicBlocks[0]),
00631                 dynamic_cast<NTensorField3D<int>&>(*atomicBlocks[1]));
00632 }
00633 
00634 template<typename T>
00635 void BoundedMaskedBoxProcessingFunctional3D_N<T>::processPlaneGeneric (
00636         int direction, int orientation,
00637         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00638 {
00639     processPlane(direction, orientation, domain,
00640                  dynamic_cast<NTensorField3D<T>&>(*atomicBlocks[0]),
00641                  dynamic_cast<NTensorField3D<int>&>(*atomicBlocks[1]));
00642 }
00643 
00644 template<typename T>
00645 void BoundedMaskedBoxProcessingFunctional3D_N<T>::processEdgeGeneric (
00646         int plane, int normal1, int normal2,
00647         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00648 {
00649     processEdge(plane,normal1,normal2, domain,
00650                 dynamic_cast<NTensorField3D<T>&>(*atomicBlocks[0]),
00651                 dynamic_cast<NTensorField3D<int>&>(*atomicBlocks[1]));
00652 }
00653 
00654 template<typename T>
00655 void BoundedMaskedBoxProcessingFunctional3D_N<T>::processCornerGeneric (
00656         int normalX, int normalY, int normalZ,
00657         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00658 {
00659     processCorner(normalX, normalY, normalZ, domain,
00660                   dynamic_cast<NTensorField3D<T>&>(*atomicBlocks[0]),
00661                   dynamic_cast<NTensorField3D<int>&>(*atomicBlocks[1]));
00662 }
00663 
00664 
00665 /* *************** BoundedBoxProcessing3D_LL ****************************************** */
00666 
00667 template<typename T1, template<typename U1> class Descriptor1,
00668          typename T2, template<typename U2> class Descriptor2>
00669 void BoundedBoxProcessingFunctional3D_LL<T1,Descriptor1,T2,Descriptor2>::processBulkGeneric (
00670         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00671 {
00672     PLB_PRECONDITION( atomicBlocks.size() == 2 );
00673     processBulk( domain,
00674                  dynamic_cast<BlockLattice3D<T1,Descriptor1>&>(*atomicBlocks[0]),
00675                  dynamic_cast<BlockLattice3D<T2,Descriptor2>&>(*atomicBlocks[1]) );
00676 }
00677 
00678 template<typename T1, template<typename U1> class Descriptor1,
00679          typename T2, template<typename U2> class Descriptor2>
00680 void BoundedBoxProcessingFunctional3D_LL<T1,Descriptor1,T2,Descriptor2>::processPlaneGeneric (
00681         int direction, int orientation,
00682         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00683 {
00684     PLB_PRECONDITION( atomicBlocks.size() == 2 );
00685     processPlane( direction, orientation, domain,
00686                  dynamic_cast<BlockLattice3D<T1,Descriptor1>&>(*atomicBlocks[0]),
00687                  dynamic_cast<BlockLattice3D<T2,Descriptor2>&>(*atomicBlocks[1]) );
00688 }
00689 
00690 template<typename T1, template<typename U1> class Descriptor1,
00691          typename T2, template<typename U2> class Descriptor2>
00692 void BoundedBoxProcessingFunctional3D_LL<T1,Descriptor1,T2,Descriptor2>::processEdgeGeneric (
00693         int plane, int normal1, int normal2,
00694         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00695 {
00696     PLB_PRECONDITION( atomicBlocks.size() == 2 );
00697     processEdge( plane,normal1,normal2, domain,
00698                  dynamic_cast<BlockLattice3D<T1,Descriptor1>&>(*atomicBlocks[0]),
00699                  dynamic_cast<BlockLattice3D<T2,Descriptor2>&>(*atomicBlocks[1]) );
00700 }
00701 
00702 template<typename T1, template<typename U1> class Descriptor1,
00703          typename T2, template<typename U2> class Descriptor2>
00704 void BoundedBoxProcessingFunctional3D_LL<T1,Descriptor1,T2,Descriptor2>::processCornerGeneric (
00705         int normalX, int normalY, int normalZ,
00706         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00707 {
00708     PLB_PRECONDITION( atomicBlocks.size() == 2 );
00709     processCorner( normalX, normalY, normalZ, domain,
00710                    dynamic_cast<BlockLattice3D<T1,Descriptor1>&>(*atomicBlocks[0]),
00711                    dynamic_cast<BlockLattice3D<T2,Descriptor2>&>(*atomicBlocks[1]) );
00712 }
00713 
00714 /* *************** BoundedBoxProcessing3D_SS ****************************************** */
00715 
00716 template<typename T1, typename T2>
00717 void BoundedBoxProcessingFunctional3D_SS<T1,T2>::processBulkGeneric (
00718         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00719 {
00720     processBulk( domain,
00721                  dynamic_cast<ScalarField3D<T1>&>(*atomicBlocks[0]),
00722                  dynamic_cast<ScalarField3D<T2>&>(*atomicBlocks[1]) );
00723 }
00724 
00725 template<typename T1, typename T2>
00726 void BoundedBoxProcessingFunctional3D_SS<T1,T2>::processPlaneGeneric (
00727         int direction, int orientation,
00728         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00729 {
00730     processPlane( direction, orientation, domain,
00731                  dynamic_cast<ScalarField3D<T1>&>(*atomicBlocks[0]),
00732                  dynamic_cast<ScalarField3D<T2>&>(*atomicBlocks[1]) );
00733 }
00734 
00735 template<typename T1, typename T2>
00736 void BoundedBoxProcessingFunctional3D_SS<T1,T2>::processEdgeGeneric (
00737         int plane, int normal1, int normal2,
00738         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00739 {
00740     processEdge( plane,normal1,normal2, domain,
00741                  dynamic_cast<ScalarField3D<T1>&>(*atomicBlocks[0]),
00742                  dynamic_cast<ScalarField3D<T2>&>(*atomicBlocks[1]) );
00743 }
00744 
00745 template<typename T1, typename T2>
00746 void BoundedBoxProcessingFunctional3D_SS<T1,T2>::processCornerGeneric (
00747         int normalX, int normalY, int normalZ,
00748         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00749 {
00750     processCorner( normalX, normalY, normalZ, domain,
00751                    dynamic_cast<ScalarField3D<T1>&>(*atomicBlocks[0]),
00752                    dynamic_cast<ScalarField3D<T2>&>(*atomicBlocks[1]) );
00753 }
00754 
00755 /* *************** BoundedBoxProcessing3D_TT ****************************************** */
00756 
00757 template<typename T1, int nDim1, typename T2, int nDim2>
00758 void BoundedBoxProcessingFunctional3D_TT<T1,nDim1,T2,nDim2>::processBulkGeneric (
00759         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00760 {
00761     processBulk( domain,
00762                  dynamic_cast<TensorField3D<T1,nDim1>&>(*atomicBlocks[0]),
00763                  dynamic_cast<TensorField3D<T2,nDim2>&>(*atomicBlocks[1]) );
00764 }
00765 
00766 template<typename T1, int nDim1, typename T2, int nDim2>
00767 void BoundedBoxProcessingFunctional3D_TT<T1,nDim1,T2,nDim2>::processPlaneGeneric (
00768         int direction, int orientation,
00769         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00770 {
00771     processPlane( direction, orientation, domain,
00772                  dynamic_cast<TensorField3D<T1,nDim1>&>(*atomicBlocks[0]),
00773                  dynamic_cast<TensorField3D<T2,nDim2>&>(*atomicBlocks[1]) );
00774 }
00775 
00776 template<typename T1, int nDim1, typename T2, int nDim2>
00777 void BoundedBoxProcessingFunctional3D_TT<T1,nDim1,T2,nDim2>::processEdgeGeneric (
00778         int plane, int normal1, int normal2,
00779         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00780 {
00781     processEdge( plane,normal1,normal2, domain,
00782                  dynamic_cast<TensorField3D<T1,nDim1>&>(*atomicBlocks[0]),
00783                  dynamic_cast<TensorField3D<T2,nDim2>&>(*atomicBlocks[1]) );
00784 }
00785 
00786 template<typename T1, int nDim1, typename T2, int nDim2>
00787 void BoundedBoxProcessingFunctional3D_TT<T1,nDim1,T2,nDim2>::processCornerGeneric (
00788         int normalX, int normalY, int normalZ,
00789         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00790 {
00791     processCorner( normalX, normalY, normalZ, domain,
00792                    dynamic_cast<TensorField3D<T1,nDim1>&>(*atomicBlocks[0]),
00793                    dynamic_cast<TensorField3D<T2,nDim2>&>(*atomicBlocks[1]) );
00794 }
00795 
00796 /* *************** BoundedBoxProcessing3D_NN ****************************************** */
00797 
00798 template<typename T1, typename T2>
00799 void BoundedBoxProcessingFunctional3D_NN<T1,T2>::processBulkGeneric (
00800         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00801 {
00802     processBulk( domain,
00803                  dynamic_cast<NTensorField3D<T1>&>(*atomicBlocks[0]),
00804                  dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]) );
00805 }
00806 
00807 template<typename T1, typename T2>
00808 void BoundedBoxProcessingFunctional3D_NN<T1,T2>::processPlaneGeneric (
00809         int direction, int orientation,
00810         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00811 {
00812     processPlane( direction, orientation, domain,
00813                  dynamic_cast<NTensorField3D<T1>&>(*atomicBlocks[0]),
00814                  dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]) );
00815 }
00816 
00817 template<typename T1, typename T2>
00818 void BoundedBoxProcessingFunctional3D_NN<T1,T2>::processEdgeGeneric (
00819         int plane, int normal1, int normal2,
00820         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00821 {
00822     processEdge( plane,normal1,normal2, domain,
00823                  dynamic_cast<NTensorField3D<T1>&>(*atomicBlocks[0]),
00824                  dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]) );
00825 }
00826 
00827 template<typename T1, typename T2>
00828 void BoundedBoxProcessingFunctional3D_NN<T1,T2>::processCornerGeneric (
00829         int normalX, int normalY, int normalZ,
00830         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00831 {
00832     processCorner( normalX, normalY, normalZ, domain,
00833                    dynamic_cast<NTensorField3D<T1>&>(*atomicBlocks[0]),
00834                    dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]) );
00835 }
00836 
00837 
00838 /* *************** BoundedMaskedBoxProcessing3D_NN ****************************************** */
00839 
00840 template<typename T1, typename T2>
00841 void BoundedMaskedBoxProcessingFunctional3D_NN<T1,T2>::processBulkGeneric (
00842         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00843 {
00844     processBulk( domain,
00845                  dynamic_cast<NTensorField3D<T1>&>(*atomicBlocks[0]),
00846                  dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]),
00847                  dynamic_cast<NTensorField3D<int>&>(*atomicBlocks[2]) );
00848 }
00849 
00850 template<typename T1, typename T2>
00851 void BoundedMaskedBoxProcessingFunctional3D_NN<T1,T2>::processPlaneGeneric (
00852         int direction, int orientation,
00853         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00854 {
00855     processPlane( direction, orientation, domain,
00856                  dynamic_cast<NTensorField3D<T1>&>(*atomicBlocks[0]),
00857                  dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]),
00858                  dynamic_cast<NTensorField3D<int>&>(*atomicBlocks[2]) );
00859 }
00860 
00861 template<typename T1, typename T2>
00862 void BoundedMaskedBoxProcessingFunctional3D_NN<T1,T2>::processEdgeGeneric (
00863         int plane, int normal1, int normal2,
00864         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00865 {
00866     processEdge( plane,normal1,normal2, domain,
00867                  dynamic_cast<NTensorField3D<T1>&>(*atomicBlocks[0]),
00868                  dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]),
00869                  dynamic_cast<NTensorField3D<int>&>(*atomicBlocks[2]) );
00870 }
00871 
00872 template<typename T1, typename T2>
00873 void BoundedMaskedBoxProcessingFunctional3D_NN<T1,T2>::processCornerGeneric (
00874         int normalX, int normalY, int normalZ,
00875         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00876 {
00877     processCorner( normalX, normalY, normalZ, domain,
00878                    dynamic_cast<NTensorField3D<T1>&>(*atomicBlocks[0]),
00879                    dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]),
00880                    dynamic_cast<NTensorField3D<int>&>(*atomicBlocks[2]) );
00881 }
00882 
00883 /* *************** BoundedBoxProcessing3D_ST ****************************************** */
00884 
00885 template<typename T1, typename T2, int nDim>
00886 void BoundedBoxProcessingFunctional3D_ST<T1,T2,nDim>::processBulkGeneric (
00887         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00888 {
00889     processBulk( domain,
00890                  dynamic_cast<ScalarField3D<T1>&>(*atomicBlocks[0]),
00891                  dynamic_cast<TensorField3D<T2,nDim>&>(*atomicBlocks[1]) );
00892 }
00893 
00894 template<typename T1, typename T2, int nDim>
00895 void BoundedBoxProcessingFunctional3D_ST<T1,T2,nDim>::processPlaneGeneric (
00896         int direction, int orientation,
00897         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00898 {
00899     processPlane( direction, orientation, domain,
00900                  dynamic_cast<ScalarField3D<T1>&>(*atomicBlocks[0]),
00901                  dynamic_cast<TensorField3D<T2,nDim>&>(*atomicBlocks[1]) );
00902 }
00903 
00904 template<typename T1, typename T2, int nDim>
00905 void BoundedBoxProcessingFunctional3D_ST<T1,T2,nDim>::processEdgeGeneric (
00906         int plane, int normal1, int normal2,
00907         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00908 {
00909     processEdge( plane,normal1,normal2, domain,
00910                  dynamic_cast<ScalarField3D<T1>&>(*atomicBlocks[0]),
00911                  dynamic_cast<TensorField3D<T2,nDim>&>(*atomicBlocks[1]) );
00912 }
00913 
00914 template<typename T1, typename T2, int nDim>
00915 void BoundedBoxProcessingFunctional3D_ST<T1,T2,nDim>::processCornerGeneric (
00916         int normalX, int normalY, int normalZ,
00917         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00918 {
00919     processCorner( normalX, normalY, normalZ, domain,
00920                    dynamic_cast<ScalarField3D<T1>&>(*atomicBlocks[0]),
00921                    dynamic_cast<TensorField3D<T2,nDim>&>(*atomicBlocks[1]) );
00922 }
00923 
00924 /* *************** BoundedBoxProcessing3D_SN ****************************************** */
00925 
00926 template<typename T1, typename T2>
00927 void BoundedBoxProcessingFunctional3D_SN<T1,T2>::processBulkGeneric (
00928         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00929 {
00930     processBulk( domain,
00931                  dynamic_cast<ScalarField3D<T1>&>(*atomicBlocks[0]),
00932                  dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]) );
00933 }
00934 
00935 template<typename T1, typename T2>
00936 void BoundedBoxProcessingFunctional3D_SN<T1,T2>::processPlaneGeneric (
00937         int direction, int orientation,
00938         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00939 {
00940     processPlane( direction, orientation, domain,
00941                  dynamic_cast<ScalarField3D<T1>&>(*atomicBlocks[0]),
00942                  dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]) );
00943 }
00944 
00945 template<typename T1, typename T2>
00946 void BoundedBoxProcessingFunctional3D_SN<T1,T2>::processEdgeGeneric (
00947         int plane, int normal1, int normal2,
00948         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00949 {
00950     processEdge( plane,normal1,normal2, domain,
00951                  dynamic_cast<ScalarField3D<T1>&>(*atomicBlocks[0]),
00952                  dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]) );
00953 }
00954 
00955 template<typename T1, typename T2>
00956 void BoundedBoxProcessingFunctional3D_SN<T1,T2>::processCornerGeneric (
00957         int normalX, int normalY, int normalZ,
00958         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00959 {
00960     processCorner( normalX, normalY, normalZ, domain,
00961                    dynamic_cast<ScalarField3D<T1>&>(*atomicBlocks[0]),
00962                    dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]) );
00963 }
00964 
00965 /* *************** BoundedBoxProcessing3D_LS ****************************************** */
00966 
00967 template<typename T1, template<typename U> class Descriptor, typename T2>
00968 void BoundedBoxProcessingFunctional3D_LS<T1,Descriptor,T2>::processBulkGeneric (
00969         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00970 {
00971     processBulk( domain,
00972                  dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
00973                  dynamic_cast<ScalarField3D<T2>&>(*atomicBlocks[1]) );
00974 }
00975 
00976 template<typename T1, template<typename U> class Descriptor, typename T2>
00977 void BoundedBoxProcessingFunctional3D_LS<T1,Descriptor,T2>::processPlaneGeneric (
00978         int direction, int orientation,
00979         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00980 {
00981     processPlane( direction, orientation, domain,
00982                  dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
00983                  dynamic_cast<ScalarField3D<T2>&>(*atomicBlocks[1]) );
00984 }
00985 
00986 template<typename T1, template<typename U> class Descriptor, typename T2>
00987 void BoundedBoxProcessingFunctional3D_LS<T1,Descriptor,T2>::processEdgeGeneric (
00988         int plane, int normal1, int normal2,
00989         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
00990 {
00991     processEdge( plane,normal1,normal2, domain,
00992                  dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
00993                  dynamic_cast<ScalarField3D<T2>&>(*atomicBlocks[1]) );
00994 }
00995 
00996 template<typename T1, template<typename U> class Descriptor, typename T2>
00997 void BoundedBoxProcessingFunctional3D_LS<T1,Descriptor,T2>::processCornerGeneric (
00998         int normalX, int normalY, int normalZ,
00999         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01000 {
01001     processCorner( normalX, normalY, normalZ, domain,
01002                    dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
01003                    dynamic_cast<ScalarField3D<T2>&>(*atomicBlocks[1]) );
01004 }
01005 
01006 /* *************** BoundedBoxProcessing3D_LT ****************************************** */
01007 
01008 template<typename T1, template<typename U> class Descriptor, typename T2, int nDim>
01009 void BoundedBoxProcessingFunctional3D_LT<T1,Descriptor,T2,nDim>::processBulkGeneric (
01010         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01011 {
01012     processBulk( domain,
01013                  dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
01014                  dynamic_cast<TensorField3D<T2,nDim>&>(*atomicBlocks[1]) );
01015 }
01016 
01017 template<typename T1, template<typename U> class Descriptor, typename T2, int nDim>
01018 void BoundedBoxProcessingFunctional3D_LT<T1,Descriptor,T2,nDim>::processPlaneGeneric (
01019         int direction, int orientation,
01020         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01021 {
01022     processPlane( direction, orientation, domain,
01023                  dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
01024                  dynamic_cast<TensorField3D<T2,nDim>&>(*atomicBlocks[1]) );
01025 }
01026 
01027 template<typename T1, template<typename U> class Descriptor, typename T2, int nDim>
01028 void BoundedBoxProcessingFunctional3D_LT<T1,Descriptor,T2,nDim>::processEdgeGeneric (
01029         int plane, int normal1, int normal2,
01030         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01031 {
01032     processEdge( plane,normal1,normal2, domain,
01033                  dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
01034                  dynamic_cast<TensorField3D<T2,nDim>&>(*atomicBlocks[1]) );
01035 }
01036 
01037 template<typename T1, template<typename U> class Descriptor, typename T2, int nDim>
01038 void BoundedBoxProcessingFunctional3D_LT<T1,Descriptor,T2,nDim>::processCornerGeneric (
01039         int normalX, int normalY, int normalZ,
01040         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01041 {
01042     processCorner( normalX, normalY, normalZ, domain,
01043                    dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
01044                    dynamic_cast<TensorField3D<T2,nDim>&>(*atomicBlocks[1]) );
01045 }
01046 
01047 /* *************** BoundedBoxProcessing3D_LN ****************************************** */
01048 
01049 template<typename T1, template<typename U> class Descriptor, typename T2>
01050 void BoundedBoxProcessingFunctional3D_LN<T1,Descriptor,T2>::processBulkGeneric (
01051         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01052 {
01053     processBulk( domain,
01054                  dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
01055                  dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]) );
01056 }
01057 
01058 template<typename T1, template<typename U> class Descriptor, typename T2>
01059 void BoundedBoxProcessingFunctional3D_LN<T1,Descriptor,T2>::processPlaneGeneric (
01060         int direction, int orientation,
01061         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01062 {
01063     processPlane( direction, orientation, domain,
01064                  dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
01065                  dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]) );
01066 }
01067 
01068 template<typename T1, template<typename U> class Descriptor, typename T2>
01069 void BoundedBoxProcessingFunctional3D_LN<T1,Descriptor,T2>::processEdgeGeneric (
01070         int plane, int normal1, int normal2,
01071         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01072 {
01073     processEdge( plane,normal1,normal2, domain,
01074                  dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
01075                  dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]) );
01076 }
01077 
01078 template<typename T1, template<typename U> class Descriptor, typename T2>
01079 void BoundedBoxProcessingFunctional3D_LN<T1,Descriptor,T2>::processCornerGeneric (
01080         int normalX, int normalY, int normalZ,
01081         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01082 {
01083     processCorner( normalX, normalY, normalZ, domain,
01084                    dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
01085                    dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]) );
01086 }
01087 
01088 /* *************** BoundedMaskedBoxProcessing3D_LN ****************************************** */
01089 
01090 template<typename T1, template<typename U> class Descriptor, typename T2>
01091 void BoundedMaskedBoxProcessingFunctional3D_LN<T1,Descriptor,T2>::processBulkGeneric (
01092         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01093 {
01094     processBulk( domain,
01095                  dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
01096                  dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]),
01097                  dynamic_cast<NTensorField3D<int>&>(*atomicBlocks[2]) );
01098 }
01099 
01100 template<typename T1, template<typename U> class Descriptor, typename T2>
01101 void BoundedMaskedBoxProcessingFunctional3D_LN<T1,Descriptor,T2>::processPlaneGeneric (
01102         int direction, int orientation,
01103         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01104 {
01105     processPlane( direction, orientation, domain,
01106                   dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
01107                   dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]),
01108                   dynamic_cast<NTensorField3D<int>&>(*atomicBlocks[2]) );
01109 }
01110 
01111 template<typename T1, template<typename U> class Descriptor, typename T2>
01112 void BoundedMaskedBoxProcessingFunctional3D_LN<T1,Descriptor,T2>::processEdgeGeneric (
01113         int plane, int normal1, int normal2,
01114         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01115 {
01116     processEdge( plane,normal1,normal2, domain,
01117                  dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
01118                  dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]),
01119                  dynamic_cast<NTensorField3D<int>&>(*atomicBlocks[2]) );
01120 }
01121 
01122 template<typename T1, template<typename U> class Descriptor, typename T2>
01123 void BoundedMaskedBoxProcessingFunctional3D_LN<T1,Descriptor,T2>::processCornerGeneric (
01124         int normalX, int normalY, int normalZ,
01125         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01126 {
01127     processCorner( normalX, normalY, normalZ, domain,
01128                    dynamic_cast<BlockLattice3D<T1,Descriptor>&>(*atomicBlocks[0]),
01129                    dynamic_cast<NTensorField3D<T2>&>(*atomicBlocks[1]),
01130                    dynamic_cast<NTensorField3D<int>&>(*atomicBlocks[2]) );
01131 }
01132 
01133 /* *************** BoundedLatticeBoxProcessing3D ******************************************* */
01134 
01135 template<typename T, template<typename U> class Descriptor>
01136 void BoundedLatticeBoxProcessingFunctional3D<T,Descriptor>::processBulkGeneric (
01137         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01138 {
01139     std::vector<BlockLattice3D<T,Descriptor>*> lattices(atomicBlocks.size());
01140     for (pluint iLattice=0; iLattice<atomicBlocks.size(); ++iLattice) {
01141         lattices[iLattice] = dynamic_cast<BlockLattice3D<T,Descriptor>*>(atomicBlocks[iLattice]);
01142     }
01143     processBulk(domain, lattices);
01144 }
01145 
01146 template<typename T, template<typename U> class Descriptor>
01147 void BoundedLatticeBoxProcessingFunctional3D<T,Descriptor>::processPlaneGeneric (
01148         int direction, int orientation,
01149         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01150 {
01151     std::vector<BlockLattice3D<T,Descriptor>*> lattices(atomicBlocks.size());
01152     for (pluint iLattice=0; iLattice<atomicBlocks.size(); ++iLattice) {
01153         lattices[iLattice] = dynamic_cast<BlockLattice3D<T,Descriptor>*>(atomicBlocks[iLattice]);
01154     }
01155     processPlane(direction, orientation, domain, lattices);
01156 }
01157 
01158 template<typename T, template<typename U> class Descriptor>
01159 void BoundedLatticeBoxProcessingFunctional3D<T,Descriptor>::processEdgeGeneric (
01160         int plane, int normal1, int normal2,
01161         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01162 {
01163     std::vector<BlockLattice3D<T,Descriptor>*> lattices(atomicBlocks.size());
01164     for (pluint iLattice=0; iLattice<atomicBlocks.size(); ++iLattice) {
01165         lattices[iLattice] = dynamic_cast<BlockLattice3D<T,Descriptor>*>(atomicBlocks[iLattice]);
01166     }
01167     processEdge(plane,normal1,normal2, domain, lattices);
01168 }
01169 
01170 template<typename T, template<typename U> class Descriptor>
01171 void BoundedLatticeBoxProcessingFunctional3D<T,Descriptor>::processCornerGeneric (
01172         int normalX, int normalY, int normalZ,
01173         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01174 {
01175     std::vector<BlockLattice3D<T,Descriptor>*> lattices(atomicBlocks.size());
01176     for (pluint iLattice=0; iLattice<atomicBlocks.size(); ++iLattice) {
01177         lattices[iLattice] = dynamic_cast<BlockLattice3D<T,Descriptor>*>(atomicBlocks[iLattice]);
01178     }
01179     processCorner(normalX, normalY, normalZ, domain, lattices);
01180 }
01181 
01182 /* *************** BoundedScalarFieldBoxProcessing3D ******************************************* */
01183 
01184 template<typename T>
01185 void BoundedScalarFieldBoxProcessingFunctional3D<T>::processBulkGeneric (
01186         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01187 {
01188     std::vector<ScalarField3D<T>*> fields(atomicBlocks.size());
01189     for (pluint iField=0; iField<atomicBlocks.size(); ++iField) {
01190         fields[iField] = dynamic_cast<ScalarField3D<T>*>(atomicBlocks[iField]);
01191     }
01192     processBulk(domain, fields);
01193 }
01194 
01195 template<typename T>
01196 void BoundedScalarFieldBoxProcessingFunctional3D<T>::processPlaneGeneric (
01197         int direction, int orientation,
01198         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01199 {
01200     std::vector<ScalarField3D<T>*> fields(atomicBlocks.size());
01201     for (pluint iField=0; iField<atomicBlocks.size(); ++iField) {
01202         fields[iField] = dynamic_cast<ScalarField3D<T>*>(atomicBlocks[iField]);
01203     }
01204     processPlane(direction, orientation, domain, fields);
01205 }
01206 
01207 template<typename T>
01208 void BoundedScalarFieldBoxProcessingFunctional3D<T>::processEdgeGeneric (
01209         int plane, int normal1, int normal2,
01210         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01211 {
01212     std::vector<ScalarField3D<T>*> fields(atomicBlocks.size());
01213     for (pluint iField=0; iField<atomicBlocks.size(); ++iField) {
01214         fields[iField] = dynamic_cast<ScalarField3D<T>*>(atomicBlocks[iField]);
01215     }
01216     processEdge(plane,normal1,normal2, domain, fields);
01217 }
01218 
01219 template<typename T>
01220 void BoundedScalarFieldBoxProcessingFunctional3D<T>::processCornerGeneric (
01221         int normalX, int normalY, int normalZ,
01222         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01223 {
01224     std::vector<ScalarField3D<T>*> fields(atomicBlocks.size());
01225     for (pluint iField=0; iField<atomicBlocks.size(); ++iField) {
01226         fields[iField] = dynamic_cast<ScalarField3D<T>*>(atomicBlocks[iField]);
01227     }
01228     processCorner(normalX, normalY, normalZ, domain, fields);
01229 }
01230 
01231 
01232 /* *************** BoundedTensorFieldBoxProcessing3D ******************************************* */
01233 
01234 template<typename T, int nDim>
01235 void BoundedTensorFieldBoxProcessingFunctional3D<T,nDim>::processBulkGeneric (
01236         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01237 {
01238     std::vector<TensorField3D<T,nDim>*> fields(atomicBlocks.size());
01239     for (pluint iField=0; iField<atomicBlocks.size(); ++iField) {
01240         fields[iField] = dynamic_cast<TensorField3D<T,nDim>*>(atomicBlocks[iField]);
01241     }
01242     processBulk(domain, fields);
01243 }
01244 
01245 template<typename T, int nDim>
01246 void BoundedTensorFieldBoxProcessingFunctional3D<T,nDim>::processPlaneGeneric (
01247         int direction, int orientation,
01248         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01249 {
01250     std::vector<TensorField3D<T,nDim>*> fields(atomicBlocks.size());
01251     for (pluint iField=0; iField<atomicBlocks.size(); ++iField) {
01252         fields[iField] = dynamic_cast<TensorField3D<T,nDim>*>(atomicBlocks[iField]);
01253     }
01254     processPlane(direction, orientation, domain, fields);
01255 }
01256 
01257 template<typename T, int nDim>
01258 void BoundedTensorFieldBoxProcessingFunctional3D<T,nDim>::processEdgeGeneric (
01259         int plane, int normal1, int normal2,
01260         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01261 {
01262     std::vector<TensorField3D<T,nDim>*> fields(atomicBlocks.size());
01263     for (pluint iField=0; iField<atomicBlocks.size(); ++iField) {
01264         fields[iField] = dynamic_cast<TensorField3D<T,nDim>*>(atomicBlocks[iField]);
01265     }
01266     processEdge(plane,normal1,normal2, domain, fields);
01267 }
01268 
01269 template<typename T, int nDim>
01270 void BoundedTensorFieldBoxProcessingFunctional3D<T,nDim>::processCornerGeneric (
01271         int normalX, int normalY, int normalZ,
01272         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01273 {
01274     std::vector<TensorField3D<T,nDim>*> fields(atomicBlocks.size());
01275     for (pluint iField=0; iField<atomicBlocks.size(); ++iField) {
01276         fields[iField] = dynamic_cast<TensorField3D<T,nDim>*>(atomicBlocks[iField]);
01277     }
01278     processCorner(normalX, normalY, normalZ, domain, fields);
01279 }
01280 
01281 /* *************** BoundedNTensorFieldBoxProcessing3D ******************************************* */
01282 
01283 template<typename T>
01284 void BoundedNTensorFieldBoxProcessingFunctional3D<T>::processBulkGeneric (
01285         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01286 {
01287     std::vector<NTensorField3D<T>*> fields(atomicBlocks.size());
01288     for (pluint iField=0; iField<atomicBlocks.size(); ++iField) {
01289         fields[iField] = dynamic_cast<NTensorField3D<T>*>(atomicBlocks[iField]);
01290     }
01291     processBulk(domain, fields);
01292 }
01293 
01294 template<typename T>
01295 void BoundedNTensorFieldBoxProcessingFunctional3D<T>::processPlaneGeneric (
01296         int direction, int orientation,
01297         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01298 {
01299     std::vector<NTensorField3D<T>*> fields(atomicBlocks.size());
01300     for (pluint iField=0; iField<atomicBlocks.size(); ++iField) {
01301         fields[iField] = dynamic_cast<NTensorField3D<T>*>(atomicBlocks[iField]);
01302     }
01303     processPlane(direction, orientation, domain, fields);
01304 }
01305 
01306 template<typename T>
01307 void BoundedNTensorFieldBoxProcessingFunctional3D<T>::processEdgeGeneric (
01308         int plane, int normal1, int normal2,
01309         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01310 {
01311     std::vector<NTensorField3D<T>*> fields(atomicBlocks.size());
01312     for (pluint iField=0; iField<atomicBlocks.size(); ++iField) {
01313         fields[iField] = dynamic_cast<NTensorField3D<T>*>(atomicBlocks[iField]);
01314     }
01315     processEdge(plane,normal1,normal2, domain, fields);
01316 }
01317 
01318 template<typename T>
01319 void BoundedNTensorFieldBoxProcessingFunctional3D<T>::processCornerGeneric (
01320         int normalX, int normalY, int normalZ,
01321         Box3D domain, std::vector<AtomicBlock3D*> atomicBlocks )
01322 {
01323     std::vector<NTensorField3D<T>*> fields(atomicBlocks.size());
01324     for (pluint iField=0; iField<atomicBlocks.size(); ++iField) {
01325         fields[iField] = dynamic_cast<NTensorField3D<T>*>(atomicBlocks[iField]);
01326     }
01327     processCorner(normalX, normalY, normalZ, domain, fields);
01328 }
01329 
01330 }  // namespace plb
01331 
01332 #endif  // DATA_PROCESSING_FUNCTIONAL_3D_HH