/usr/include/palabos/multiBlock/sparseBlockStructure3D.h is in libplb-dev 1.5~r1+repack1-2build2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 | /* This file is part of the Palabos library.
*
* Copyright (C) 2011-2015 FlowKit Sarl
* Route d'Oron 2
* 1010 Lausanne, Switzerland
* E-mail contact: contact@flowkit.com
*
* The most recent release of Palabos can be downloaded at
* <http://www.palabos.org/>
*
* The library Palabos is free software: you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* The library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/** \file
* Fast algorithm for handling sparse multi-block structure -- header file.
*/
#ifndef SPARSE_BLOCK_STRUCTURE_3D_H
#define SPARSE_BLOCK_STRUCTURE_3D_H
#include "core/globalDefs.h"
#include "core/geometry3D.h"
#include "multiBlock/threadAttribution.h"
#include <vector>
#include <map>
namespace plb {
class SparseBlockStructure3D {
public:
typedef std::map<Dot3D, std::vector<plint> > GridT;
public:
/// Sparse grid structure with default internal implementation.
SparseBlockStructure3D(plint nx, plint ny, plint nz);
/// Sparse grid structure with default internal implementation.
SparseBlockStructure3D(Box3D boundingBox_);
/// Sparse grid structure with explicit grid parameters.
SparseBlockStructure3D(Box3D boundingBox_,
plint gridNx_, plint gridNy_, plint gridNz_);
/// Restrict an existing SparseBlockStructure3D to a sub-domain.
SparseBlockStructure3D(SparseBlockStructure3D const& rhs, Box3D boundingBox_);
/// Add a new block to the sparse block-structure.
void addBlock(Box3D const& bulk, Box3D const& uniqueBulk, plint blockId);
/// Add a new block to the sparse block-structure; uniqueBulk = bulk.
void addBlock(Box3D const& bulk, plint blockId);
/// Remove an existing block from the sparse block-structure.
void removeBlock(plint blockId);
/// Check if a block with the given ID already exists in the block-structure.
bool exists(plint blockId);
/// Return 1 + the maximum block ID currently found in the structure.
plint nextIncrementalId() const;
/// Return outer bounding box.
Box3D getBoundingBox() const;
/// Get the bulk of a given block. Returns false if the block does not exist.
bool getBulk(plint blockId, Box3D& bulk) const;
/// Get the unique bulk of a given block. Returns false if the block does not exist.
bool getUniqueBulk(plint blockId, Box3D& uniqueBulk) const;
/// Return the number of blocks contained in the structure.
plint getNumBlocks() const;
/// Get the number of bulk cells, cumulated over all blocks.
plint getNumBulkCells() const;
/// Get the id-to-bulk map for all blocks.
std::map<plint,Box3D> const& getBulks() const;
/// Enumerate all blocks attributed to the current MPI thread.
std::vector<plint> getLocalBlocks(ThreadAttribution const& attribution) const;
/// Find a block which contains given coordinates. Return -1 in case no block is found.
plint locate(plint iX, plint iY, plint iZ) const;
/// Intersect a given block with all blocks of the sparse block-structure.
void intersect( Box3D const& bulk, std::vector<plint>& ids,
std::vector<Box3D>& intersections ) const;
/// Intersect the envelope of block "blockId" with all neighbors
/// in a given direction.
void computeOverlaps( Box3D const& bulk, plint dx, plint dy, plint dz,
std::vector<plint>& ids,
std::vector<Box3D>& overlapsOnBulk,
std::vector<Box3D>& overlapsOnNeighbors ) const;
/// Intersect the envelope of block "blockId" with all neighbors.
void computeOverlaps( plint blockId, plint envelopeWidth,
std::vector<plint>& ids,
std::vector<Box3D>& overlapsOnBulk,
std::vector<Box3D>& overlapsOnNeighbors ) const;
/// Find all blocks adjacent to a given area (a specific block can be
/// excluded from the search.
void findNeighbors( Box3D const& block, plint neighborhoodWidth,
std::vector<plint>& neighbors,
plint excludeId=-1 ) const;
/// Find all blocks adjacent to a given block of the structure.
void findNeighbors( plint blockId, plint neighborhoodWidth,
std::vector<plint>& neighbors ) const;
void swap(SparseBlockStructure3D& rhs);
private:
/// Default resolution of the sparse grid.
void defaultGridN();
/// Compute gridLx, gridLy, and gridLz.
void iniGridParameters();
/// Convert block x-coordinate into coordinate of the sparse-block grid.
plint gridPosX(plint realX) const;
/// Convert block y-coordinate into coordinate of the sparse-block grid.
plint gridPosY(plint realY) const;
/// Convert block z-coordinate into coordinate of the sparse-block grid.
plint gridPosZ(plint realZ) const;
/// Convert block coordinates into coordinates of the sparse-block grid.
Box3D getGridBox(Box3D const& realBlock) const;
/// Extend bulk by an envelope layer in a given direction, in view of
/// computing overlaps with neighbors.
void computeEnvelopeTerm (
plint block0, plint block1,
plint& env0, plint& env1, plint delta ) const;
/// Integrate block into the sparse-block indirect addressing scheme.
void integrateBlock(plint blockId, Box3D bulk);
/// Remove block from the sparse-block indirect addressing scheme.
void extractBlock(plint blockId);
private:
Box3D boundingBox;
plint gridLx, gridLy, gridLz;
plint gridNx, gridNy, gridNz;
GridT grid;
// Attention: If replacing the map by a hashed_map, remember that
// nextIncrementalId() uses the fact that elements are ordered inside
// the map. Therefore, nextIncrementalId() must then be rewritten.
std::map<plint,Box3D> bulks;
/// UniqueBulks is never used for internal algorithms. It's just here to be
/// provided to the user when asked for.
std::map<plint,Box3D> uniqueBulks;
};
SparseBlockStructure3D scale(SparseBlockStructure3D const& sparseBlock, plint relativeLevel);
/// The bounding box of the result is the intersection of bounding box and
/// domain if crop=true, and is identified with the original bounding box
/// otherwise.
SparseBlockStructure3D intersect( SparseBlockStructure3D const& sparseBlock,
Box3D domain, bool crop );
/// Choose yourself the bounding box of the resulting block structure.
SparseBlockStructure3D intersect( SparseBlockStructure3D const& sparseBlock,
Box3D domain, Box3D newBoundingBox );
/// The bounding box of the result is the intersection of the two original bounding
/// boxes if crop=true, and the bound of the two otherwise.
SparseBlockStructure3D intersect( SparseBlockStructure3D const& sparseBlock1,
SparseBlockStructure3D const& sparseBlock2, bool crop );
/// By default, the freshly added domain is associated to the main mpi process in
/// the areas which don't intersect with the original domain. The added block is
/// potentially split into non-overlapping components, and the ids of these new
/// components is returned in the vector newIds.
SparseBlockStructure3D extend( SparseBlockStructure3D const& sparseBlock,
Box3D addedBulk, Box3D addedUniqueBulk,
std::vector<plint>& newIds );
/// Make a hole in the original block structure.
SparseBlockStructure3D except( SparseBlockStructure3D const& sparseBlock,
Box3D exceptedBlock,
std::map<plint,std::vector<plint> >& remappedIds );
/// Union of two sparse block structures.
SparseBlockStructure3D block_union( SparseBlockStructure3D const& sparseBlock1,
SparseBlockStructure3D const& sparseBlock2,
std::map<plint,std::vector<plint> >& remappedIds );
/// Align the distribution of originalStructure on partnerStructure, so that it
/// becomes possible to execute couplings between partnerStructure and the
/// newly created structure. The returned newIds refer to newly created blocks
/// (domains of originalStructure which don't overlap with partnerStructure) that
/// need to be parallelized manually. The returned remappedFromPartner refers to
/// newly created block which overlap with partnerStructure and should be parallelized
/// correspondingly.
SparseBlockStructure3D alignDistribution3D (
SparseBlockStructure3D const& originalStructure,
SparseBlockStructure3D const& partnerStructure,
std::vector<plint>& newIds,
std::map<plint,std::vector<plint> >& remappedFromPartner );
/// Iterate in a structured way over a sparse multi-block structure.
class EuclideanIterator3D {
public:
EuclideanIterator3D(SparseBlockStructure3D const& sparseBlock_);
/// Locate block and determine how much data can be
/// accessed in a x-contiguous manner. Return value indicates if
/// the memory corresponding to the chunk is allocated or not.
bool getNextChunkX(plint iX, plint iY, plint iZ,
plint& blockId, plint& chunkSize) const;
/// Locate block and determine how much data can be
/// accessed in a y-contiguous manner. Return value indicates if
/// the memory corresponding to the chunk is allocated or not.
bool getNextChunkY(plint iX, plint iY, plint iZ,
plint& blockId, plint& chunkSize) const;
/// Locate block and determine how much data can be
/// accessed in a z-contiguous manner. Return value indicates if
/// the memory corresponding to the chunk is allocated or not.
bool getNextChunkZ(plint iX, plint iY, plint iZ,
plint& blockId, plint& chunkSize) const;
private:
SparseBlockStructure3D const& sparseBlock;
};
} // namespace plb
#endif // SPARSE_BLOCK_STRUCTURE_3D_H
|