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

multiBlockGenerator3D.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 
00029 #ifndef MULTI_BLOCK_GENERATOR_3D_HH
00030 #define MULTI_BLOCK_GENERATOR_3D_HH
00031 
00032 #include "core/globalDefs.h"
00033 #include "multiBlock/sparseBlockStructure3D.h"
00034 #include "multiBlock/localMultiBlockInfo3D.h"
00035 #include "multiBlock/nonLocalTransfer3D.h"
00036 #include "multiBlock/defaultMultiBlockPolicy3D.h"
00037 #include "multiBlock/multiBlockOperations3D.h"
00038 #include "dataProcessors/dataAnalysisWrapper3D.h"
00039 #include "dataProcessors/ntensorAnalysisWrapper3D.h"
00040 
00041 namespace plb {
00042 
00043 inline void transferDataProcessors(MultiBlock3D const& from, MultiBlock3D& to)
00044 {
00045     std::vector<MultiBlock3D::ProcessorStorage3D>
00046         newProcessors(from.getStoredProcessors());
00047     // Redirect all references-to-self to the new self.
00048     id_t oldId = from.getId();
00049     id_t newId = to.getId();
00050     for (pluint iProcessor=0; iProcessor<newProcessors.size(); ++iProcessor) {
00051         newProcessors[iProcessor].replace(oldId, newId);
00052         DataProcessorGenerator3D* newGenerator = newProcessors[iProcessor].getGenerator().clone();
00053         if (newGenerator->extract(to.getBoundingBox())) {
00054             addInternalProcessor( *newGenerator,
00055                                   newProcessors[iProcessor].getMultiBlocks(),
00056                                   newProcessors[iProcessor].getLevel() );
00057         }
00058         delete newGenerator;
00059     }
00060 }
00061 
00062 /* *************** 1. MultiScalarField ************************************** */
00063 
00064 template<typename T>
00065 void transferScalarFieldLocal (
00066         MultiScalarField3D<T>& from, MultiScalarField3D<T>& to, Box3D const& domain )
00067 {
00068     // 1. Copy all data from the old to the new field.
00069     plb::copy(from, to, from.getBoundingBox());
00070     // 2. Reconstruct the data processors.
00071     transferDataProcessors(from, to);
00072 }
00073 
00074 template<typename T>
00075 void transferScalarFieldNonLocal (
00076         MultiScalarField3D<T> const& from, MultiScalarField3D<T>& to, Box3D const& domain )
00077 {
00078     // 1. Copy all data from the old to the new field. This includes dynamics
00079     //    objects which must be fully serialized and regenerated.
00080     copyNonLocal(from, to, domain);
00081     // 2. Reconstruct the data processors.
00082     transferDataProcessors(from, to);
00083 }
00084 
00085 template<typename T>
00086 std::auto_ptr<MultiScalarField3D<T> > generateMultiScalarField (
00087         Box3D boundingBox, plint envelopeWidth )
00088 {
00089     return std::auto_ptr<MultiScalarField3D<T> > (
00090         new MultiScalarField3D<T> (
00091             defaultMultiBlockPolicy3D().getMultiBlockManagement(boundingBox, envelopeWidth),
00092             defaultMultiBlockPolicy3D().getBlockCommunicator(),
00093             defaultMultiBlockPolicy3D().getCombinedStatistics(),
00094             defaultMultiBlockPolicy3D().getMultiScalarAccess<T>() )
00095     );
00096 }
00097 
00098 template<typename T>
00099 std::auto_ptr<MultiScalarField3D<T> > generateMultiScalarField (
00100         Box3D boundingBox, T iniVal, plint envelopeWidth )
00101 {
00102     return std::auto_ptr<MultiScalarField3D<T> > (
00103         new MultiScalarField3D<T> (
00104             defaultMultiBlockPolicy3D().getMultiBlockManagement(boundingBox, envelopeWidth),
00105             defaultMultiBlockPolicy3D().getBlockCommunicator(),
00106             defaultMultiBlockPolicy3D().getCombinedStatistics(),
00107             defaultMultiBlockPolicy3D().getMultiScalarAccess<T>(), iniVal )
00108     );
00109 }
00110 
00111 template<typename T>
00112 std::auto_ptr<MultiScalarField3D<T> > defaultGenerateMultiScalarField3D (
00113         MultiBlockManagement3D const& management, plint nDim )
00114 {
00115     return std::auto_ptr<MultiScalarField3D<T> > (
00116         new MultiScalarField3D<T> (
00117             management,
00118             defaultMultiBlockPolicy3D().getBlockCommunicator(),
00119             defaultMultiBlockPolicy3D().getCombinedStatistics(),
00120             defaultMultiBlockPolicy3D().getMultiScalarAccess<T>(), T() )
00121     );
00122 }
00123 
00124 template<typename T>
00125 std::auto_ptr<MultiScalarField3D<T> > clone (
00126         MultiScalarField3D<T>& originalField,
00127         Box3D const& subDomain, bool crop )
00128 {
00129     std::auto_ptr<MultiScalarField3D<T> > clonedField (
00130             generateMultiScalarField<T>(originalField, subDomain, crop) );
00131 
00132     transferScalarFieldLocal( originalField, *clonedField,
00133                               originalField.getBoundingBox() );
00134 
00135     return clonedField;
00136 }
00137 
00138 template<typename T>
00139 std::auto_ptr<MultiScalarField3D<T> > generateMultiScalarField (
00140         MultiBlock3D const& originalField, Box3D const& intersection,
00141         bool crop )
00142 {
00143     return std::auto_ptr<MultiScalarField3D<T> > (
00144         new MultiScalarField3D<T> (
00145             intersect(originalField.getMultiBlockManagement(), intersection, crop),
00146             originalField.getBlockCommunicator().clone(),
00147             originalField.getCombinedStatistics().clone(),
00148             defaultMultiBlockPolicy3D().getMultiScalarAccess<T>() )
00149     );
00150 }
00151 
00152 template<typename T>
00153 std::auto_ptr<MultiScalarField3D<T> > generateIntersectMultiScalarField (
00154         MultiBlock3D const& originalField1,
00155         MultiBlock3D const& originalField2, bool crop )
00156 {
00157     return std::auto_ptr<MultiScalarField3D<T> > (
00158         new MultiScalarField3D<T> (
00159             intersect(originalField1.getMultiBlockManagement(),
00160                       originalField2.getMultiBlockManagement(), crop),
00161             originalField1.getBlockCommunicator().clone(),
00162             originalField1.getCombinedStatistics().clone(),
00163             defaultMultiBlockPolicy3D().getMultiScalarAccess<T>() )
00164     );
00165 }
00166 
00167 template<typename T>
00168 std::auto_ptr<MultiScalarField3D<T> > generateIntersectMultiScalarField (
00169         MultiBlock3D const& originalField1,
00170         MultiBlock3D const& originalField2,
00171         Box3D const& intersection, bool crop )
00172 {
00173     MultiBlockManagement3D intersectedBlocks (
00174             intersect ( originalField1.getMultiBlockManagement(),
00175                         originalField2.getMultiBlockManagement(), crop ) );
00176     MultiBlockManagement3D intersectWithDomain (
00177             intersect( intersectedBlocks, intersection, crop ) );
00178     return std::auto_ptr<MultiScalarField3D<T> > (
00179         new MultiScalarField3D<T> (
00180             intersectWithDomain,
00181             originalField1.getBlockCommunicator().clone(),
00182             originalField1.getCombinedStatistics().clone(),
00183             defaultMultiBlockPolicy3D().getMultiScalarAccess<T>() )
00184     );
00185 }
00186 
00187 template<typename T>
00188 std::auto_ptr<MultiScalarField3D<T> > generateJoinMultiScalarField (
00189         MultiBlock3D const& originalField1,
00190         MultiBlock3D const& originalField2 )
00191 {
00192     return std::auto_ptr<MultiScalarField3D<T> > (
00193         new MultiScalarField3D<T> (
00194             block_union (
00195                 originalField1.getMultiBlockManagement(),
00196                 originalField2.getMultiBlockManagement() ),
00197             originalField1.getBlockCommunicator().clone(),
00198             originalField1.getCombinedStatistics().clone(),
00199             defaultMultiBlockPolicy3D().getMultiScalarAccess<T>() )
00200     );
00201 }
00202 
00203 template<typename T>
00204 std::auto_ptr<MultiScalarField3D<T> > extend (
00205         MultiScalarField3D<T>& originalBlock, Box3D const& addedBlock )
00206 {
00207     std::auto_ptr<MultiScalarField3D<T> > newBlock (
00208         new MultiScalarField3D<T> (
00209             extend( originalBlock.getMultiBlockManagement(), addedBlock, addedBlock ),
00210             originalBlock.getBlockCommunicator().clone(),
00211             originalBlock.getCombinedStatistics().clone(),
00212             defaultMultiBlockPolicy3D().getMultiScalarAccess<T>() )
00213     );
00214 
00215     transferScalarFieldLocal( originalBlock, *newBlock,
00216                               originalBlock.getBoundingBox() );
00217 
00218     return newBlock;
00219 }
00220 
00221 template<typename T>
00222 std::auto_ptr<MultiScalarField3D<T> > except (
00223         MultiScalarField3D<T>& originalBlock,
00224         Box3D const& exceptedBlock )
00225 {
00226     std::auto_ptr<MultiScalarField3D<T> > newBlock (
00227         new MultiScalarField3D<T> (
00228             except( originalBlock.getMultiBlockManagement(), exceptedBlock),
00229             originalBlock.getBlockCommunicator().clone(),
00230             originalBlock.getCombinedStatistics().clone(),
00231             defaultMultiBlockPolicy3D().getMultiScalarAccess<T>() )
00232     );
00233 
00234     transferScalarFieldLocal( originalBlock, *newBlock,
00235                               originalBlock.getBoundingBox() );
00236 
00237     return newBlock;
00238 }
00239 
00240 
00241 template<typename T>
00242 std::auto_ptr<MultiScalarField3D<T> > redistribute (
00243         MultiScalarField3D<T> const& originalField,
00244         SparseBlockStructure3D const& newBlockStructure )
00245 {
00246     std::auto_ptr<MultiScalarField3D<T> > newField (
00247         new MultiScalarField3D<T> (
00248             MultiBlockManagement3D (
00249                 newBlockStructure,
00250                 originalField.getMultiBlockManagement().getThreadAttribution().clone(),
00251                 originalField.getMultiBlockManagement().getEnvelopeWidth() ),
00252             originalField.getBlockCommunicator().clone(),
00253             originalField.getCombinedStatistics().clone(),
00254             defaultMultiBlockPolicy3D().getMultiScalarAccess<T>() )
00255     );
00256 
00257     transferScalarFieldNonLocal(originalField, *newField, originalField.getBoundingBox());
00258 
00259     return newField;
00260 }
00261 
00262 template<typename T>
00263 std::auto_ptr<MultiScalarField3D<T> > redistribute (
00264         MultiScalarField3D<T> const& originalField,
00265         SparseBlockStructure3D const& newBlockStructure,
00266         Box3D const& intersection, bool crop )
00267 {
00268     return redistribute(originalField, intersect(newBlockStructure, intersection, crop));
00269 }
00270 
00271 template<typename T>
00272 std::auto_ptr<MultiScalarField3D<T> > align (
00273         MultiScalarField3D<T> const& originalBlock,
00274         MultiBlock3D const& partnerBlock )
00275 {
00276     std::auto_ptr<MultiScalarField3D<T> > newBlock (
00277         new MultiScalarField3D<T> (
00278             align(originalBlock.getMultiBlockManagement(),
00279                   partnerBlock.getMultiBlockManagement()),
00280             originalBlock.getBlockCommunicator().clone(),
00281             originalBlock.getCombinedStatistics().clone(),
00282             defaultMultiBlockPolicy3D().getMultiScalarAccess<T>() )
00283     );
00284 
00285     transferScalarFieldNonLocal( originalBlock, *newBlock,
00286                                  originalBlock.getBoundingBox() );
00287 
00288     return newBlock;
00289 }
00290 
00291 template<typename T>
00292 std::auto_ptr<MultiScalarField3D<T> > reparallelize (
00293         MultiScalarField3D<T> const& originalBlock )
00294 {
00295     return reparallelize(originalBlock, 16, 16, 16);
00296 }
00297 
00298 template<typename T>
00299 std::auto_ptr<MultiScalarField3D<T> > reparallelize (
00300         MultiScalarField3D<T> const& originalBlock,
00301         plint blockLx, plint blockLy, plint blockLz )
00302 {
00303     std::auto_ptr<MultiScalarField3D<T> > newBlock (
00304         new MultiScalarField3D<T> (
00305             reparallelize (
00306                 originalBlock.getMultiBlockManagement(),
00307                 blockLx, blockLy, blockLz ),
00308             originalBlock.getBlockCommunicator().clone(),
00309             originalBlock.getCombinedStatistics().clone(),
00310             defaultMultiBlockPolicy3D().getMultiScalarAccess<T>() )
00311     );
00312 
00313     transferScalarFieldNonLocal( originalBlock, *newBlock,
00314                                  originalBlock.getBoundingBox() );
00315 
00316     return newBlock;
00317 }
00318 
00319 
00320 /* *************** 2. MultiNTensorField ************************************** */
00321 
00322 template<typename T>
00323 std::auto_ptr<MultiNTensorField3D<T> > defaultGenerateMultiNTensorField3D (
00324         MultiBlockManagement3D const& management, plint nDim )
00325 {
00326     MultiNTensorField3D<T>* field = new MultiNTensorField3D<T> (
00327         nDim, management,
00328         defaultMultiBlockPolicy3D().getBlockCommunicator(),
00329         defaultMultiBlockPolicy3D().getCombinedStatistics(),
00330         defaultMultiBlockPolicy3D().getMultiNTensorAccess<T>() );
00331     field->periodicity().toggleAll(true);
00332     return std::auto_ptr<MultiNTensorField3D<T> >(field);
00333 }
00334 
00335 template<typename T>
00336 MultiNTensorField3D<T>* generateMultiNTensorField3D (
00337         MultiBlock3D& multiBlock, plint envelopeWidth, plint ndim )
00338 {
00339     MultiBlockManagement3D sparseBlockManagement(multiBlock.getMultiBlockManagement());
00340     return new MultiNTensorField3D<T> (
00341             ndim,
00342             MultiBlockManagement3D (
00343                 sparseBlockManagement.getSparseBlockStructure(),
00344                 sparseBlockManagement.getThreadAttribution().clone(),
00345                 envelopeWidth,
00346                 sparseBlockManagement.getRefinementLevel() ),
00347             defaultMultiBlockPolicy3D().getBlockCommunicator(),
00348             defaultMultiBlockPolicy3D().getCombinedStatistics(),
00349             defaultMultiBlockPolicy3D().getMultiNTensorAccess<T>() );
00350 }
00351 
00352 template<typename T>
00353 MultiNTensorField3D<T>* generateMultiNTensorField3D(Box3D const& domain, plint ndim)
00354 {
00355     plint defaultEnvelopeWidth = 1;
00356     MultiNTensorField3D<T>* field = new MultiNTensorField3D<T> (
00357         ndim,
00358         defaultMultiBlockPolicy3D().getMultiBlockManagement(domain,defaultEnvelopeWidth),
00359         defaultMultiBlockPolicy3D().getBlockCommunicator(),
00360         defaultMultiBlockPolicy3D().getCombinedStatistics(),
00361         defaultMultiBlockPolicy3D().getMultiNTensorAccess<T>() );
00362     field->periodicity().toggleAll(true);
00363     return field;
00364 }
00365 
00366 
00367 template<typename T>
00368 void transferNTensorFieldLocal (
00369         MultiNTensorField3D<T>& from, MultiNTensorField3D<T>& to, Box3D const& domain )
00370 {
00371     // 1. Copy all data from the old to the new field.
00372     plb::copy(from, to, from.getBoundingBox());
00373     // 2. Reconstruct the data processors.
00374     transferDataProcessors(from, to);
00375 }
00376 
00377 template<typename T>
00378 void transferNTensorFieldNonLocal (
00379         MultiNTensorField3D<T> const& from, MultiNTensorField3D<T>& to, Box3D const& domain )
00380 {
00381     // 1. Copy all data from the old to the new field. This includes dynamics
00382     //    objects which must be fully serialized and regenerated.
00383     copyNonLocal(from, to, domain);
00384     // 2. Reconstruct the data processors.
00385     transferDataProcessors(from, to);
00386 }
00387 
00388 template<typename T>
00389 MultiNTensorField3D<T>* clone (
00390         MultiNTensorField3D<T>& originalField,
00391         Box3D const& subDomain, bool crop )
00392 {
00393     MultiNTensorField3D<T>* clonedField =
00394             generateMultiNTensorField<T>(originalField, subDomain, crop);
00395     clonedField->periodicity()=originalField.periodicity();
00396 
00397     transferNTensorFieldLocal( originalField, *clonedField,
00398                                originalField.getBoundingBox() );
00399 
00400     return clonedField;
00401 }
00402 
00403 template<typename T>
00404 MultiNTensorField3D<T>* generateMultiNTensorField (
00405         MultiBlock3D const& originalField, Box3D const& intersection,
00406         plint nDim, bool crop )
00407 {
00408     MultiNTensorField3D<T>* newField = new MultiNTensorField3D<T> (
00409             nDim,
00410             intersect(originalField.getMultiBlockManagement(), intersection, crop),
00411             originalField.getBlockCommunicator().clone(),
00412             originalField.getCombinedStatistics().clone(),
00413             defaultMultiBlockPolicy3D().getMultiNTensorAccess<T>() );
00414     newField->periodicity() = originalField.periodicity();
00415     return newField;
00416 }
00417 
00418 template<typename T1, typename T2>
00419 MultiNTensorField3D<T2>*
00420     generateNTensorFieldFromNTensor3D (
00421             MultiNTensorField3D<T1> const& field,
00422             Box3D const& intersection, plint nDim )
00423 {
00424     MultiNTensorField3D<T2>* newField = generateMultiNTensorField<T2>(field, intersection, nDim);
00425     newField->periodicity() = field.periodicity();
00426     return newField;
00427 }
00428 
00429 template<typename T1, typename T2, template<typename U> class Descriptor>
00430 MultiNTensorField3D<T1>*
00431     generateNTensorFieldFromBlockLattice3D (
00432             MultiBlockLattice3D<T2,Descriptor> const& lattice,
00433             Box3D const& intersection, plint nDim )
00434 {
00435     MultiNTensorField3D<T1>* newField = generateMultiNTensorField<T1>(lattice, intersection, nDim);
00436     newField->periodicity() = lattice.periodicity();
00437     return newField;
00438 }
00439 
00440 
00441 template<typename T>
00442 MultiNTensorField3D<T>* generateIntersectMultiNTensorField (
00443         MultiBlock3D const& originalField1,
00444         MultiBlock3D const& originalField2, plint nDim, bool crop )
00445 {
00446     MultiNTensorField3D<T>* newField = new MultiNTensorField3D<T> (
00447             nDim,
00448             intersect(originalField1.getMultiBlockManagement(),
00449                       originalField2.getMultiBlockManagement(), crop),
00450             originalField1.getBlockCommunicator().clone(),
00451             originalField1.getCombinedStatistics().clone(),
00452             defaultMultiBlockPolicy3D().getMultiNTensorAccess<T>() );
00453     newField->periodicity() = originalField1.periodicity();
00454     return newField;
00455 }
00456 
00457 template<typename T>
00458 MultiNTensorField3D<T>* generateIntersectMultiNTensorField (
00459         MultiBlock3D const& originalField1,
00460         MultiBlock3D const& originalField2,
00461         Box3D const& intersection, plint nDim, bool crop )
00462 {
00463     MultiBlockManagement3D intersectedBlocks (
00464             intersect ( originalField1.getMultiBlockManagement(),
00465                         originalField2.getMultiBlockManagement(), crop ) );
00466     MultiBlockManagement3D intersectWithDomain (
00467             intersect( intersectedBlocks, intersection, crop ) );
00468     MultiNTensorField3D<T>* newField = new MultiNTensorField3D<T> (
00469             nDim,
00470             intersectWithDomain,
00471             originalField1.getBlockCommunicator().clone(),
00472             originalField1.getCombinedStatistics().clone(),
00473             defaultMultiBlockPolicy3D().getMultiNTensorAccess<T>() );
00474     newField->periodicity() = originalField1.periodicity();
00475     return newField;
00476 }
00477 
00478 template<typename T>
00479 MultiNTensorField3D<T>* generateJoinMultiNTensorField (
00480         MultiBlock3D const& originalField1,
00481         MultiBlock3D const& originalField2, plint nDim )
00482 {
00483     MultiNTensorField3D<T>* newField = new MultiNTensorField3D<T> (
00484             nDim,
00485             block_union (
00486                 originalField1.getMultiBlockManagement(),
00487                 originalField2.getMultiBlockManagement() ),
00488             originalField1.getBlockCommunicator().clone(),
00489             originalField1.getCombinedStatistics().clone(),
00490             defaultMultiBlockPolicy3D().getMultiNTensorAccess<T>() );
00491     newField->periodicity() = originalField1.periodicity();
00492     return newField;
00493 }
00494 
00495 template<typename T>
00496 MultiNTensorField3D<T>* extend (
00497         MultiNTensorField3D<T>& originalBlock, Box3D const& addedBlock )
00498 {
00499     MultiNTensorField3D<T>* newBlock =
00500         new MultiNTensorField3D<T> (
00501             originalBlock.getNdim(),
00502             extend( originalBlock.getMultiBlockManagement(), addedBlock, addedBlock ),
00503             originalBlock.getBlockCommunicator().clone(),
00504             originalBlock.getCombinedStatistics().clone(),
00505             defaultMultiBlockPolicy3D().getMultiNTensorAccess<T>() );
00506     newBlock->periodicity() = originalBlock.periodicity();
00507 
00508     transferNTensorFieldLocal( originalBlock, *newBlock,
00509                                originalBlock.getBoundingBox() );
00510 
00511     return newBlock;
00512 }
00513 
00514 template<typename T>
00515 MultiNTensorField3D<T>* except (
00516         MultiNTensorField3D<T>& originalBlock,
00517         Box3D const& exceptedBlock )
00518 {
00519     MultiNTensorField3D<T>* newBlock =
00520         new MultiNTensorField3D<T> (
00521             originalBlock.getNdim(),
00522             except( originalBlock.getMultiBlockManagement(), exceptedBlock),
00523             originalBlock.getBlockCommunicator().clone(),
00524             originalBlock.getCombinedStatistics().clone(),
00525             defaultMultiBlockPolicy3D().getMultiNTensorAccess<T>() );
00526     newBlock->periodicity() = originalBlock.periodicity();
00527 
00528     transferNTensorFieldLocal( originalBlock, *newBlock,
00529                                originalBlock.getBoundingBox() );
00530 
00531     return newBlock;
00532 }
00533 
00534 template<typename T>
00535 MultiNTensorField3D<T>* align (
00536         MultiNTensorField3D<T> const& originalBlock,
00537         MultiBlock3D const& partnerBlock )
00538 {
00539     MultiNTensorField3D<T>* newBlock =
00540         new MultiNTensorField3D<T> (
00541             originalBlock.getNdim(),
00542             align(originalBlock.getMultiBlockManagement(),
00543                   partnerBlock.getMultiBlockManagement()),
00544             originalBlock.getBlockCommunicator().clone(),
00545             originalBlock.getCombinedStatistics().clone(),
00546             defaultMultiBlockPolicy3D().getMultiNTensorAccess<T>() );
00547     newBlock->periodicity() = originalBlock.periodicity();
00548 
00549     transferNTensorFieldNonLocal( originalBlock, *newBlock,
00550                                   originalBlock.getBoundingBox() );
00551 
00552     return newBlock;
00553 }
00554 
00555 template<typename T>
00556 MultiNTensorField3D<T>* reparallelize (
00557         MultiNTensorField3D<T> const& originalBlock )
00558 {
00559     MultiNTensorField3D<T>* newBlock =
00560         new MultiNTensorField3D<T> (
00561             originalBlock.getNdim(),
00562             reparallelize(originalBlock.getMultiBlockManagement(), 16,16,16),
00563             originalBlock.getBlockCommunicator().clone(),
00564             originalBlock.getCombinedStatistics().clone(),
00565             defaultMultiBlockPolicy3D().getMultiNTensorAccess<T>() );
00566     newBlock->periodicity() = originalBlock.periodicity();
00567 
00568     transferNTensorFieldNonLocal( originalBlock, *newBlock,
00569                                   originalBlock.getBoundingBox() );
00570 
00571     return newBlock;
00572 }
00573 
00574 
00575 /* *************** 3. MultiTensorField ************************************** */
00576 
00577 template<typename T, int nDim>
00578 void transferTensorFieldLocal (
00579         MultiTensorField3D<T,nDim>& from, MultiTensorField3D<T,nDim>& to, Box3D const& domain )
00580 {
00581     // 1. Copy all data from the old to the new field.
00582     plb::copy(from, to, from.getBoundingBox());
00583     // 2. Reconstruct the data processors.
00584     transferDataProcessors(from, to);
00585 }
00586 
00587 template<typename T, int nDim>
00588 void transferTensorFieldNonLocal (
00589         MultiTensorField3D<T,nDim> const& from, MultiTensorField3D<T,nDim>& to, Box3D const& domain )
00590 {
00591     // 1. Copy all data from the old to the new field. This includes dynamics
00592     //    objects which must be fully serialized and regenerated.
00593     copyNonLocal(from, to, domain);
00594     // 2. Reconstruct the data processors.
00595     transferDataProcessors(from, to);
00596 }
00597 
00598 template<typename T, int nDim>
00599 std::auto_ptr<MultiTensorField3D<T,nDim> > generateMultiTensorField (
00600         Box3D boundingBox, plint envelopeWidth )
00601 {
00602     return std::auto_ptr<MultiTensorField3D<T,nDim> > (
00603         new MultiTensorField3D<T,nDim> (
00604             defaultMultiBlockPolicy3D().getMultiBlockManagement(boundingBox, envelopeWidth),
00605             defaultMultiBlockPolicy3D().getBlockCommunicator(),
00606             defaultMultiBlockPolicy3D().getCombinedStatistics(),
00607             defaultMultiBlockPolicy3D().getMultiTensorAccess<T,nDim>() )
00608     );
00609 }
00610 
00611 template<typename T, int nDim>
00612 std::auto_ptr<MultiTensorField3D<T,nDim> > generateMultiTensorField (
00613         Box3D boundingBox, Array<T,nDim> const& iniVal, plint envelopeWidth )
00614 {
00615     return std::auto_ptr<MultiTensorField3D<T,nDim> > (
00616         new MultiTensorField3D<T,nDim> (
00617             defaultMultiBlockPolicy3D().getMultiBlockManagement(boundingBox, envelopeWidth),
00618             defaultMultiBlockPolicy3D().getBlockCommunicator(),
00619             defaultMultiBlockPolicy3D().getCombinedStatistics(),
00620             defaultMultiBlockPolicy3D().getMultiTensorAccess<T,nDim>(), iniVal )
00621     );
00622 }
00623 
00624 template<typename T, int nDim>
00625 std::auto_ptr<MultiTensorField3D<T,nDim> > defaultGenerateMultiTensorField3D (
00626         MultiBlockManagement3D const& management, plint nDimParam )
00627 {
00628     Array<T,nDim> iniVal;
00629     iniVal.resetToZero();
00630     return std::auto_ptr<MultiTensorField3D<T,nDim> > (
00631         new MultiTensorField3D<T,nDim> (
00632             management,
00633             defaultMultiBlockPolicy3D().getBlockCommunicator(),
00634             defaultMultiBlockPolicy3D().getCombinedStatistics(),
00635             defaultMultiBlockPolicy3D().getMultiTensorAccess<T,nDim>(), iniVal )
00636     );
00637 }
00638 
00639 template<typename T, int nDim>
00640 std::auto_ptr<MultiTensorField3D<T,nDim> > clone (
00641         MultiTensorField3D<T,nDim>& originalField,
00642         Box3D const& subDomain, bool crop )
00643 {
00644     std::auto_ptr<MultiTensorField3D<T,nDim> > clonedField (
00645             generateMultiTensorField<T,nDim>(originalField, subDomain, crop) );
00646 
00647     transferTensorFieldLocal( originalField, *clonedField,
00648                               originalField.getBoundingBox() );
00649 
00650     return clonedField;
00651 }
00652 
00653 template<typename T, int nDim>
00654 std::auto_ptr<MultiTensorField3D<T,nDim> > generateMultiTensorField (
00655         MultiBlock3D const& originalField, Box3D const& intersection,
00656         bool crop )
00657 {
00658     return std::auto_ptr<MultiTensorField3D<T,nDim> > (
00659         new MultiTensorField3D<T,nDim> (
00660             intersect(originalField.getMultiBlockManagement(), intersection, crop),
00661             originalField.getBlockCommunicator().clone(),
00662             originalField.getCombinedStatistics().clone(),
00663             defaultMultiBlockPolicy3D().getMultiTensorAccess<T,nDim>() )
00664     );
00665 }
00666 
00667 template<typename T, int nDim>
00668 std::auto_ptr<MultiTensorField3D<T,nDim> > generateIntersectMultiTensorField (
00669         MultiBlock3D const& originalField1,
00670         MultiBlock3D const& originalField2, bool crop )
00671 {
00672     return std::auto_ptr<MultiTensorField3D<T,nDim> > (
00673         new MultiTensorField3D<T,nDim> (
00674             intersect(originalField1.getMultiBlockManagement(),
00675                       originalField2.getMultiBlockManagement(), crop),
00676             originalField1.getBlockCommunicator().clone(),
00677             originalField1.getCombinedStatistics().clone(),
00678             defaultMultiBlockPolicy3D().getMultiTensorAccess<T,nDim>() )
00679     );
00680 }
00681 
00682 template<typename T, int nDim>
00683 std::auto_ptr<MultiTensorField3D<T,nDim> > generateIntersectMultiTensorField (
00684         MultiBlock3D const& originalField1,
00685         MultiBlock3D const& originalField2,
00686         Box3D const& intersection, bool crop )
00687 {
00688     MultiBlockManagement3D intersectedBlocks (
00689             intersect ( originalField1.getMultiBlockManagement(),
00690                         originalField2.getMultiBlockManagement(), crop ) );
00691     MultiBlockManagement3D intersectWithDomain (
00692             intersect( intersectedBlocks, intersection, crop ) );
00693     return std::auto_ptr<MultiTensorField3D<T,nDim> > (
00694         new MultiTensorField3D<T,nDim> (
00695             intersectWithDomain,
00696             originalField1.getBlockCommunicator().clone(),
00697             originalField1.getCombinedStatistics().clone(),
00698             defaultMultiBlockPolicy3D().getMultiTensorAccess<T,nDim>() )
00699     );
00700 }
00701 
00702 template<typename T, int nDim>
00703 std::auto_ptr<MultiTensorField3D<T,nDim> > generateJoinMultiTensorField (
00704         MultiBlock3D const& originalField1,
00705         MultiBlock3D const& originalField2 )
00706 {
00707     return std::auto_ptr<MultiTensorField3D<T,nDim> > (
00708         new MultiTensorField3D<T,nDim> (
00709             block_union (
00710                 originalField1.getMultiBlockManagement(),
00711                 originalField2.getMultiBlockManagement() ),
00712             originalField1.getBlockCommunicator().clone(),
00713             originalField1.getCombinedStatistics().clone(),
00714             defaultMultiBlockPolicy3D().getMultiTensorAccess<T,nDim>() )
00715     );
00716 }
00717 
00718 template<typename T, int nDim>
00719 std::auto_ptr<MultiTensorField3D<T,nDim> > extend (
00720         MultiTensorField3D<T,nDim>& originalBlock, Box3D const& addedBlock )
00721 {
00722     std::auto_ptr<MultiTensorField3D<T,nDim> > newBlock (
00723         new MultiTensorField3D<T,nDim> (
00724             extend( originalBlock.getMultiBlockManagement(), addedBlock, addedBlock ),
00725             originalBlock.getBlockCommunicator().clone(),
00726             originalBlock.getCombinedStatistics().clone(),
00727             defaultMultiBlockPolicy3D().getMultiTensorAccess<T,nDim>() )
00728     );
00729 
00730     transferTensorFieldLocal( originalBlock, *newBlock,
00731                               originalBlock.getBoundingBox() );
00732 
00733     return newBlock;
00734 }
00735 
00736 template<typename T, int nDim>
00737 std::auto_ptr<MultiTensorField3D<T,nDim> > except (
00738         MultiTensorField3D<T,nDim>& originalBlock,
00739         Box3D const& exceptedBlock )
00740 {
00741     std::auto_ptr<MultiTensorField3D<T,nDim> > newBlock (
00742         new MultiTensorField3D<T,nDim> (
00743             except( originalBlock.getMultiBlockManagement(), exceptedBlock),
00744             originalBlock.getBlockCommunicator().clone(),
00745             originalBlock.getCombinedStatistics().clone(),
00746             defaultMultiBlockPolicy3D().getMultiTensorAccess<T,nDim>() )
00747     );
00748 
00749     transferTensorFieldLocal( originalBlock, *newBlock,
00750                               originalBlock.getBoundingBox() );
00751 
00752     return newBlock;
00753 }
00754 
00755 template<typename T, int nDim>
00756 std::auto_ptr<MultiTensorField3D<T,nDim> > redistribute (
00757         MultiTensorField3D<T,nDim> const& originalField,
00758         SparseBlockStructure3D const& newBlockStructure )
00759 {
00760     std::auto_ptr<MultiTensorField3D<T,nDim> > newField (
00761         new MultiTensorField3D<T,nDim> (
00762             MultiBlockManagement3D (
00763                 newBlockStructure,
00764                 originalField.getMultiBlockManagement().getThreadAttribution().clone(),
00765                 originalField.getMultiBlockManagement().getEnvelopeWidth() ),
00766             originalField.getBlockCommunicator().clone(),
00767             originalField.getCombinedStatistics().clone(),
00768             defaultMultiBlockPolicy3D().getMultiTensorAccess<T,nDim>() )
00769     );
00770     transferTensorFieldNonLocal(originalField, *newField, originalField.getBoundingBox());
00771 
00772     return newField;
00773 }
00774 
00775 template<typename T, int nDim>
00776 std::auto_ptr<MultiTensorField3D<T,nDim> > redistribute (
00777         MultiTensorField3D<T,nDim> const& originalField,
00778         SparseBlockStructure3D const& newBlockStructure,
00779         Box3D const& intersection, bool crop  )
00780 {
00781     return redistribute(originalField, intersect(newBlockStructure, intersection, crop));
00782 }
00783 
00784 
00785 template<typename T, int nDim>
00786 std::auto_ptr<MultiTensorField3D<T,nDim> > align (
00787         MultiTensorField3D<T,nDim> const& originalBlock,
00788         MultiBlock3D const& partnerBlock )
00789 {
00790     std::auto_ptr<MultiTensorField3D<T,nDim> > newBlock (
00791         new MultiTensorField3D<T,nDim> (
00792             align(originalBlock.getMultiBlockManagement(),
00793                   partnerBlock.getMultiBlockManagement()),
00794             originalBlock.getBlockCommunicator().clone(),
00795             originalBlock.getCombinedStatistics().clone(),
00796             defaultMultiBlockPolicy3D().getMultiTensorAccess<T,nDim>() )
00797     );
00798 
00799     transferTensorFieldNonLocal( originalBlock, *newBlock,
00800                                  originalBlock.getBoundingBox() );
00801 
00802     return newBlock;
00803 }
00804 
00805 template<typename T, int nDim>
00806 std::auto_ptr<MultiTensorField3D<T,nDim> > reparallelize (
00807         MultiTensorField3D<T,nDim> const& originalBlock )
00808 {
00809     return reparallelize(originalBlock, 16, 16, 16);
00810 }
00811 
00812 template<typename T, int nDim>
00813 std::auto_ptr<MultiTensorField3D<T,nDim> > reparallelize (
00814         MultiTensorField3D<T,nDim> const& originalBlock,
00815         plint blockLx, plint blockLy, plint blockLz)
00816 {
00817     std::auto_ptr<MultiTensorField3D<T,nDim> > newBlock (
00818         new MultiTensorField3D<T,nDim> (
00819             reparallelize (
00820                 originalBlock.getMultiBlockManagement(),
00821                 blockLx, blockLy, blockLz ),
00822             originalBlock.getBlockCommunicator().clone(),
00823             originalBlock.getCombinedStatistics().clone(),
00824             defaultMultiBlockPolicy3D().getMultiTensorAccess<T,nDim>() )
00825     );
00826 
00827     transferTensorFieldNonLocal( originalBlock, *newBlock,
00828                                  originalBlock.getBoundingBox() );
00829 
00830     return newBlock;
00831 }
00832 
00833 
00834 /* *************** 4. MultiBlockLattice ************************************** */
00835 
00836 template<typename T, template<typename U> class Descriptor>
00837 void transferBlockLatticeLocal (
00838         MultiBlockLattice3D<T,Descriptor>& from,
00839         MultiBlockLattice3D<T,Descriptor>& to, Box3D const& domain )
00840 {
00841     // 1. Copy static and dynamic data to the new block.
00842     copyRegenerate(from, to, from.getBoundingBox());
00843 
00844     // 2. Reconstruct the data processors.
00845     transferDataProcessors(from, to);
00846 }
00847 
00848 template<typename T, template<typename U> class Descriptor>
00849 void transferBlockLatticeNonLocal (
00850         MultiBlockLattice3D<T,Descriptor> const& from,
00851         MultiBlockLattice3D<T,Descriptor>& to, Box3D const& domain )
00852 {
00853     // 1. Copy all data from the old to the new field. This includes dynamics
00854     //    objects which must be fully serialized and regenerated.
00855     copyNonLocal(from, to, domain, modif::dataStructure);
00856     // 2. Reconstruct the data processors.
00857     transferDataProcessors(from, to);
00858 }
00859 
00860 template<typename T, template<typename U> class Descriptor>
00861 std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > generateMultiBlockLattice (
00862         Box3D boundingBox, Dynamics<T,Descriptor>* backgroundDynamics, plint envelopeWidth )
00863 {
00864     return std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > (
00865         new MultiBlockLattice3D<T,Descriptor> (
00866             defaultMultiBlockPolicy3D().getMultiBlockManagement(boundingBox, envelopeWidth),
00867             defaultMultiBlockPolicy3D().getBlockCommunicator(),
00868             defaultMultiBlockPolicy3D().getCombinedStatistics(),
00869             defaultMultiBlockPolicy3D().getMultiCellAccess<T,Descriptor>(),
00870             backgroundDynamics )
00871     );
00872 }
00873 
00874 template<typename T, template<typename U> class Descriptor>
00875 std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > defaultGenerateMultiBlockLattice3D (
00876         MultiBlockManagement3D const& management, plint nDim )
00877 {
00878     return std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > (
00879         new MultiBlockLattice3D<T,Descriptor> (
00880             management,
00881             defaultMultiBlockPolicy3D().getBlockCommunicator(),
00882             defaultMultiBlockPolicy3D().getCombinedStatistics(),
00883             defaultMultiBlockPolicy3D().getMultiCellAccess<T,Descriptor>(),
00884             new NoDynamics<T,Descriptor> )
00885     );
00886 }
00887 
00888 template<typename T, template<typename U> class Descriptor>
00889 std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > clone (
00890         MultiBlockLattice3D<T,Descriptor>& originalLattice,
00891         Box3D const& subDomain, bool crop )
00892 {
00893     std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > clonedLattice (
00894             generateMultiBlockLattice<T,Descriptor>(originalLattice, subDomain, crop) );
00895 
00896     transferBlockLatticeLocal( originalLattice, *clonedLattice,
00897                                originalLattice.getBoundingBox() );
00898 
00899     return clonedLattice;
00900 }
00901 
00902 template<typename T, template<typename U> class Descriptor>
00903 std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > generateMultiBlockLattice (
00904         MultiBlock3D& multiBlock, plint envelopeWidth,
00905         Dynamics<T,Descriptor>* backgroundDynamics )
00906 {
00907     MultiBlockManagement3D sparseBlockManagement(multiBlock.getMultiBlockManagement());
00908     return std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > (
00909         new MultiBlockLattice3D<T,Descriptor> (
00910             MultiBlockManagement3D (
00911                 sparseBlockManagement.getSparseBlockStructure(),
00912                 sparseBlockManagement.getThreadAttribution().clone(),
00913                 envelopeWidth,
00914                 sparseBlockManagement.getRefinementLevel() ),
00915             defaultMultiBlockPolicy3D().getBlockCommunicator(),
00916             defaultMultiBlockPolicy3D().getCombinedStatistics(),
00917             defaultMultiBlockPolicy3D().getMultiCellAccess<T,Descriptor>(),
00918             backgroundDynamics )
00919     );
00920 }
00921 
00922 template<typename T, template<typename U> class Descriptor>
00923 std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > generateMultiBlockLattice (
00924         MultiBlock3D const& originalBlock, Box3D const& intersection,
00925         bool crop )
00926 {
00927     return std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > (
00928         new MultiBlockLattice3D<T,Descriptor> (
00929             intersect(originalBlock.getMultiBlockManagement(), intersection, crop),
00930             originalBlock.getBlockCommunicator().clone(),
00931             originalBlock.getCombinedStatistics().clone(),
00932             defaultMultiBlockPolicy3D().getMultiCellAccess<T,Descriptor>(),
00933             new NoDynamics<T,Descriptor> )
00934     );
00935 }
00936 
00937 template<typename T, template<typename U> class Descriptor>
00938 std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > generateIntersectMultiBlockLattice (
00939         MultiBlock3D const& originalBlock1,
00940         MultiBlock3D const& originalBlock2, bool crop )
00941 {
00942     return std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > (
00943         new MultiBlockLattice3D<T,Descriptor> (
00944             intersect(originalBlock1.getMultiBlockManagement(),
00945                       originalBlock2.getMultiBlockManagement(), crop),
00946             originalBlock1.getBlockCommunicator().clone(),
00947             originalBlock1.getCombinedStatistics().clone(),
00948             defaultMultiBlockPolicy3D().getMultiCellAccess<T,Descriptor>(),
00949             new NoDynamics<T,Descriptor> )
00950     );
00951 }
00952 
00953 template<typename T, template<typename U> class Descriptor>
00954 std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > generateIntersectMultiBlockLattice (
00955         MultiBlock3D const& originalBlock1,
00956         MultiBlock3D const& originalBlock2,
00957         Box3D const& intersection, bool crop )
00958 {
00959     MultiBlockManagement3D intersectedBlocks (
00960             intersect ( originalBlock1.getMultiBlockManagement(),
00961                         originalBlock2.getMultiBlockManagement(), crop ) );
00962     MultiBlockManagement3D intersectWithDomain (
00963             intersect( intersectedBlocks, intersection, crop ) );
00964     return std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > (
00965         new MultiBlockLattice3D<T,Descriptor> (
00966             intersectWithDomain,
00967             originalBlock1.getBlockCommunicator().clone(),
00968             originalBlock1.getCombinedStatistics().clone(),
00969             defaultMultiBlockPolicy3D().getMultiCellAccess<T,Descriptor>(),
00970             new NoDynamics<T,Descriptor> )
00971     );
00972 }
00973 
00974 template<typename T, template<typename U> class Descriptor>
00975 std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > generateJoinMultiBlockLattice (
00976         MultiBlock3D const& originalBlock1,
00977         MultiBlock3D const& originalBlock2 )
00978 {
00979     return std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > (
00980         new MultiBlockLattice3D<T,Descriptor> (
00981             block_union (
00982                 originalBlock1.getMultiBlockManagement(),
00983                 originalBlock2.getMultiBlockManagement() ),
00984             originalBlock1.getBlockCommunicator().clone(),
00985             originalBlock1.getCombinedStatistics().clone(),
00986             defaultMultiBlockPolicy3D().getMultiCellAccess<T,Descriptor>(),
00987             new NoDynamics<T,Descriptor> )
00988     );
00989 }
00990 
00991 template<typename T, template<typename U> class Descriptor>
00992 std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > extend (
00993         MultiBlockLattice3D<T,Descriptor>& originalBlock, Box3D const& addedBlock )
00994 {
00995     std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > newBlock (
00996         new MultiBlockLattice3D<T,Descriptor> (
00997             extend( originalBlock.getMultiBlockManagement(), addedBlock, addedBlock ),
00998             originalBlock.getBlockCommunicator().clone(),
00999             originalBlock.getCombinedStatistics().clone(),
01000             defaultMultiBlockPolicy3D().getMultiCellAccess<T,Descriptor>(),
01001             originalBlock.getBackgroundDynamics().clone() )
01002     );
01003 
01004     transferBlockLatticeLocal( originalBlock, *newBlock,
01005                                originalBlock.getBoundingBox() );
01006 
01007     return newBlock;
01008 }
01009 
01010 template<typename T, template<typename U> class Descriptor>
01011 std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > except (
01012         MultiBlockLattice3D<T,Descriptor>& originalBlock,
01013         Box3D const& exceptedBlock )
01014 {
01015     std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > newBlock (
01016         new MultiBlockLattice3D<T,Descriptor> (
01017             except( originalBlock.getMultiBlockManagement(), exceptedBlock),
01018             originalBlock.getBlockCommunicator().clone(),
01019             originalBlock.getCombinedStatistics().clone(),
01020             defaultMultiBlockPolicy3D().getMultiCellAccess<T,Descriptor>(),
01021             originalBlock.getBackgroundDynamics().clone() )
01022     );
01023 
01024     transferBlockLatticeLocal( originalBlock, *newBlock,
01025                                originalBlock.getBoundingBox() );
01026 
01027     return newBlock;
01028 }
01029 
01030 template<typename T, template<typename U> class Descriptor>
01031 std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > redistribute (
01032         MultiBlockLattice3D<T,Descriptor> const& originalBlock,
01033         SparseBlockStructure3D const& newBlockStructure )
01034 {
01035     std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > newBlock (
01036         new MultiBlockLattice3D<T,Descriptor> (
01037             MultiBlockManagement3D (
01038                 newBlockStructure,
01039                 originalBlock.getMultiBlockManagement().getThreadAttribution().clone(),
01040                 originalBlock.getMultiBlockManagement().getEnvelopeWidth() ),
01041             originalBlock.getBlockCommunicator().clone(),
01042             originalBlock.getCombinedStatistics().clone(),
01043             defaultMultiBlockPolicy3D().getMultiCellAccess<T,Descriptor>(),
01044             originalBlock.getBackgroundDynamics().clone() )
01045     );
01046 
01047     transferBlockLatticeNonLocal( originalBlock, *newBlock,
01048                                   originalBlock.getBoundingBox() );
01049 
01050     return newBlock;
01051 }
01052 
01053 template<typename T, template<typename U> class Descriptor>
01054 std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > redistribute (
01055         MultiBlockLattice3D<T,Descriptor> const& originalBlock,
01056         SparseBlockStructure3D const& newBlockStructure,
01057         Box3D const& intersection, bool crop )
01058 {
01059     return redistribute(originalBlock, intersect(newBlockStructure, intersection, crop));
01060 }
01061 
01062 template<typename T, template<typename U> class Descriptor>
01063 std::auto_ptr<MultiBlockLattice3D<T, Descriptor> > align (
01064         MultiBlockLattice3D<T, Descriptor> const& originalBlock,
01065         MultiBlock3D const& partnerBlock )
01066 {
01067     std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > newBlock (
01068         new MultiBlockLattice3D<T,Descriptor> (
01069             align(originalBlock.getMultiBlockManagement(),
01070                   partnerBlock.getMultiBlockManagement()),
01071             originalBlock.getBlockCommunicator().clone(),
01072             originalBlock.getCombinedStatistics().clone(),
01073             defaultMultiBlockPolicy3D().getMultiCellAccess<T,Descriptor>(),
01074             originalBlock.getBackgroundDynamics().clone() )
01075     );
01076 
01077     transferBlockLatticeNonLocal( originalBlock, *newBlock,
01078                                   originalBlock.getBoundingBox() );
01079 
01080     return newBlock;
01081 }
01082 
01083 template<typename T, template<typename U> class Descriptor>
01084 std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > reparallelize (
01085         MultiBlockLattice3D<T,Descriptor> const& originalBlock )
01086 {
01087     return reparallelize(originalBlock, 16, 16, 16);
01088 }
01089 
01090 template<typename T, template<typename U> class Descriptor>
01091 std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > reparallelize (
01092         MultiBlockLattice3D<T,Descriptor> const& originalBlock,
01093         plint blockLx, plint blockLy, plint blockLz )
01094 {
01095     std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > newBlock (
01096         new MultiBlockLattice3D<T,Descriptor> (
01097             reparallelize (
01098                 originalBlock.getMultiBlockManagement(),
01099                 blockLx, blockLy, blockLz ),
01100             originalBlock.getBlockCommunicator().clone(),
01101             originalBlock.getCombinedStatistics().clone(),
01102             defaultMultiBlockPolicy3D().getMultiCellAccess<T,Descriptor>(),
01103             originalBlock.getBackgroundDynamics().clone() )
01104     );
01105 
01106     transferBlockLatticeNonLocal( originalBlock, *newBlock,
01107                                   originalBlock.getBoundingBox() );
01108 
01109     return newBlock;
01110 }
01111 
01112 }  // namespace plb
01113 
01114 #endif  // MULTI_BLOCK_GENERATOR_3D_HH