From 4b77bcf2673b00a47ceae9f13786ace9738a215e Mon Sep 17 00:00:00 2001
From: Christoph Rettinger <christoph.rettinger@fau.de>
Date: Thu, 9 Nov 2017 18:10:07 +0100
Subject: [PATCH] Changed shared_ptr to weak_ptr to break dependencies

---
 src/field/distributors/DistributorCreators.h  |  6 +++---
 src/field/distributors/KernelDistributor.h    | 17 ++++++++++-------
 .../distributors/NearestNeighborDistributor.h | 11 +++++++----
 .../interpolators/FieldInterpolatorCreators.h |  6 +++---
 .../interpolators/KernelFieldInterpolator.h   | 18 +++++++++++-------
 .../NearestNeighborFieldInterpolator.h        | 11 +++++++----
 .../TrilinearFieldInterpolator.h              | 19 +++++++++++--------
 7 files changed, 52 insertions(+), 36 deletions(-)

diff --git a/src/field/distributors/DistributorCreators.h b/src/field/distributors/DistributorCreators.h
index 78d790c62..e87b907ce 100644
--- a/src/field/distributors/DistributorCreators.h
+++ b/src/field/distributors/DistributorCreators.h
@@ -37,7 +37,7 @@ namespace field {
  * \ingroup field
  *
  * Distributor_T: A distributor that has a constructor
- *  ( const shared_ptr<StructuredBlockStorage> & blockStorage, const IBlock & block, const BaseField_T & baseField,
+ *  ( const weak_ptr<StructuredBlockStorage> & blockStorage, const IBlock & block, const BaseField_T & baseField,
  *    const FlagField_T & flagField, const flag_t & evaluationMask )
  * and distribution functions:
  *  template< typename ForwardIterator_T > inline void distribute( const Vector3<real_t> & position, ForwardIterator_T distributeValueBegin )
@@ -58,7 +58,7 @@ class DistributorHandling : public blockforest::AlwaysInitializeBlockDataHandlin
 {
 public:
 
-   DistributorHandling( const shared_ptr<StructuredBlockStorage> & blockStorage,
+   DistributorHandling( const weak_ptr<StructuredBlockStorage> & blockStorage,
                         const BlockDataID & distributionDestinationFieldID,
                         const ConstBlockDataID & flagFieldID,
                         const Set< FlagUID > & cellsToEvaluate ) :
@@ -82,7 +82,7 @@ public:
 
 private:
 
-   shared_ptr<StructuredBlockStorage> blockStorage_;
+   weak_ptr<StructuredBlockStorage> blockStorage_;
    BlockDataID distributionDestinationFieldID_;
    ConstBlockDataID flagFieldID_;
    Set< FlagUID > cellsToEvaluate_;
diff --git a/src/field/distributors/KernelDistributor.h b/src/field/distributors/KernelDistributor.h
index e08369330..dd94e2b20 100644
--- a/src/field/distributors/KernelDistributor.h
+++ b/src/field/distributors/KernelDistributor.h
@@ -54,7 +54,7 @@ public:
    typedef typename FlagField_T::flag_t           flag_t;
    typedef KernelDistributor<Field_T,FlagField_T> OwnType;
 
-   KernelDistributor( const shared_ptr<StructuredBlockStorage> & blockStorage, const IBlock & block,
+   KernelDistributor( const weak_ptr<StructuredBlockStorage> & blockStorage, const IBlock & block,
                       BaseField_T & baseField, const FlagField_T & flagField,
                       const flag_t & evaluationMask )
    : blockStorage_( blockStorage ), block_( block ), baseField_( baseField ), flagField_( flagField ), evaluationMask_( evaluationMask )
@@ -76,11 +76,14 @@ public:
       WALBERLA_ASSERT(block_.getAABB().contains(x,y,z),
                       "Distribution position <" << x << ", " << y << ", " << z << "> is not contained inside the block of this distributor with AABB " << block_.getAABB() << " !");
 
-      Cell centerCell = blockStorage_->getBlockLocalCell( block_, x, y, z );
+      WALBERLA_CHECK( !blockStorage_.expired() );
+      auto blockStorage = blockStorage_.lock();
 
-      const real_t dx = blockStorage_->dx( blockStorage_->getLevel( block_ ) );
-      const real_t dy = blockStorage_->dy( blockStorage_->getLevel( block_ ) );
-      const real_t dz = blockStorage_->dz( blockStorage_->getLevel( block_ ) );
+      Cell centerCell = blockStorage->getBlockLocalCell( block_, x, y, z );
+
+      const real_t dx = blockStorage->dx( blockStorage->getLevel( block_ ) );
+      const real_t dy = blockStorage->dy( blockStorage->getLevel( block_ ) );
+      const real_t dz = blockStorage->dz( blockStorage->getLevel( block_ ) );
       
       const uint_t neighborhoodSize = cell_idx_t(1);
 
@@ -97,7 +100,7 @@ public:
       // get distribution weights and count available cells in surrounding cells
       for( auto cellIt = cellNeighborhood.begin(); cellIt != cellNeighborhood.end(); ++cellIt )
       {
-         Vector3<real_t> curCellCenter = blockStorage_->getBlockLocalCellCenter( block_, *cellIt );
+         Vector3<real_t> curCellCenter = blockStorage->getBlockLocalCellCenter( block_, *cellIt );
          if( flagField_.isPartOfMaskSet( *cellIt, evaluationMask_ ) )
          {
             weights[counter] = kernelweights::kernelWeightFunction( x, y, z, curCellCenter[0], curCellCenter[1], curCellCenter[2], dx, dy, dz );
@@ -142,7 +145,7 @@ private:
       }
    }
 
-   shared_ptr<StructuredBlockStorage> blockStorage_;
+   weak_ptr<StructuredBlockStorage> blockStorage_;
    const IBlock & block_;
    BaseField_T & baseField_;
    const FlagField_T & flagField_;
diff --git a/src/field/distributors/NearestNeighborDistributor.h b/src/field/distributors/NearestNeighborDistributor.h
index 7c8f57092..a07ea9134 100644
--- a/src/field/distributors/NearestNeighborDistributor.h
+++ b/src/field/distributors/NearestNeighborDistributor.h
@@ -53,7 +53,7 @@ public:
    typedef typename FlagField_T::flag_t                    flag_t;
    typedef NearestNeighborDistributor<Field_T,FlagField_T> OwnType;
 
-   NearestNeighborDistributor( const shared_ptr<StructuredBlockStorage> & blockStorage, const IBlock & block,
+   NearestNeighborDistributor( const weak_ptr<StructuredBlockStorage> & blockStorage, const IBlock & block,
                                BaseField_T & baseField, const FlagField_T & flagField,
                                const flag_t & evaluationMask )
    : blockStorage_( blockStorage ), block_( block ), baseField_( baseField ), flagField_( flagField ), evaluationMask_( evaluationMask )
@@ -73,7 +73,10 @@ public:
       WALBERLA_ASSERT(block_.getAABB().contains(x,y,z),
                       "Distribution position <" << x << ", " << y << ", " << z << "> is not contained inside the block of this distributor with AABB " << block_.getAABB() << " !");
 
-      Cell nearestCell = blockStorage_->getBlockLocalCell( block_, x, y, z );
+      WALBERLA_CHECK( !blockStorage_.expired() );
+      auto blockStorage = blockStorage_.lock();
+
+      Cell nearestCell = blockStorage->getBlockLocalCell( block_, x, y, z );
 
       if( flagField_.isPartOfMaskSet( nearestCell, evaluationMask_ ) )
       {
@@ -90,7 +93,7 @@ public:
 
          CellInterval fieldXYZSize = baseField_.xyzSize();
 
-         Vector3<real_t> nearestCellCenter = blockStorage_->getBlockLocalCellCenter( block_, nearestCell );
+         Vector3<real_t> nearestCellCenter = blockStorage->getBlockLocalCellCenter( block_, nearestCell );
          const cell_idx_t xNeighbor = cell_idx_c( floor( x - nearestCellCenter[0] ) );
          const cell_idx_t yNeighbor = cell_idx_c( floor( y - nearestCellCenter[1] ) );
          const cell_idx_t zNeighbor = cell_idx_c( floor( z - nearestCellCenter[2] ) );
@@ -126,7 +129,7 @@ public:
 
 private:
 
-   shared_ptr<StructuredBlockStorage> blockStorage_;
+   weak_ptr<StructuredBlockStorage> blockStorage_;
    const IBlock & block_;
    BaseField_T & baseField_;
    const FlagField_T & flagField_;
diff --git a/src/field/interpolators/FieldInterpolatorCreators.h b/src/field/interpolators/FieldInterpolatorCreators.h
index 9b7c4f656..560df7879 100644
--- a/src/field/interpolators/FieldInterpolatorCreators.h
+++ b/src/field/interpolators/FieldInterpolatorCreators.h
@@ -37,7 +37,7 @@ namespace field {
  * \ingroup field
  *
  * Interpolator_T: A field interpolator that has a constructor
- *  ( const shared_ptr<StructuredBlockStorage> & blockStorage, const IBlock & block, const BaseField_T & baseField,
+ *  ( const weak_ptr<StructuredBlockStorage> & blockStorage, const IBlock & block, const BaseField_T & baseField,
  *    const FlagField_T & flagField, const flag_t & evaluationMask )
  * and getter functions:
  *  template< typename ForwardIterator_T > inline void get( const Vector3<real_t> & position, ForwardIterator_T interpolationResultBegin )
@@ -57,7 +57,7 @@ class InterpolatorHandling : public blockforest::AlwaysInitializeBlockDataHandli
 {
 public:
 
-   InterpolatorHandling( const shared_ptr<StructuredBlockStorage> & blockStorage,
+   InterpolatorHandling( const weak_ptr<StructuredBlockStorage> & blockStorage,
                          const ConstBlockDataID & interpolatedFieldID,
                          const ConstBlockDataID & flagFieldID,
                          const Set< FlagUID > & cellsToEvaluate ) :
@@ -81,7 +81,7 @@ public:
 
 private:
 
-   shared_ptr<StructuredBlockStorage> blockStorage_;
+   weak_ptr<StructuredBlockStorage> blockStorage_;
    ConstBlockDataID interpolatedFieldID_;
    ConstBlockDataID flagFieldID_;
    Set< FlagUID > cellsToEvaluate_;
diff --git a/src/field/interpolators/KernelFieldInterpolator.h b/src/field/interpolators/KernelFieldInterpolator.h
index 8e22b1660..ba40eecdb 100644
--- a/src/field/interpolators/KernelFieldInterpolator.h
+++ b/src/field/interpolators/KernelFieldInterpolator.h
@@ -96,7 +96,7 @@ public:
    typedef typename FlagField_T::flag_t                 flag_t;
    typedef KernelFieldInterpolator<Field_T,FlagField_T> OwnType;
 
-   KernelFieldInterpolator( const shared_ptr<StructuredBlockStorage> & blockStorage, const IBlock & block,
+   KernelFieldInterpolator( const weak_ptr<StructuredBlockStorage> & blockStorage, const IBlock & block,
                             const BaseField_T & baseField, const FlagField_T & flagField,
                             const flag_t & evaluationMask )
    : blockStorage_( blockStorage ), block_( block ), baseField_( baseField ), flagField_( flagField ), evaluationMask_( evaluationMask )
@@ -116,14 +116,18 @@ public:
    template< typename ForwardIterator_T >
    inline void get( const real_t & x, const real_t & y, const real_t & z, ForwardIterator_T interpolationResultBegin )
    {
+
       WALBERLA_ASSERT(block_.getAABB().contains(x,y,z),
                       "Interpolation position <" << x << ", " << y << ", " << z << "> is not contained inside the block of this interpolator with AABB " << block_.getAABB() << " !");
 
-      Cell centerCell = blockStorage_->getBlockLocalCell( block_, x, y, z );
+      WALBERLA_CHECK( !blockStorage_.expired() );
+      auto blockStorage = blockStorage_.lock();
+
+      Cell centerCell = blockStorage->getBlockLocalCell( block_, x, y, z );
 
-      const real_t dx = blockStorage_->dx( blockStorage_->getLevel( block_ ) );
-      const real_t dy = blockStorage_->dy( blockStorage_->getLevel( block_ ) );
-      const real_t dz = blockStorage_->dz( blockStorage_->getLevel( block_ ) );
+      const real_t dx = blockStorage->dx( blockStorage->getLevel( block_ ) );
+      const real_t dy = blockStorage->dy( blockStorage->getLevel( block_ ) );
+      const real_t dz = blockStorage->dz( blockStorage->getLevel( block_ ) );
 
       const uint_t neighborhoodSize = uint_t(1);
 
@@ -142,7 +146,7 @@ public:
       cell_idx_t cellIdx0z = cellNeighborhood.zMin();
       uint_t nx = kernelSizeOneDirection;
       uint_t nxy = kernelSizeOneDirection * kernelSizeOneDirection;
-      Vector3<real_t> cellCenter0 = blockStorage_->getBlockLocalCellCenter( block_, Cell(cellIdx0x, cellIdx0y, cellIdx0z) ); // = cell in neighborhood with smallest x-, y-, and z-indices
+      Vector3<real_t> cellCenter0 = blockStorage->getBlockLocalCellCenter( block_, Cell(cellIdx0x, cellIdx0y, cellIdx0z) ); // = cell in neighborhood with smallest x-, y-, and z-indices
 
       // calculate kernel weights of all cells in neighborhood
       for( uint_t k = uint_t(0); k < kernelSizeOneDirection; ++k)
@@ -256,7 +260,7 @@ private:
       }
    }
 
-   shared_ptr<StructuredBlockStorage> blockStorage_;
+   weak_ptr<StructuredBlockStorage> blockStorage_;
    const IBlock & block_;
    const BaseField_T & baseField_;
    const FlagField_T & flagField_;
diff --git a/src/field/interpolators/NearestNeighborFieldInterpolator.h b/src/field/interpolators/NearestNeighborFieldInterpolator.h
index 677310feb..716d4021c 100644
--- a/src/field/interpolators/NearestNeighborFieldInterpolator.h
+++ b/src/field/interpolators/NearestNeighborFieldInterpolator.h
@@ -50,7 +50,7 @@ public:
    typedef typename FlagField_T::flag_t                          flag_t;
    typedef NearestNeighborFieldInterpolator<Field_T,FlagField_T> OwnType;
 
-   NearestNeighborFieldInterpolator( const shared_ptr<StructuredBlockStorage> & blockStorage, const IBlock & block,
+   NearestNeighborFieldInterpolator( const weak_ptr<StructuredBlockStorage> & blockStorage, const IBlock & block,
                                      const BaseField_T & baseField, const FlagField_T & flagField,
                                      const flag_t & evaluationMask )
    : blockStorage_( blockStorage ), block_( block ), baseField_( baseField ), flagField_( flagField ), evaluationMask_( evaluationMask )
@@ -72,7 +72,10 @@ public:
       WALBERLA_ASSERT(block_.getAABB().contains(x,y,z),
                       "Interpolation position <" << x << ", " << y << ", " << z << "> is not contained inside the block of this interpolator with AABB " << block_.getAABB() << " !");
 
-      Cell nearestCell = blockStorage_->getBlockLocalCell( block_, x, y, z );
+      WALBERLA_CHECK( !blockStorage_.expired() );
+      auto blockStorage = blockStorage_.lock();
+
+      Cell nearestCell = blockStorage->getBlockLocalCell( block_, x, y, z );
 
       if( flagField_.isPartOfMaskSet( nearestCell, evaluationMask_ ) )
       {
@@ -89,7 +92,7 @@ public:
 
          CellInterval fieldXYZSize = baseField_.xyzSize();
 
-         Vector3<real_t> nearestCellCenter = blockStorage_->getBlockLocalCellCenter( block_, nearestCell );
+         Vector3<real_t> nearestCellCenter = blockStorage->getBlockLocalCellCenter( block_, nearestCell );
          const cell_idx_t xNeighbor = cell_idx_c( floor( x - nearestCellCenter[0] ) );
          const cell_idx_t yNeighbor = cell_idx_c( floor( y - nearestCellCenter[1] ) );
          const cell_idx_t zNeighbor = cell_idx_c( floor( z - nearestCellCenter[2] ) );
@@ -128,7 +131,7 @@ public:
 
 private:
 
-   shared_ptr<StructuredBlockStorage> blockStorage_;
+   weak_ptr<StructuredBlockStorage> blockStorage_;
    const IBlock & block_;
    const BaseField_T & baseField_;
    const FlagField_T & flagField_;
diff --git a/src/field/interpolators/TrilinearFieldInterpolator.h b/src/field/interpolators/TrilinearFieldInterpolator.h
index 4a878381c..e14a36fb1 100644
--- a/src/field/interpolators/TrilinearFieldInterpolator.h
+++ b/src/field/interpolators/TrilinearFieldInterpolator.h
@@ -52,7 +52,7 @@ public:
    typedef typename FlagField_T::flag_t                    flag_t;
    typedef TrilinearFieldInterpolator<Field_T,FlagField_T> OwnType;
 
-   TrilinearFieldInterpolator( const shared_ptr<StructuredBlockStorage> & blockStorage, const IBlock & block,
+   TrilinearFieldInterpolator( const weak_ptr<StructuredBlockStorage> & blockStorage, const IBlock & block,
                                const BaseField_T & baseField, const FlagField_T & flagField,
                                const flag_t & evaluationMask )
    : blockStorage_( blockStorage ), block_( block ), baseField_( baseField ), flagField_( flagField ), evaluationMask_( evaluationMask ),
@@ -76,12 +76,15 @@ public:
       WALBERLA_ASSERT(block_.getAABB().contains(x,y,z),
                       "Interpolation position <" << x << ", " << y << ", " << z << "> is not contained inside the block of this interpolator with AABB " << block_.getAABB() << " !");
 
-      const real_t dx = blockStorage_->dx( blockStorage_->getLevel( block_ ) );
-      const real_t dy = blockStorage_->dy( blockStorage_->getLevel( block_ ) );
-      const real_t dz = blockStorage_->dz( blockStorage_->getLevel( block_ ) );
+      WALBERLA_CHECK( !blockStorage_.expired() );
+      auto blockStorage = blockStorage_.lock();
 
-      Cell containingCell = blockStorage_->getBlockLocalCell( block_, x, y, z );
-      Vector3<real_t> containingCellCenter = blockStorage_->getBlockLocalCellCenter( block_, containingCell );
+      const real_t dx = blockStorage->dx( blockStorage->getLevel( block_ ) );
+      const real_t dy = blockStorage->dy( blockStorage->getLevel( block_ ) );
+      const real_t dz = blockStorage->dz( blockStorage->getLevel( block_ ) );
+
+      Cell containingCell = blockStorage->getBlockLocalCell( block_, x, y, z );
+      Vector3<real_t> containingCellCenter = blockStorage->getBlockLocalCellCenter( block_, containingCell );
 
       const cell_idx_t xNeighbor1 = cell_idx_c( floor( x - containingCellCenter[0] ) );
       const cell_idx_t xNeighbor2 = xNeighbor1 + cell_idx_t(1);
@@ -114,7 +117,7 @@ public:
          // trilinear interpolation can be applied
 
          const real_t inv_totalVolume = real_t(1) / ( dx * dy * dz );
-         Vector3<real_t> cccCellCenter = blockStorage_->getBlockLocalCellCenter( block_, ccc );
+         Vector3<real_t> cccCellCenter = blockStorage->getBlockLocalCellCenter( block_, ccc );
 
          // weighting = volume of opposing volume element / total volume
          real_t weighting(0.0);
@@ -173,7 +176,7 @@ private:
       }
    }
 
-   shared_ptr<StructuredBlockStorage> blockStorage_;
+   weak_ptr<StructuredBlockStorage> blockStorage_;
    const IBlock & block_;
    const BaseField_T & baseField_;
    const FlagField_T & flagField_;
-- 
GitLab