57 : gridGeometry_(gridGeometry)
58 , refineBound_(std::numeric_limits<Scalar>::max())
59 , coarsenBound_(std::numeric_limits<Scalar>::lowest())
60 , maxSaturationDelta_(gridGeometry_->gridView().size(0), 0.0)
107 Scalar refineTol = 0.05,
108 Scalar coarsenTol = 0.001)
110 const auto& gridView = gridGeometry_->gridView();
113 refineBound_ = std::numeric_limits<Scalar>::max();
114 coarsenBound_ = std::numeric_limits<Scalar>::lowest();
115 maxSaturationDelta_.assign(gridView.size(0), 0.0);
118 if (minLevel_ >= maxLevel_)
122 if (coarsenTol > refineTol)
123 DUNE_THROW(Dune::InvalidStateException,
"Refine tolerance must be higher than coarsen tolerance");
126 Scalar globalMax = std::numeric_limits<Scalar>::lowest();
127 Scalar globalMin = std::numeric_limits<Scalar>::max();
130 for (
const auto& element : elements(gridView, Dune::Partitions::interior))
133 const auto globalIdxI = gridGeometry_->elementMapper().index(element);
136 const auto geometry = element.geometry();
138 const Scalar satI =
evalSolution(element, geometry, *gridGeometry_, elemSol, geometry.center())[saturationIdx];
143 globalMin = min(satI, globalMin);
144 globalMax = max(satI, globalMax);
147 for (
const auto& intersection : intersections(gridView, element))
150 if (intersection.neighbor())
153 const auto outside = intersection.outside();
154 const auto globalIdxJ = gridGeometry_->elementMapper().index(outside);
157 if (element.level() > outside.level() || (element.level() == outside.level() && globalIdxI < globalIdxJ))
160 const auto outsideGeometry = outside.geometry();
162 const Scalar satJ =
evalSolution(outside, outsideGeometry, *gridGeometry_, elemSolJ, outsideGeometry.center())[saturationIdx];
165 Scalar localdelta = abs(satI - satJ);
166 maxSaturationDelta_[globalIdxI] = max(maxSaturationDelta_[globalIdxI], localdelta);
167 maxSaturationDelta_[globalIdxJ] = max(maxSaturationDelta_[globalIdxJ], localdelta);
174 const auto globalDelta = globalMax - globalMin;
177 refineBound_ = refineTol*globalDelta;
178 coarsenBound_ = coarsenTol*globalDelta;
183 DataHandle dataHandle(gridGeometry_->elementMapper(), maxSaturationDelta_);
184 if constexpr (Dune::Capabilities::canCommunicate<typename GridGeometry::GridView::Traits::Grid, 0>::v)
185 gridView.template communicate<DataHandle>(
186 dataHandle, Dune::InteriorBorder_All_Interface, Dune::ForwardCommunication
190 Dune::InvalidStateException,
191 "Cannot call calculate indicator on grid that cannot communicate codim-0-entities."
195 refineBound_ = gridView.comm().max(refineBound_);
196 coarsenBound_ = gridView.comm().max(coarsenBound_);
200 for (
const auto& element : elements(gridView))
201 if (this->
operator()(element) > 0)
202 checkNeighborsRefine_(element);