67 : gridGeometry_(gridGeometry)
68 , refineBound_(std::numeric_limits<Scalar>::max())
69 , coarsenBound_(std::numeric_limits<Scalar>::lowest())
70 , maxSaturationDelta_(gridGeometry_->gridView().size(0), 0.0)
117 Scalar refineTol = 0.05,
118 Scalar coarsenTol = 0.001)
121 refineBound_ = std::numeric_limits<Scalar>::max();
122 coarsenBound_ = std::numeric_limits<Scalar>::lowest();
123 maxSaturationDelta_.assign(gridGeometry_->gridView().size(0), 0.0);
126 if (minLevel_ >= maxLevel_)
130 if (coarsenTol > refineTol)
131 DUNE_THROW(Dune::InvalidStateException,
"Refine tolerance must be higher than coarsen tolerance");
134 Scalar globalMax = std::numeric_limits<Scalar>::lowest();
135 Scalar globalMin = std::numeric_limits<Scalar>::max();
138 for (
const auto& element : elements(gridGeometry_->gridView()))
141 const auto globalIdxI = gridGeometry_->elementMapper().index(element);
144 const auto geometry = element.geometry();
146 const Scalar satI =
evalSolution(element, geometry, *gridGeometry_, elemSol, geometry.center())[saturationIdx];
151 globalMin = min(satI, globalMin);
152 globalMax = max(satI, globalMax);
155 for (
const auto& intersection : intersections(gridGeometry_->gridView(), element))
158 if (intersection.neighbor())
161 const auto outside = intersection.outside();
162 const auto globalIdxJ = gridGeometry_->elementMapper().index(outside);
165 if (element.level() > outside.level() || (element.level() == outside.level() && globalIdxI < globalIdxJ))
168 const auto outsideGeometry = outside.geometry();
170 const Scalar satJ =
evalSolution(outside, outsideGeometry, *gridGeometry_, elemSolJ, outsideGeometry.center())[saturationIdx];
173 Scalar localdelta = abs(satI - satJ);
174 maxSaturationDelta_[globalIdxI] = max(maxSaturationDelta_[globalIdxI], localdelta);
175 maxSaturationDelta_[globalIdxJ] = max(maxSaturationDelta_[globalIdxJ], localdelta);
182 const auto globalDelta = globalMax - globalMin;
185 refineBound_ = refineTol*globalDelta;
186 coarsenBound_ = coarsenTol*globalDelta;
204 for (
const auto& element : elements(gridGeometry_->gridView(), Dune::Partitions::interior))
205 if (this->
operator()(element) > 0)
206 checkNeighborsRefine_(element);