140 adaptionMap_.resize();
142 const auto& grid = gridGeometry_->gridView().grid();
143 for (
auto level = grid.maxLevel(); level >= 0; level--)
145 for (
const auto& element : elements(grid.levelGridView(level)))
148 auto& adaptedValues = adaptionMap_[element];
151 if (element.isLeaf())
153 auto fvGeometry =
localView(*gridGeometry_);
154 fvGeometry.bindElement(element);
157 adaptedValues.u = ElementSolution(element, sol_, *gridGeometry_);
160 for (
const auto& scv : scvs(fvGeometry))
162 VolumeVariables volVars;
163 volVars.update(adaptedValues.u, *problem_, element, scv);
165 const auto poreVolume = Extrusion::volume(scv)*volVars.porosity();
166 adaptedValues.associatedMass[phase1Idx] += poreVolume * volVars.density(phase1Idx) * volVars.saturation(phase1Idx);
167 adaptedValues.associatedMass[phase0Idx] += poreVolume * volVars.density(phase0Idx) * volVars.saturation(phase0Idx);
171 adaptedValues.count = 1;
172 adaptedValues.wasLeaf =
true;
175 if (element.level() > 0)
177 auto& adaptedValuesFather = adaptionMap_[element.father()];
180 if(&adaptedValues != &adaptedValuesFather)
181 storeAdaptionValues(adaptedValues, adaptedValuesFather);
187 if(isBox && !element.isLeaf())
188 adaptedValues.u = ElementSolution(element, sol_, *gridGeometry_);
207 adaptionMap_.resize();
208 gridGeometry_->update();
209 sol_.resize(gridGeometry_->numDofs());
212 std::vector<Scalar> massCoeff;
213 std::vector<Scalar> associatedMass;
217 massCoeff.resize(gridGeometry_->numDofs(), 0.0);
218 associatedMass.resize(gridGeometry_->numDofs(), 0.0);
222 for (
const auto& element : elements(gridGeometry_->gridView().grid().leafGridView(), Dune::Partitions::interior))
224 if (!element.isNew())
226 const auto& adaptedValues = adaptionMap_[element];
228 auto fvGeometry =
localView(*gridGeometry_);
229 fvGeometry.bindElement(element);
232 auto elemSol = adaptedValues.u;
234 elemSol[0] /= adaptedValues.count;
236 const auto elementVolume = Extrusion::volume(element.geometry());
237 for (
const auto& scv : scvs(fvGeometry))
239 VolumeVariables volVars;
240 volVars.update(elemSol, *problem_, element, scv);
243 sol_[scv.dofIndex()] = elemSol[scv.localDofIndex()];
245 const auto dofIdxGlobal = scv.dofIndex();
250 if (!adaptedValues.wasLeaf)
252 if (formulation == p0s1)
254 sol_[dofIdxGlobal][saturationIdx] = adaptedValues.associatedMass[phase1Idx];
255 sol_[dofIdxGlobal][saturationIdx] /= elementVolume * volVars.density(phase1Idx) * volVars.porosity();
257 else if (formulation == p1s0)
259 sol_[dofIdxGlobal][saturationIdx] = adaptedValues.associatedMass[phase0Idx];
260 sol_[dofIdxGlobal][saturationIdx] /= elementVolume * volVars.density(phase0Idx) * volVars.porosity();
268 const auto scvVolume = Extrusion::volume(scv);
269 if (formulation == p0s1)
271 massCoeff[dofIdxGlobal] += scvVolume * volVars.density(phase1Idx) * volVars.porosity();
272 associatedMass[dofIdxGlobal] += scvVolume / elementVolume * adaptedValues.associatedMass[phase1Idx];
274 else if (formulation == p1s0)
276 massCoeff[dofIdxGlobal] += scvVolume * volVars.density(phase0Idx) * volVars.porosity();
277 associatedMass[dofIdxGlobal] += scvVolume / elementVolume * adaptedValues.associatedMass[phase0Idx];
285 assert(element.hasFather() &&
"new element does not have a father element!");
288 auto fatherElement = element.father();
289 while(fatherElement.isNew() && fatherElement.level() > 0)
290 fatherElement = fatherElement.father();
294 const auto& adaptedValuesFather = adaptionMap_[fatherElement];
297 Scalar massFather = 0.0;
298 if (formulation == p0s1)
299 massFather = adaptedValuesFather.associatedMass[phase1Idx];
300 else if (formulation == p1s0)
301 massFather = adaptedValuesFather.associatedMass[phase0Idx];
304 auto elemSolSon = adaptedValuesFather.u;
305 elemSolSon[0] /= adaptedValuesFather.count;
307 auto fvGeometry =
localView(*gridGeometry_);
308 fvGeometry.bindElement(element);
310 for (
const auto& scv : scvs(fvGeometry))
312 VolumeVariables volVars;
313 volVars.update(elemSolSon, *problem_, element, scv);
316 sol_[scv.dofIndex()] = elemSolSon[0];
319 Scalar massCoeffSon = 0.0;
320 if (formulation == p0s1)
321 massCoeffSon = Extrusion::volume(scv) * volVars.density(phase1Idx) * volVars.porosity();
322 else if (formulation == p1s0)
323 massCoeffSon = Extrusion::volume(scv) * volVars.density(phase0Idx) * volVars.porosity();
324 sol_[scv.dofIndex()][saturationIdx] =
325 ( Extrusion::volume(scv)/Extrusion::volume(fatherElement.geometry())*massFather )/massCoeffSon;
330 auto& adaptedValuesFather = adaptionMap_[fatherElement];
332 auto fvGeometry =
localView(*gridGeometry_);
333 fvGeometry.bindElement(element);
336 ElementSolution elemSolSon(element, sol_, *gridGeometry_);
337 const auto fatherGeometry = fatherElement.geometry();
338 for (
const auto& scv : scvs(fvGeometry))
339 elemSolSon[scv.localDofIndex()] =
evalSolution(fatherElement,
341 adaptedValuesFather.u,
345 const auto fatherElementVolume = Extrusion::volume(fatherGeometry);
346 for (
const auto& scv : scvs(fvGeometry))
348 VolumeVariables volVars;
349 volVars.update(elemSolSon, *problem_, element, scv);
351 const auto dofIdxGlobal = scv.dofIndex();
352 const auto scvVolume = Extrusion::volume(scv);
353 if (formulation == p0s1)
355 massCoeff[dofIdxGlobal] += scvVolume * volVars.density(phase1Idx) * volVars.porosity();
356 associatedMass[dofIdxGlobal] += scvVolume / fatherElementVolume * adaptedValuesFather.associatedMass[phase1Idx];
358 else if (formulation == p1s0)
360 massCoeff[dofIdxGlobal] += scvVolume * volVars.density(phase0Idx) * volVars.porosity();
361 associatedMass[dofIdxGlobal] += scvVolume / fatherElementVolume * adaptedValuesFather.associatedMass[phase0Idx];
365 sol_[dofIdxGlobal] = elemSolSon[scv.localDofIndex()];
373 for(std::size_t dofIdxGlobal = 0; dofIdxGlobal < gridGeometry_->numDofs(); dofIdxGlobal++)
374 sol_[dofIdxGlobal][saturationIdx] = associatedMass[dofIdxGlobal] / massCoeff[dofIdxGlobal];
378 adaptionMap_.resize(
typename PersistentContainer::Value() );
379 adaptionMap_.shrinkToFit();
380 adaptionMap_.fill(
typename PersistentContainer::Value() );