55 : gridGeometry_(gridGeometry)
56 , refineBound_(std::numeric_limits<Scalar>::max())
57 , coarsenBound_(std::numeric_limits<Scalar>::lowest())
58 , maxSaturationDelta_(gridGeometry_->gridView().size(0), 0.0)
105 Scalar refineTol = 0.05,
106 Scalar coarsenTol = 0.001)
109 refineBound_ = std::numeric_limits<Scalar>::max();
110 coarsenBound_ = std::numeric_limits<Scalar>::lowest();
111 maxSaturationDelta_.assign(gridGeometry_->gridView().size(0), 0.0);
114 if (minLevel_ >= maxLevel_)
118 if (coarsenTol > refineTol)
119 DUNE_THROW(Dune::InvalidStateException,
"Refine tolerance must be higher than coarsen tolerance");
122 Scalar globalMax = std::numeric_limits<Scalar>::lowest();
123 Scalar globalMin = std::numeric_limits<Scalar>::max();
126 for (
const auto& element : elements(gridGeometry_->gridView()))
129 const auto globalIdxI = gridGeometry_->elementMapper().index(element);
132 const auto geometry = element.geometry();
134 const Scalar satI =
evalSolution(element, geometry, *gridGeometry_, elemSol, geometry.center())[saturationIdx];
139 globalMin = min(satI, globalMin);
140 globalMax = max(satI, globalMax);
143 for (
const auto& intersection : intersections(gridGeometry_->gridView(), element))
146 if (intersection.neighbor())
149 const auto outside = intersection.outside();
150 const auto globalIdxJ = gridGeometry_->elementMapper().index(outside);
153 if (element.level() > outside.level() || (element.level() == outside.level() && globalIdxI < globalIdxJ))
156 const auto outsideGeometry = outside.geometry();
158 const Scalar satJ =
evalSolution(outside, outsideGeometry, *gridGeometry_, elemSolJ, outsideGeometry.center())[saturationIdx];
161 Scalar localdelta = abs(satI - satJ);
162 maxSaturationDelta_[globalIdxI] = max(maxSaturationDelta_[globalIdxI], localdelta);
163 maxSaturationDelta_[globalIdxJ] = max(maxSaturationDelta_[globalIdxJ], localdelta);
170 const auto globalDelta = globalMax - globalMin;
173 refineBound_ = refineTol*globalDelta;
174 coarsenBound_ = coarsenTol*globalDelta;
192 for (
const auto& element : elements(gridGeometry_->gridView(), Dune::Partitions::interior))
193 if (this->
operator()(element) > 0)
194 checkNeighborsRefine_(element);