138 adaptionMap_.resize();
140 const auto& grid = gridGeometry_->gridView().grid();
141 for (
auto level = grid.maxLevel(); level >= 0; level--)
143 for (
const auto& element : elements(grid.levelGridView(level)))
146 auto& adaptedValues = adaptionMap_[element];
149 if (element.isLeaf())
151 auto fvGeometry =
localView(*gridGeometry_);
152 fvGeometry.bindElement(element);
155 adaptedValues.u = ElementSolution(element, sol_, *gridGeometry_);
158 for (
const auto& scv : scvs(fvGeometry))
160 VolumeVariables volVars;
161 volVars.update(adaptedValues.u, *problem_, element, scv);
163 const auto poreVolume = scv.volume()*volVars.porosity();
164 adaptedValues.associatedMass[phase1Idx] += poreVolume * volVars.density(phase1Idx) * volVars.saturation(phase1Idx);
165 adaptedValues.associatedMass[phase0Idx] += poreVolume * volVars.density(phase0Idx) * volVars.saturation(phase0Idx);
169 adaptedValues.count = 1;
170 adaptedValues.wasLeaf =
true;
173 if (element.level() > 0)
175 auto& adaptedValuesFather = adaptionMap_[element.father()];
178 if(&adaptedValues != &adaptedValuesFather)
179 storeAdaptionValues(adaptedValues, adaptedValuesFather);
185 if(isBox && !element.isLeaf())
186 adaptedValues.u = ElementSolution(element, sol_, *gridGeometry_);
205 adaptionMap_.resize();
206 gridGeometry_->update();
207 sol_.resize(gridGeometry_->numDofs());
210 std::vector<Scalar> massCoeff;
211 std::vector<Scalar> associatedMass;
215 massCoeff.resize(gridGeometry_->numDofs(), 0.0);
216 associatedMass.resize(gridGeometry_->numDofs(), 0.0);
220 for (
const auto& element : elements(gridGeometry_->gridView().grid().leafGridView(), Dune::Partitions::interior))
222 if (!element.isNew())
224 const auto& adaptedValues = adaptionMap_[element];
226 auto fvGeometry =
localView(*gridGeometry_);
227 fvGeometry.bindElement(element);
230 auto elemSol = adaptedValues.u;
232 elemSol[0] /= adaptedValues.count;
234 const auto elementVolume = element.geometry().volume();
235 for (
const auto& scv : scvs(fvGeometry))
237 VolumeVariables volVars;
238 volVars.update(elemSol, *problem_, element, scv);
241 sol_[scv.dofIndex()] = elemSol[scv.localDofIndex()];
243 const auto dofIdxGlobal = scv.dofIndex();
248 if (!adaptedValues.wasLeaf)
250 if (formulation == p0s1)
252 sol_[dofIdxGlobal][saturationIdx] = adaptedValues.associatedMass[phase1Idx];
253 sol_[dofIdxGlobal][saturationIdx] /= elementVolume * volVars.density(phase1Idx) * volVars.porosity();
255 else if (formulation == p1s0)
257 sol_[dofIdxGlobal][saturationIdx] = adaptedValues.associatedMass[phase0Idx];
258 sol_[dofIdxGlobal][saturationIdx] /= elementVolume * volVars.density(phase0Idx) * volVars.porosity();
266 const auto scvVolume = scv.volume();
267 if (formulation == p0s1)
269 massCoeff[dofIdxGlobal] += scvVolume * volVars.density(phase1Idx) * volVars.porosity();
270 associatedMass[dofIdxGlobal] += scvVolume / elementVolume * adaptedValues.associatedMass[phase1Idx];
272 else if (formulation == p1s0)
274 massCoeff[dofIdxGlobal] += scvVolume * volVars.density(phase0Idx) * volVars.porosity();
275 associatedMass[dofIdxGlobal] += scvVolume / elementVolume * adaptedValues.associatedMass[phase0Idx];
283 assert(element.hasFather() &&
"new element does not have a father element!");
286 auto fatherElement = element.father();
287 while(fatherElement.isNew() && fatherElement.level() > 0)
288 fatherElement = fatherElement.father();
292 const auto& adaptedValuesFather = adaptionMap_[fatherElement];
295 Scalar massFather = 0.0;
296 if (formulation == p0s1)
297 massFather = adaptedValuesFather.associatedMass[phase1Idx];
298 else if (formulation == p1s0)
299 massFather = adaptedValuesFather.associatedMass[phase0Idx];
302 auto elemSolSon = adaptedValuesFather.u;
303 elemSolSon[0] /= adaptedValuesFather.count;
305 auto fvGeometry =
localView(*gridGeometry_);
306 fvGeometry.bindElement(element);
308 for (
const auto& scv : scvs(fvGeometry))
310 VolumeVariables volVars;
311 volVars.update(elemSolSon, *problem_, element, scv);
314 sol_[scv.dofIndex()] = elemSolSon[0];
317 Scalar massCoeffSon = 0.0;
318 if (formulation == p0s1)
319 massCoeffSon = scv.volume() * volVars.density(phase1Idx) * volVars.porosity();
320 else if (formulation == p1s0)
321 massCoeffSon = scv.volume() * volVars.density(phase0Idx) * volVars.porosity();
322 sol_[scv.dofIndex()][saturationIdx] = (scv.volume() / fatherElement.geometry().volume() * massFather)/massCoeffSon;
327 auto& adaptedValuesFather = adaptionMap_[fatherElement];
329 auto fvGeometry =
localView(*gridGeometry_);
330 fvGeometry.bindElement(element);
333 ElementSolution elemSolSon(element, sol_, *gridGeometry_);
334 const auto fatherGeometry = fatherElement.geometry();
335 for (
const auto& scv : scvs(fvGeometry))
336 elemSolSon[scv.localDofIndex()] =
evalSolution(fatherElement,
338 adaptedValuesFather.u,
342 const auto fatherElementVolume = fatherGeometry.volume();
343 for (
const auto& scv : scvs(fvGeometry))
345 VolumeVariables volVars;
346 volVars.update(elemSolSon, *problem_, element, scv);
348 const auto dofIdxGlobal = scv.dofIndex();
349 const auto scvVolume = scv.volume();
350 if (formulation == p0s1)
352 massCoeff[dofIdxGlobal] += scvVolume * volVars.density(phase1Idx) * volVars.porosity();
353 associatedMass[dofIdxGlobal] += scvVolume / fatherElementVolume * adaptedValuesFather.associatedMass[phase1Idx];
355 else if (formulation == p1s0)
357 massCoeff[dofIdxGlobal] += scvVolume * volVars.density(phase0Idx) * volVars.porosity();
358 associatedMass[dofIdxGlobal] += scvVolume / fatherElementVolume * adaptedValuesFather.associatedMass[phase0Idx];
362 sol_[dofIdxGlobal] = elemSolSon[scv.localDofIndex()];
370 for(std::size_t dofIdxGlobal = 0; dofIdxGlobal < gridGeometry_->numDofs(); dofIdxGlobal++)
371 sol_[dofIdxGlobal][saturationIdx] = associatedMass[dofIdxGlobal] / massCoeff[dofIdxGlobal];
375 adaptionMap_.resize(
typename PersistentContainer::Value() );
376 adaptionMap_.shrinkToFit();
377 adaptionMap_.fill(
typename PersistentContainer::Value() );