30#ifndef EWOMS_FORCHHEIMER_FLUX_MODULE_HH
31#define EWOMS_FORCHHEIMER_FLUX_MODULE_HH
33#include <opm/common/Exceptions.hpp>
35#include <opm/material/common/Valgrind.hpp>
40#include <dune/common/fvector.hh>
41#include <dune/common/fmatrix.hh>
51template <
class TypeTag>
52class ForchheimerIntensiveQuantities;
54template <
class TypeTag>
55class ForchheimerExtensiveQuantities;
57template <
class TypeTag>
58class ForchheimerBaseProblem;
64template <
class TypeTag>
83template <
class TypeTag>
99 template <
class Context>
104 throw std::logic_error(
"Not implemented: Problem::ergunCoefficient()");
118 template <
class Context>
132template <
class TypeTag>
150 {
return ergunCoefficient_; }
156 {
return mobilityPassabilityRatio_[
phaseIdx]; }
159 void update_(
const ElementContext& elemCtx,
unsigned dofIdx,
unsigned timeIdx)
161 const auto& problem = elemCtx.problem();
162 ergunCoefficient_ = problem.ergunCoefficient(elemCtx, dofIdx,
timeIdx);
165 mobilityPassabilityRatio_[
phaseIdx] =
166 problem.mobilityPassabilityRatio(elemCtx,
174 Evaluation ergunCoefficient_;
175 std::array<Evaluation, numPhases> mobilityPassabilityRatio_;
217template <
class TypeTag>
230 enum { dimWorld = GridView::dimensionworld };
235 using DimVector = Dune::FieldVector<Scalar, dimWorld>;
236 using DimEvalVector = Dune::FieldVector<Evaluation, dimWorld>;
237 using DimMatrix = Dune::FieldMatrix<Scalar, dimWorld, dimWorld>;
238 using DimEvalMatrix = Dune::FieldMatrix<Evaluation, dimWorld, dimWorld>;
245 {
return ergunCoefficient_; }
254 {
return mobilityPassabilityRatio_[
phaseIdx]; }
257 void calculateGradients_(
const ElementContext& elemCtx,
264 const unsigned i =
static_cast<unsigned>(this->interiorDofIdx_);
265 const unsigned j =
static_cast<unsigned>(this->exteriorDofIdx_);
295 if (!elemCtx.model().phaseIsConsidered(
phaseIdx)) {
299 const unsigned upIdx =
static_cast<unsigned>(this->upstreamIndex_(
phaseIdx));
313 template <
class Flu
idState>
314 void calculateBoundaryGradients_(
const ElementContext& elemCtx,
317 const FluidState& fluidState)
325 const unsigned i =
static_cast<unsigned>(this->interiorDofIdx_);
331 ergunCoefficient_ =
intQuantsIn.ergunCoefficient();
345 if (!elemCtx.model().phaseIsConsidered(
phaseIdx)) {
355 mobilityPassabilityRatio_[
phaseIdx] =
370 const auto i = asImp_().interiorIndex();
371 const auto j = asImp_().exteriorIndex();
376 const auto& normal =
scvf.normal();
377 Valgrind::CheckDefined(normal);
382 ergunCoefficient_ = (
intQuantsI.ergunCoefficient() +
398 if (!elemCtx.model().phaseIsConsidered(
phaseIdx)) {
399 this->filterVelocity_[
phaseIdx] = 0.0;
404 calculateForchheimerFlux_(
phaseIdx);
421 const auto& boundaryFace = elemCtx.stencil(
timeIdx).boundaryFace(
bfIdx);
422 const auto& normal = boundaryFace.normal();
428 if (!elemCtx.model().phaseIsConsidered(
phaseIdx)) {
429 this->filterVelocity_[
phaseIdx] = 0.0;
434 calculateForchheimerFlux_(
phaseIdx);
444 void calculateForchheimerFlux_(
unsigned phaseIdx)
447 DimEvalVector& velocity = this->filterVelocity_[
phaseIdx];
454 DimEvalVector residual;
460 while (
deltaV.one_norm() > 1
e-11) {
463 + std::to_string(
newtonIter) +
" iterations");
476 void forchheimerResid_(DimEvalVector& residual,
unsigned phaseIdx)
const
478 const DimEvalVector& velocity = this->filterVelocity_[
phaseIdx];
481 const auto& mobility = this->mobility_[
phaseIdx];
482 const auto& density = density_[
phaseIdx];
525 Valgrind::CheckDefined(residual);
528 void gradForchheimerResid_(DimEvalVector& residual,
533 DimEvalVector& velocity = this->filterVelocity_[
phaseIdx];
534 forchheimerResid_(residual,
phaseIdx);
536 constexpr Scalar eps = 1
e-11;
538 for (
unsigned i = 0; i < dimWorld; ++i) {
539 const Scalar
coordEps = std::max(eps, Toolbox::scalarValue(velocity[i]) * (1 + eps));
558 for (
unsigned i = 0; i < dimWorld; i++) {
559 for (
unsigned j = 0; j < dimWorld; j++) {
564 if (std::abs(K[i][j]) > 1
e-25) {
573 Implementation& asImp_()
574 {
return *
static_cast<Implementation *
>(
this); }
576 const Implementation& asImp_()
const
577 {
return *
static_cast<const Implementation *
>(
this); }
584 Evaluation ergunCoefficient_;
587 std::array<Evaluation, numPhases> mobilityPassabilityRatio_;
590 std::array<Evaluation, numPhases> density_;
Provides the Darcy flux module.
Definition darcyfluxmodule.hh:122
void calculateBoundaryGradients_(const ElementContext &elemCtx, unsigned boundaryFaceIdx, unsigned timeIdx, const FluidState &fluidState)
Calculate the gradients at the grid boundary which are required to determine the volumetric fluxes.
Definition darcyfluxmodule.hh:343
void calculateGradients_(const ElementContext &elemCtx, unsigned faceIdx, unsigned timeIdx)
Calculate the gradients which are required to determine the volumetric fluxes.
Definition darcyfluxmodule.hh:190
Provides the defaults for the parameters required by the Forchheimer velocity approach.
Definition forchheimerfluxmodule.hh:85
Evaluation mobilityPassabilityRatio(Context &context, unsigned spaceIdx, unsigned timeIdx, unsigned phaseIdx) const
Returns the ratio between the phase mobility and its passability for a given fluid phase .
Definition forchheimerfluxmodule.hh:119
Scalar ergunCoefficient(const Context &, unsigned, unsigned) const
Returns the Ergun coefficient.
Definition forchheimerfluxmodule.hh:100
Provides the Forchheimer flux module.
Definition forchheimerfluxmodule.hh:220
const Evaluation & ergunCoefficient() const
Return the Ergun coefficent at the face's integration point.
Definition forchheimerfluxmodule.hh:244
void calculateBoundaryFluxes_(const ElementContext &elemCtx, unsigned bfIdx, unsigned timeIdx)
Calculate the volumetric flux rates of all phases at the domain boundary.
Definition forchheimerfluxmodule.hh:417
void calculateFluxes_(const ElementContext &elemCtx, unsigned scvfIdx, unsigned timeIdx)
Calculate the volumetric fluxes of all phases.
Definition forchheimerfluxmodule.hh:367
bool isDiagonal_(const DimMatrix &K) const
Check whether all off-diagonal entries of a tensor are zero.
Definition forchheimerfluxmodule.hh:556
Evaluation & mobilityPassabilityRatio(unsigned phaseIdx) const
Return the ratio of the mobility divided by the passability at the face's integration point for a giv...
Definition forchheimerfluxmodule.hh:253
Provides the intensive quantities for the Forchheimer module.
Definition forchheimerfluxmodule.hh:134
const Evaluation & ergunCoefficient() const
Returns the Ergun coefficient.
Definition forchheimerfluxmodule.hh:149
const Evaluation & mobilityPassabilityRatio(unsigned phaseIdx) const
Returns the passability of a phase.
Definition forchheimerfluxmodule.hh:155
This file contains the necessary classes to calculate the volumetric fluxes out of a pressure potenti...
Declare the properties used by the infrastructure code of the finite volume discretizations.
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition blackoilbioeffectsmodules.hh:43
constexpr auto getPropValue()
get the value data member of a property
Definition propertysystem.hh:240
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property (equivalent to old macro GET_PROP_TYPE(....
Definition propertysystem.hh:233
Specifies a flux module which uses the Forchheimer relation.
Definition forchheimerfluxmodule.hh:66
static void registerParameters()
Register all run-time parameters for the flux module.
Definition forchheimerfluxmodule.hh:74