Skip to content
Snippets Groups Projects

Let mutligridstep take over ownership of transfer operators if handed over in shared pointer

Merged akbib requested to merge multigrid_transfers_ownership into master
3 files
+ 12
18
Compare changes
  • Side-by-side
  • Inline
Files
3
@@ -16,8 +16,8 @@ preprocess()
{
// Unset the recompute bitfields, so we compute the full stiffness matrix hierarchy at the beginning
for (size_t i=0; i<this->mgTransfer_.size(); i++) {
dynamic_cast<TruncatedMGTransfer<VectorType>*>(this->mgTransfer_[i])->setRecomputeBitField(nullptr);
dynamic_cast<TruncatedMGTransfer<VectorType>*>(this->mgTransfer_[i])->setCriticalBitField(nullptr);
std::dynamic_pointer_cast<TruncatedMGTransfer<VectorType> >(this->mgTransfer_[i])->setRecomputeBitField(nullptr);
std::dynamic_pointer_cast<TruncatedMGTransfer<VectorType> >(this->mgTransfer_[i])->setCriticalBitField(nullptr);
}
// Call preprocess of the base class
@@ -40,7 +40,7 @@ preprocess()
{
recompute_[i].resize(hasObstacleHierarchy_[i]->size());
recompute_[i].unsetAll();
dynamic_cast<TruncatedMGTransfer<VectorType>*>(this->mgTransfer_[i])->setRecomputeBitField(&recompute_[i]);
std::dynamic_pointer_cast<TruncatedMGTransfer<VectorType> >(this->mgTransfer_[i])->setRecomputeBitField(&recompute_[i]);
}
oldCritical_.resize(this->numLevels());
@@ -212,12 +212,12 @@ void MonotoneMGStep<MatrixType, VectorType>::iterate()
for (int j=0; j<dim; j++)
changed[i][j] = (changed[i][j] || recompute_[level][i][j]);
dynamic_cast<TruncatedMGTransfer<VectorType>*>(this->mgTransfer_[level-1])->restrict(changed, recompute_[level-1]);
std::dynamic_pointer_cast<TruncatedMGTransfer<VectorType> >(this->mgTransfer_[level-1])->restrict(changed, recompute_[level-1]);
oldCritical_[level] = critical;
// Set bitfield of nodes that will be truncated
dynamic_cast<TruncatedMGTransfer<VectorType>*>(this->mgTransfer_[level-1])->setCriticalBitField(&critical);
std::dynamic_pointer_cast<TruncatedMGTransfer<VectorType> >(this->mgTransfer_[level-1])->setCriticalBitField(&critical);
// Restrict stiffness matrix
this->mgTransfer_[level-1]->galerkinRestrict(*(mat[level]), *(const_cast<MatrixType*>(mat[level-1].get())));
@@ -259,7 +259,7 @@ void MonotoneMGStep<MatrixType, VectorType>::iterate()
// Remove pointer to the temporary critical bitfield
// this avoids a memory problem when the same mmg step is reused
dynamic_cast<TruncatedMGTransfer<VectorType>*>(this->mgTransfer_[level-1])->setCriticalBitField(nullptr);
std::dynamic_pointer_cast<TruncatedMGTransfer<VectorType> >(this->mgTransfer_[level-1])->setCriticalBitField(nullptr);
// restore the true (non-defect) obstacles
*obstacles[level] = obstacleBackup;
Loading