$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 LOCAL_MULTI_BLOCK_INFO_2D_H 00030 #define LOCAL_MULTI_BLOCK_INFO_2D_H 00031 00032 #include "core/globalDefs.h" 00033 #include "core/geometry2D.h" 00034 #include "multiBlock/threadAttribution.h" 00035 #include "multiBlock/sparseBlockStructure2D.h" 00036 #include <vector> 00037 00038 00039 namespace plb { 00040 00043 class Overlap2D { 00044 public: 00045 Overlap2D(plint originalId_, plint overlapId_, Box2D const& intersection_) 00046 : originalId(originalId_), overlapId(overlapId_), 00047 originalRegion(intersection_), 00048 overlapRegion(intersection_) 00049 { } 00050 Overlap2D(plint originalId_, plint overlapId_, 00051 Box2D const& originalRegion_, 00052 plint shiftX, plint shiftY) 00053 : originalId(originalId_), overlapId(overlapId_), 00054 originalRegion(originalRegion_), 00055 overlapRegion(originalRegion.shift(-shiftX, -shiftY)) 00056 { } 00057 plint getOriginalId() const { return originalId; } 00058 plint getOverlapId() const { return overlapId; } 00060 Box2D const& getOriginalCoordinates() const { return originalRegion; } 00062 00066 Box2D const& getOverlapCoordinates() const { return overlapRegion; } 00067 plint getShiftX() const { return originalRegion.x0 - overlapRegion.x0; } 00068 plint getShiftY() const { return originalRegion.y0 - overlapRegion.y0; } 00069 private: 00070 plint originalId, overlapId; 00071 Box2D originalRegion, overlapRegion; 00072 }; 00073 00075 00079 inline bool operator<(Overlap2D const& overlap1, Overlap2D const& overlap2) 00080 { 00081 return 00082 (overlap1.getOriginalId() < overlap2.getOriginalId()) || ( 00083 (overlap1.getOriginalId() == overlap2.getOriginalId()) && ( 00084 (overlap1.getOverlapId() < overlap2.getOverlapId()) || ( 00085 (overlap1.getOverlapId() == overlap2.getOverlapId()) && 00086 (overlap1.getOriginalCoordinates() < overlap2.getOriginalCoordinates()) ) ) ); 00087 } 00088 00090 00096 struct PeriodicOverlap2D { 00097 PeriodicOverlap2D(Overlap2D const& overlap_, plint normalX_, plint normalY_); 00098 Overlap2D overlap; 00099 plint normalX; 00100 plint normalY; 00101 }; 00102 00103 00105 inline bool operator<( PeriodicOverlap2D const& overlap1, 00106 PeriodicOverlap2D const& overlap2 ) 00107 { 00108 return overlap1.overlap < overlap2.overlap; 00109 } 00110 00112 std::vector<Overlap2D> copyAllDataTransfer ( 00113 SparseBlockStructure2D const& block1, 00114 SparseBlockStructure2D const& block2 ); 00115 00117 00119 std::vector<Overlap2D> copyDomainDataTransfer ( 00120 SparseBlockStructure2D const& block1, Box2D block1Domain, 00121 SparseBlockStructure2D const& block2, Box2D block2Domain ); 00122 00123 class LocalMultiBlockInfo2D { 00124 public: 00125 LocalMultiBlockInfo2D( SparseBlockStructure2D const& sparseBlock, 00126 ThreadAttribution const& attribution, 00127 plint envelopeWidth_ ); 00129 std::vector<plint> const& getBlocks() const; 00131 std::vector<Overlap2D> const& getNormalOverlaps() const; 00134 std::vector<PeriodicOverlap2D> const& getPeriodicOverlaps() const; 00136 std::vector<PeriodicOverlap2D> const& getPeriodicOverlapWithRemoteData() const; 00137 void swap(LocalMultiBlockInfo2D& rhs); 00138 private: 00140 void computeMyBlocks(SparseBlockStructure2D const& sparseBlock, 00141 ThreadAttribution const& attribution); 00143 void computeAllNormalOverlaps(SparseBlockStructure2D const& sparseBlock); 00145 void computeNormalOverlaps(SparseBlockStructure2D const& sparseBlock, plint blockId); 00147 void computeAllPeriodicOverlaps(SparseBlockStructure2D const& sparseBlock); 00149 void computePeriodicOverlaps(SparseBlockStructure2D const& sparseBlock, plint blockId); 00150 private: 00151 plint envelopeWidth; 00152 std::vector<plint> myBlocks; 00153 std::vector<Overlap2D> normalOverlaps; 00154 std::vector<PeriodicOverlap2D> periodicOverlaps; 00155 std::vector<PeriodicOverlap2D> periodicOverlapWithRemoteData; 00156 }; 00157 00158 } // namespace plb 00159 00160 #endif // LOCAL_MULTI_BLOCK_INFO_2D_H
1.6.3
1.6.3