Skip to content
Snippets Groups Projects
Commit 1c80bd93 authored by Sebastian Eibl's avatar Sebastian Eibl
Browse files

[REFACTOR] initialization of BlockForestDomain

moved initialization of BlockForestDomain into refresh function
This way the BlockForestDomain can be refreshed (e.g. as part of
the load balancing) without recreating it.
parent 668979ee
Branches
Tags
No related merge requests found
...@@ -32,6 +32,12 @@ namespace domain { ...@@ -32,6 +32,12 @@ namespace domain {
/// \post neighborSubdomains_ is sorted by rank /// \post neighborSubdomains_ is sorted by rank
BlockForestDomain::BlockForestDomain(const std::shared_ptr<blockforest::BlockForest>& blockForest) BlockForestDomain::BlockForestDomain(const std::shared_ptr<blockforest::BlockForest>& blockForest)
: blockForest_(blockForest) : blockForest_(blockForest)
{
refresh();
}
/// \post neighborSubdomains_ is sorted by rank
void BlockForestDomain::refresh()
{ {
ownRank_ = mpi::MPIManager::instance()->rank(); ownRank_ = mpi::MPIManager::instance()->rank();
...@@ -41,6 +47,9 @@ BlockForestDomain::BlockForestDomain(const std::shared_ptr<blockforest::BlockFor ...@@ -41,6 +47,9 @@ BlockForestDomain::BlockForestDomain(const std::shared_ptr<blockforest::BlockFor
if (blockForest_->empty()) return; if (blockForest_->empty()) return;
localAABBs_.clear();
neighborSubdomains_.clear();
neighborProcesses_.clear();
unionOfLocalAABBs_ = blockForest_->begin()->getAABB(); unionOfLocalAABBs_ = blockForest_->begin()->getAABB();
for (auto& iBlk : *blockForest_) for (auto& iBlk : *blockForest_)
{ {
......
...@@ -35,6 +35,14 @@ class BlockForestDomain : public IDomain ...@@ -35,6 +35,14 @@ class BlockForestDomain : public IDomain
public: public:
BlockForestDomain(const std::shared_ptr<blockforest::BlockForest>& blockForest); BlockForestDomain(const std::shared_ptr<blockforest::BlockForest>& blockForest);
/**
* @brief If the BlockForest is changed this function has to be called in order to
* update all interal caches!
*
* Updates the local caches for local and neighbor AABBs.
*/
void refresh();
bool isContainedInProcessSubdomain(const uint_t rank, const Vec3& pt) const override; bool isContainedInProcessSubdomain(const uint_t rank, const Vec3& pt) const override;
bool isContainedInLocalSubdomain(const Vec3& pt, const real_t& radius) const override; bool isContainedInLocalSubdomain(const Vec3& pt, const real_t& radius) const override;
/// Is the sphere defined by \p pt and \p radius completely inside the local subdomin? /// Is the sphere defined by \p pt and \p radius completely inside the local subdomin?
...@@ -48,6 +56,7 @@ public: ...@@ -48,6 +56,7 @@ public:
bool intersectsWithProcessSubdomain(const uint_t rank, const Vec3& pt, const real_t& radius) const override; bool intersectsWithProcessSubdomain(const uint_t rank, const Vec3& pt, const real_t& radius) const override;
void correctParticlePosition(Vec3& pt) const override; void correctParticlePosition(Vec3& pt) const override;
const math::AABB& getUnionOfLocalAABBs() const {return unionOfLocalAABBs_;}
size_t getNumLocalAABBs() const {return localAABBs_.size();} size_t getNumLocalAABBs() const {return localAABBs_.size();}
size_t getNumNeighborSubdomains() const {return neighborSubdomains_.size();} size_t getNumNeighborSubdomains() const {return neighborSubdomains_.size();}
size_t getNumNeighborProcesses() const {return neighborProcesses_.size();} size_t getNumNeighborProcesses() const {return neighborProcesses_.size();}
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment