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

localMultiBlockInfo2D.h

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 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