75 if(indicatorVector_.size() != problem_.variables().cellDataGlobal().size())
77 indicatorVector_.resize(problem_.variables().cellDataGlobal().size());
79 indicatorVector_ = -1e100;
81 Scalar globalMax = -1e100;
82 Scalar globalMin = 1e100;
84 Scalar maxLocalDelta = 0;
88 for (
const auto& element : elements(problem_.gridView()))
92 int globalIdxI = problem_.variables().index(element);
96 PrimaryVariables source(0.0);
97 problem_.source(source, element);
98 for (
int i = 0; i < 2; i++)
101 if (abs(source[i]) > 1e-10)
103 indicatorVector_[globalIdxI] = 10;
109 if (indicatorVector_[globalIdxI] == 10)
115 switch (saturationType_)
118 satI = problem_.variables().cellData(globalIdxI).saturation(wPhaseIdx);
121 satI = problem_.variables().cellData(globalIdxI).saturation(nPhaseIdx);
126 globalMin = min(satI, globalMin);
128 globalMax = max(satI, globalMax);
131 for (
const auto& intersection : intersections(problem_.gridView(), element))
133 if (indicatorVector_[globalIdxI] == 10)
139 if (intersection.boundary())
141 BoundaryTypes bcTypes;
142 problem_.boundaryTypes(bcTypes, intersection);
144 for (
int i = 0; i < 2; i++)
146 if (bcTypes.isNeumann(i))
148 PrimaryVariables flux(0.0);
149 problem_.neumann(flux, intersection);
151 bool fluxBound =
false;
152 for (
int j = 0; j < 2; j++)
155 if (abs(flux[j]) > 1e-10)
159 indicatorVector_[globalIdxI] = 10;
168 else if (bcTypes.isDirichlet(i))
170 if (refineAtDirichletBC_)
172 indicatorVector_[globalIdxI] = 10;
181 auto outside = intersection.outside();
182 int globalIdxJ = problem_.variables().index(outside);
185 if (element.level() > outside.level()
186 || (element.level() == outside.level() && globalIdxI < globalIdxJ))
189 switch (saturationType_)
192 satJ = problem_.variables().cellData(globalIdxJ).saturation(wPhaseIdx);
195 satJ = problem_.variables().cellData(globalIdxJ).saturation(nPhaseIdx);
200 Scalar localdelta = abs(satI - satJ);
202 indicatorVector_[globalIdxI][0] = max(indicatorVector_[globalIdxI][0], localdelta);
203 indicatorVector_[globalIdxJ][0] = max(indicatorVector_[globalIdxJ][0], localdelta);
205 maxLocalDelta = max(maxLocalDelta, localdelta);
211 Scalar globaldelta = globalMax - globalMin;
213 if (maxLocalDelta > 0.)
215 indicatorVector_ /= maxLocalDelta;
217 if (globaldelta > 0.)
219 maxLocalDelta /= globaldelta;
222 refineBound_ = refinetol_*maxLocalDelta;
223 coarsenBound_ = coarsentol_*maxLocalDelta;