121 if (params_.extrusionFactorOutput_) {
124 if (params_.pressureOutput_) {
127 if (params_.densityOutput_) {
130 if (params_.saturationOutput_) {
133 if (params_.mobilityOutput_) {
136 if (params_.relativePermeabilityOutput_) {
139 if (params_.viscosityOutput_) {
142 if (params_.averageMolarMassOutput_) {
146 if (params_.porosityOutput_) {
149 if (params_.intrinsicPermeabilityOutput_) {
153 if (params_.velocityOutput_) {
154 const std::size_t nDof = this->simulator_.model().numGridDof();
155 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++ phaseIdx) {
156 velocity_[phaseIdx].resize(nDof);
157 for (
unsigned dofIdx = 0; dofIdx < nDof; ++ dofIdx) {
158 velocity_[phaseIdx][dofIdx].resize(dimWorld);
159 velocity_[phaseIdx][dofIdx] = 0.0;
165 if (params_.potentialGradientOutput_) {
166 const std::size_t nDof = this->simulator_.model().numGridDof();
167 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++ phaseIdx) {
168 potentialGradient_[phaseIdx].resize(nDof);
169 for (
unsigned dofIdx = 0; dofIdx < nDof; ++ dofIdx) {
170 potentialGradient_[phaseIdx][dofIdx].resize(dimWorld);
171 potentialGradient_[phaseIdx][dofIdx] = 0.0;
189 const auto& problem = elemCtx.problem();
190 for (
unsigned i = 0; i < elemCtx.numPrimaryDof(0); ++i) {
191 const unsigned I = elemCtx.globalSpaceIndex(i, 0);
192 const auto& intQuants = elemCtx.intensiveQuantities(i, 0);
193 const auto& fs = intQuants.fluidState();
195 if (params_.extrusionFactorOutput_) {
196 extrusionFactor_[I] = intQuants.extrusionFactor();
198 if (params_.porosityOutput_) {
199 porosity_[I] = getValue(intQuants.porosity());
202 if (params_.intrinsicPermeabilityOutput_) {
203 const auto& K = problem.intrinsicPermeability(elemCtx, i, 0);
204 for (
unsigned rowIdx = 0; rowIdx < K.rows; ++rowIdx) {
205 for (
unsigned colIdx = 0; colIdx < K.cols; ++colIdx) {
206 intrinsicPermeability_[I][rowIdx][colIdx] = K[rowIdx][colIdx];
211 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
212 if (!FluidSystem::phaseIsActive(phaseIdx)) {
215 if (params_.pressureOutput_) {
216 pressure_[phaseIdx][I] = getValue(fs.pressure(phaseIdx));
218 if (params_.densityOutput_) {
219 density_[phaseIdx][I] = getValue(fs.density(phaseIdx));
221 if (params_.saturationOutput_) {
222 saturation_[phaseIdx][I] = getValue(fs.saturation(phaseIdx));
224 if (params_.mobilityOutput_) {
225 mobility_[phaseIdx][I] = getValue(intQuants.mobility(phaseIdx));
227 if (params_.relativePermeabilityOutput_) {
228 relativePermeability_[phaseIdx][I] = getValue(intQuants.relativePermeability(phaseIdx));
230 if (params_.viscosityOutput_) {
231 viscosity_[phaseIdx][I] = getValue(fs.viscosity(phaseIdx));
233 if (params_.averageMolarMassOutput_) {
234 averageMolarMass_[phaseIdx][I] = getValue(fs.averageMolarMass(phaseIdx));
239 if (params_.potentialGradientOutput_) {
241 for (
unsigned faceIdx = 0; faceIdx < elemCtx.numInteriorFaces(0); ++faceIdx) {
242 const auto& extQuants = elemCtx.extensiveQuantities(faceIdx, 0);
244 const unsigned i = extQuants.interiorIndex();
245 const unsigned I = elemCtx.globalSpaceIndex(i, 0);
247 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
248 const Scalar weight = extQuants.extrusionFactor();
250 potentialWeight_[phaseIdx][I] += weight;
252 const auto& inputPGrad = extQuants.potentialGrad(phaseIdx);
254 for (
unsigned dimIdx = 0; dimIdx < dimWorld; ++dimIdx) {
255 pGrad[dimIdx] = getValue(inputPGrad[dimIdx]) * weight;
257 potentialGradient_[phaseIdx][I] += pGrad;
262 if (params_.velocityOutput_) {
264 for (
unsigned faceIdx = 0; faceIdx < elemCtx.numInteriorFaces(0); ++faceIdx) {
265 const auto& extQuants = elemCtx.extensiveQuantities(faceIdx, 0);
267 const unsigned i = extQuants.interiorIndex();
268 const unsigned I = elemCtx.globalSpaceIndex(i, 0);
270 const unsigned j = extQuants.exteriorIndex();
271 const unsigned J = elemCtx.globalSpaceIndex(j, 0);
273 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
274 Scalar weight = std::max(Scalar{1e-16},
275 std::abs(getValue(extQuants.volumeFlux(phaseIdx))));
276 Valgrind::CheckDefined(extQuants.extrusionFactor());
277 assert(extQuants.extrusionFactor() > 0);
278 weight *= extQuants.extrusionFactor();
280 const auto& inputV = extQuants.filterVelocity(phaseIdx);
282 for (
unsigned k = 0; k < dimWorld; ++k) {
283 v[k] = getValue(inputV[k]);
285 if (v.two_norm() > 1e-20) {
286 weight /= v.two_norm();
290 velocity_[phaseIdx][I] += v;
291 velocity_[phaseIdx][J] += v;
293 velocityWeight_[phaseIdx][I] += weight;
294 velocityWeight_[phaseIdx][J] += weight;
305 if (!
dynamic_cast<VtkMultiWriter*
>(&baseWriter)) {
309 if (params_.extrusionFactorOutput_) {
311 extrusionFactor_, BufferType::Dof);
313 if (params_.pressureOutput_) {
316 if (params_.densityOutput_) {
319 if (params_.saturationOutput_) {
322 if (params_.mobilityOutput_) {
325 if (params_.relativePermeabilityOutput_) {
327 relativePermeability_, BufferType::Dof);
329 if (params_.viscosityOutput_) {
332 if (params_.averageMolarMassOutput_) {
334 averageMolarMass_, BufferType::Dof);
337 if (params_.porosityOutput_) {
340 if (params_.intrinsicPermeabilityOutput_) {
342 intrinsicPermeability_, BufferType::Dof);
345 if (params_.velocityOutput_) {
346 const std::size_t numDof = this->simulator_.model().numGridDof();
347 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
350 for (
unsigned i = 0; i < numDof; ++i) {
351 velocity_[phaseIdx][i] /= velocityWeight_[phaseIdx][i];
355 snprintf(name, 512,
"filterVelocity_%s", FluidSystem::phaseName(phaseIdx).data());
357 DiscBaseOutputModule::attachVectorDofData_(baseWriter, velocity_[phaseIdx], name);
361 if (params_.potentialGradientOutput_) {
362 const std::size_t numDof = this->simulator_.model().numGridDof();
363 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
366 for (
unsigned i = 0; i < numDof; ++i) {
367 potentialGradient_[phaseIdx][i] /= potentialWeight_[phaseIdx][i];
371 snprintf(name, 512,
"gradP_%s", FluidSystem::phaseName(phaseIdx).data());
373 DiscBaseOutputModule::attachVectorDofData_(baseWriter,
374 potentialGradient_[phaseIdx],