$treeview $search $mathjax
|
Palabos
Version 1.1
$projectbrief
|
$projectbrief
|
$searchbox |
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
1.6.3
1.6.3