3.2-git
DUNE for Multi-{Phase, Component, Scale, Physics, ...} flow and transport in porous media
porousmediumflow/richards/localresidual.hh
Go to the documentation of this file.
1// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2// vi: set et ts=4 sw=4 sts=4:
3/*****************************************************************************
4 * See the file COPYING for full copying permissions. *
5 * *
6 * This program is free software: you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation, either version 3 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
18 *****************************************************************************/
26#ifndef DUMUX_RICHARDS_LOCAL_RESIDUAL_HH
27#define DUMUX_RICHARDS_LOCAL_RESIDUAL_HH
28
34
35namespace Dumux {
36
42template<class TypeTag>
43class RichardsLocalResidual : public GetPropType<TypeTag, Properties::BaseLocalResidual>
44{
46
52 using ElementVolumeVariables = typename GetPropType<TypeTag, Properties::GridVolumeVariables>::LocalView;
54 using ElementFluxVariablesCache = typename GetPropType<TypeTag, Properties::GridFluxVariablesCache>::LocalView;
55 using FVElementGeometry = typename GetPropType<TypeTag, Properties::GridGeometry>::LocalView;
56 using SubControlVolume = typename FVElementGeometry::SubControlVolume;
57 using SubControlVolumeFace = typename FVElementGeometry::SubControlVolumeFace;
59 using Element = typename GridView::template Codim<0>::Entity;
63 // first index for the mass balance
64 enum { conti0EqIdx = Indices::conti0EqIdx };
65
66 // phase indices
67 enum {
68 liquidPhaseIdx = FluidSystem::liquidPhaseIdx,
69 gasPhaseIdx = FluidSystem::gasPhaseIdx,
70 liquidCompIdx = FluidSystem::liquidCompIdx
71 };
72
73 static constexpr bool enableWaterDiffusionInAir
74 = getPropValue<TypeTag, Properties::EnableWaterDiffusionInAir>();
75
77 struct InvalidElemSol
78 {
79 template<class Index>
80 double operator[] (const Index i) const
81 { static_assert(AlwaysFalse<Index>::value, "Solution-dependent material parameters not supported with analytical differentiation"); return 0.0; }
82 };
83
84public:
85 using ParentType::ParentType;
86
98 NumEqVector computeStorage(const Problem& problem,
99 const SubControlVolume& scv,
100 const VolumeVariables& volVars) const
101 {
102 // partial time derivative of the phase mass
103 NumEqVector storage(0.0);
104 storage[conti0EqIdx] = volVars.porosity()
105 * volVars.density(liquidPhaseIdx)
106 * volVars.saturation(liquidPhaseIdx);
107
108 // for extended Richards we consider water in air
109 if (enableWaterDiffusionInAir)
110 storage[conti0EqIdx] += volVars.porosity()
111 * volVars.molarDensity(gasPhaseIdx)
112 * volVars.moleFraction(gasPhaseIdx, liquidCompIdx)
113 * FluidSystem::molarMass(liquidCompIdx)
114 * volVars.saturation(gasPhaseIdx);
115
117 EnergyLocalResidual::fluidPhaseStorage(storage, scv, volVars, liquidPhaseIdx);
118 EnergyLocalResidual::fluidPhaseStorage(storage, scv, volVars, gasPhaseIdx);
119 EnergyLocalResidual::solidPhaseStorage(storage, scv, volVars);
120
121 return storage;
122 }
123
124
135 NumEqVector computeFlux(const Problem& problem,
136 const Element& element,
137 const FVElementGeometry& fvGeometry,
138 const ElementVolumeVariables& elemVolVars,
139 const SubControlVolumeFace& scvf,
140 const ElementFluxVariablesCache& elemFluxVarsCache) const
141 {
142 FluxVariables fluxVars;
143 fluxVars.init(problem, element, fvGeometry, elemVolVars, scvf, elemFluxVarsCache);
144
145 NumEqVector flux(0.0);
146 // the physical quantities for which we perform upwinding
147 auto upwindTerm = [](const auto& volVars)
148 { return volVars.density(liquidPhaseIdx)*volVars.mobility(liquidPhaseIdx); };
149
150 flux[conti0EqIdx] = fluxVars.advectiveFlux(liquidPhaseIdx, upwindTerm);
151
152 // for extended Richards we consider water vapor diffusion in air
153 if (enableWaterDiffusionInAir)
154 {
155 //check for the reference system and adapt units of the diffusive flux accordingly.
156 if (FluxVariables::MolecularDiffusionType::referenceSystemFormulation() == ReferenceSystemFormulation::massAveraged)
157 flux[conti0EqIdx] += fluxVars.molecularDiffusionFlux(gasPhaseIdx)[liquidCompIdx];
158 else
159 flux[conti0EqIdx] += fluxVars.molecularDiffusionFlux(gasPhaseIdx)[liquidCompIdx]*FluidSystem::molarMass(liquidCompIdx);
160 }
161
163 EnergyLocalResidual::heatConvectionFlux(flux, fluxVars, liquidPhaseIdx);
164
167 EnergyLocalResidual::heatConductionFlux(flux, fluxVars);
168
169 return flux;
170 }
171
182 template<class PartialDerivativeMatrix>
183 void addStorageDerivatives(PartialDerivativeMatrix& partialDerivatives,
184 const Problem& problem,
185 const Element& element,
186 const FVElementGeometry& fvGeometry,
187 const VolumeVariables& curVolVars,
188 const SubControlVolume& scv) const
189 {
190 static_assert(!enableWaterDiffusionInAir,
191 "richards/localresidual.hh: Analytic Jacobian not implemented for the water diffusion in air version!");
192 static_assert(!FluidSystem::isCompressible(0),
193 "richards/localresidual.hh: Analytic Jacobian only supports incompressible fluids!");
194
195 const auto poreVolume = scv.volume()*curVolVars.porosity();
196 static const auto rho = curVolVars.density(0);
197
198 // material law for pc-sw
199 const auto& matParams = problem.spatialParams().materialLawParams(element, scv, InvalidElemSol{});
200
201 // partial derivative of storage term w.r.t. p_w
202 // d(Sw*rho*phi*V/dt)/dpw = rho*phi*V/dt*dsw/dpw = rho*phi*V/dt*dsw/dpc*dpc/dpw = -rho*phi*V/dt*dsw/dpc
203 using MaterialLaw = typename Problem::SpatialParams::MaterialLaw;
204 partialDerivatives[conti0EqIdx][0] += -rho*poreVolume/this->timeLoop().timeStepSize()*MaterialLaw::dsw_dpc(matParams, curVolVars.capillaryPressure());
205 }
206
219 template<class PartialDerivativeMatrix>
220 void addSourceDerivatives(PartialDerivativeMatrix& partialDerivatives,
221 const Problem& problem,
222 const Element& element,
223 const FVElementGeometry& fvGeometry,
224 const VolumeVariables& curVolVars,
225 const SubControlVolume& scv) const
226 { /* TODO maybe forward to problem for the user to implement the source derivatives?*/ }
227
242 template<class PartialDerivativeMatrices, class T = TypeTag>
243 std::enable_if_t<GetPropType<T, Properties::GridGeometry>::discMethod == DiscretizationMethod::cctpfa, void>
244 addFluxDerivatives(PartialDerivativeMatrices& derivativeMatrices,
245 const Problem& problem,
246 const Element& element,
247 const FVElementGeometry& fvGeometry,
248 const ElementVolumeVariables& curElemVolVars,
249 const ElementFluxVariablesCache& elemFluxVarsCache,
250 const SubControlVolumeFace& scvf) const
251 {
252 static_assert(!enableWaterDiffusionInAir,
253 "richards/localresidual.hh: Analytic Jacobian not implemented for the water diffusion in air version!");
254 static_assert(!FluidSystem::isCompressible(0),
255 "richards/localresidual.hh: Analytic Jacobian only supports incompressible fluids!");
256 static_assert(!FluidSystem::viscosityIsConstant(0),
257 "richards/localresidual.hh: Analytic Jacobian only supports fluids with constant viscosity!");
258
259 // get references to the two participating vol vars & parameters
260 const auto insideScvIdx = scvf.insideScvIdx();
261 const auto outsideScvIdx = scvf.outsideScvIdx();
262 const auto outsideElement = fvGeometry.gridGeometry().element(outsideScvIdx);
263 const auto& insideScv = fvGeometry.scv(insideScvIdx);
264 const auto& outsideScv = fvGeometry.scv(outsideScvIdx);
265 const auto& insideVolVars = curElemVolVars[insideScvIdx];
266 const auto& outsideVolVars = curElemVolVars[outsideScvIdx];
267 const auto& insideMaterialParams = problem.spatialParams().materialLawParams(element, insideScv, InvalidElemSol{});
268 const auto& outsideMaterialParams = problem.spatialParams().materialLawParams(outsideElement, outsideScv, InvalidElemSol{});
269
270 // some quantities to be reused (rho & mu are constant and thus equal for all cells)
271 static const auto rho = insideVolVars.density(0);
272 static const auto mu = insideVolVars.viscosity(0);
273 static const auto rho_mu = rho/mu;
274
275 // upwind term
276 // evaluate the current wetting phase Darcy flux and resulting upwind weights
278 static const Scalar upwindWeight = getParamFromGroup<Scalar>(problem.paramGroup(), "Flux.UpwindWeight");
279 const auto flux = AdvectionType::flux(problem, element, fvGeometry, curElemVolVars, scvf, 0, elemFluxVarsCache);
280 const auto insideWeight = std::signbit(flux) ? (1.0 - upwindWeight) : upwindWeight;
281 const auto outsideWeight = 1.0 - insideWeight;
282 const auto upwindTerm = rho*insideVolVars.mobility(0)*insideWeight + rho*outsideVolVars.mobility(0)*outsideWeight;
283
284 // material law derivatives
285 const auto insideSw = insideVolVars.saturation(0);
286 const auto outsideSw = outsideVolVars.saturation(0);
287 const auto insidePc = insideVolVars.capillaryPressure();
288 const auto outsidePc = outsideVolVars.capillaryPressure();
289 using MaterialLaw = typename Problem::SpatialParams::MaterialLaw;
290 const auto dkrw_dsw_inside = MaterialLaw::dkrw_dsw(insideMaterialParams, insideSw);
291 const auto dkrw_dsw_outside = MaterialLaw::dkrw_dsw(outsideMaterialParams, outsideSw);
292 const auto dsw_dpw_inside = -MaterialLaw::dsw_dpc(insideMaterialParams, insidePc);
293 const auto dsw_dpw_outside = -MaterialLaw::dsw_dpc(outsideMaterialParams, outsidePc);
294
295 // the transmissibility
296 const auto tij = elemFluxVarsCache[scvf].advectionTij();
297
298 // get references to the two participating derivative matrices
299 auto& dI_dI = derivativeMatrices[insideScvIdx];
300 auto& dI_dJ = derivativeMatrices[outsideScvIdx];
301
302 // partial derivative of the wetting phase flux w.r.t. pw
303 dI_dI[conti0EqIdx][0] += tij*upwindTerm + rho_mu*flux*insideWeight*dkrw_dsw_inside*dsw_dpw_inside;
304 dI_dJ[conti0EqIdx][0] += -tij*upwindTerm + rho_mu*flux*outsideWeight*dkrw_dsw_outside*dsw_dpw_outside;
305 }
306
318 template<class JacobianMatrix, class T = TypeTag>
319 std::enable_if_t<GetPropType<T, Properties::GridGeometry>::discMethod == DiscretizationMethod::box, void>
320 addFluxDerivatives(JacobianMatrix& A,
321 const Problem& problem,
322 const Element& element,
323 const FVElementGeometry& fvGeometry,
324 const ElementVolumeVariables& curElemVolVars,
325 const ElementFluxVariablesCache& elemFluxVarsCache,
326 const SubControlVolumeFace& scvf) const
327 {
328 static_assert(!enableWaterDiffusionInAir,
329 "richards/localresidual.hh: Analytic Jacobian not implemented for the water diffusion in air version!");
330 static_assert(!FluidSystem::isCompressible(0),
331 "richards/localresidual.hh: Analytic Jacobian only supports incompressible fluids!");
332 static_assert(!FluidSystem::viscosityIsConstant(0),
333 "richards/localresidual.hh: Analytic Jacobian only supports fluids with constant viscosity!");
334
335 // get references to the two participating vol vars & parameters
336 const auto insideScvIdx = scvf.insideScvIdx();
337 const auto outsideScvIdx = scvf.outsideScvIdx();
338 const auto& insideScv = fvGeometry.scv(insideScvIdx);
339 const auto& outsideScv = fvGeometry.scv(outsideScvIdx);
340 const auto& insideVolVars = curElemVolVars[insideScvIdx];
341 const auto& outsideVolVars = curElemVolVars[outsideScvIdx];
342 const auto& insideMaterialParams = problem.spatialParams().materialLawParams(element, insideScv, InvalidElemSol{});
343 const auto& outsideMaterialParams = problem.spatialParams().materialLawParams(element, outsideScv, InvalidElemSol{});
344
345 // some quantities to be reused (rho & mu are constant and thus equal for all cells)
346 static const auto rho = insideVolVars.density(0);
347 static const auto mu = insideVolVars.viscosity(0);
348 static const auto rho_mu = rho/mu;
349
350 // upwind term
351 // evaluate the current wetting phase Darcy flux and resulting upwind weights
353 static const Scalar upwindWeight = getParamFromGroup<Scalar>(problem.paramGroup(), "Flux.UpwindWeight");
354 const auto flux = AdvectionType::flux(problem, element, fvGeometry, curElemVolVars, scvf, 0, elemFluxVarsCache);
355 const auto insideWeight = std::signbit(flux) ? (1.0 - upwindWeight) : upwindWeight;
356 const auto outsideWeight = 1.0 - insideWeight;
357 const auto upwindTerm = rho*insideVolVars.mobility(0)*insideWeight + rho*outsideVolVars.mobility(0)*outsideWeight;
358
359 // material law derivatives
360 const auto insideSw = insideVolVars.saturation(0);
361 const auto outsideSw = outsideVolVars.saturation(0);
362 const auto insidePc = insideVolVars.capillaryPressure();
363 const auto outsidePc = outsideVolVars.capillaryPressure();
364 using MaterialLaw = typename Problem::SpatialParams::MaterialLaw;
365 const auto dkrw_dsw_inside = MaterialLaw::dkrw_dsw(insideMaterialParams, insideSw);
366 const auto dkrw_dsw_outside = MaterialLaw::dkrw_dsw(outsideMaterialParams, outsideSw);
367 const auto dsw_dpw_inside = -MaterialLaw::dsw_dpc(insideMaterialParams, insidePc);
368 const auto dsw_dpw_outside = -MaterialLaw::dsw_dpc(outsideMaterialParams, outsidePc);
369
370 // so far it was the same as for tpfa
371 // the transmissibilities (flux derivatives with respect to all pw-dofs on the element)
372 const auto ti = AdvectionType::calculateTransmissibilities(
373 problem, element, fvGeometry, curElemVolVars, scvf, elemFluxVarsCache[scvf]
374 );
375
376 // get the rows of the jacobian matrix for the inside/outside scv
377 auto& dI_dJ_inside = A[insideScv.dofIndex()];
378 auto& dI_dJ_outside = A[outsideScv.dofIndex()];
379
380 // add the partial derivatives w.r.t all scvs in the element
381 for (const auto& scvJ : scvs(fvGeometry))
382 {
383 // the transmissibily associated with the scvJ
384 const auto& tj = ti[scvJ.indexInElement()];
385 const auto globalJ = scvJ.dofIndex();
386
387 // partial derivative of the wetting phase flux w.r.t. p_w
388 dI_dJ_inside[globalJ][conti0EqIdx][0] += tj*upwindTerm;
389 dI_dJ_outside[globalJ][conti0EqIdx][0] += -tj*upwindTerm;
390 }
391
392 const auto upwindContributionInside = rho_mu*flux*insideWeight*dkrw_dsw_inside*dsw_dpw_inside;
393 const auto upwindContributionOutside = rho_mu*flux*outsideWeight*dkrw_dsw_outside*dsw_dpw_outside;
394
395 // additional constribution of the upwind term only for inside and outside dof
396 A[insideScv.dofIndex()][insideScv.dofIndex()][conti0EqIdx][0] += upwindContributionInside;
397 A[insideScv.dofIndex()][outsideScv.dofIndex()][conti0EqIdx][0] += upwindContributionOutside;
398
399 A[outsideScv.dofIndex()][insideScv.dofIndex()][conti0EqIdx][0] -= upwindContributionInside;
400 A[outsideScv.dofIndex()][outsideScv.dofIndex()][conti0EqIdx][0] -= upwindContributionOutside;
401 }
402
417 template<class PartialDerivativeMatrices>
418 void addCCDirichletFluxDerivatives(PartialDerivativeMatrices& derivativeMatrices,
419 const Problem& problem,
420 const Element& element,
421 const FVElementGeometry& fvGeometry,
422 const ElementVolumeVariables& curElemVolVars,
423 const ElementFluxVariablesCache& elemFluxVarsCache,
424 const SubControlVolumeFace& scvf) const
425 {
426 static_assert(!enableWaterDiffusionInAir,
427 "richards/localresidual.hh: Analytic Jacobian not implemented for the water diffusion in air version!");
428 static_assert(!FluidSystem::isCompressible(0),
429 "richards/localresidual.hh: Analytic Jacobian only supports incompressible fluids!");
430 static_assert(!FluidSystem::viscosityIsConstant(0),
431 "richards/localresidual.hh: Analytic Jacobian only supports fluids with constant viscosity!");
432
433
434 // get references to the two participating vol vars & parameters
435 const auto insideScvIdx = scvf.insideScvIdx();
436 const auto& insideScv = fvGeometry.scv(insideScvIdx);
437 const auto& insideVolVars = curElemVolVars[insideScvIdx];
438 const auto& outsideVolVars = curElemVolVars[scvf.outsideScvIdx()];
439 const auto& insideMaterialParams = problem.spatialParams().materialLawParams(element, insideScv, InvalidElemSol{});
440
441 // some quantities to be reused (rho & mu are constant and thus equal for all cells)
442 static const auto rho = insideVolVars.density(0);
443 static const auto mu = insideVolVars.viscosity(0);
444 static const auto rho_mu = rho/mu;
445
446 // upwind term
447 // evaluate the current wetting phase Darcy flux and resulting upwind weights
449 static const Scalar upwindWeight = getParamFromGroup<Scalar>(problem.paramGroup(), "Flux.UpwindWeight");
450 const auto flux = AdvectionType::flux(problem, element, fvGeometry, curElemVolVars, scvf, 0, elemFluxVarsCache);
451 const auto insideWeight = std::signbit(flux) ? (1.0 - upwindWeight) : upwindWeight;
452 const auto outsideWeight = 1.0 - insideWeight;
453 const auto upwindTerm = rho*insideVolVars.mobility(0)*insideWeight + rho*outsideVolVars.mobility(0)*outsideWeight;
454
455 // material law derivatives
456 const auto insideSw = insideVolVars.saturation(0);
457 const auto insidePc = insideVolVars.capillaryPressure();
458 using MaterialLaw = typename Problem::SpatialParams::MaterialLaw;
459 const auto dkrw_dsw_inside = MaterialLaw::dkrw_dsw(insideMaterialParams, insideSw);
460 const auto dsw_dpw_inside = -MaterialLaw::dsw_dpc(insideMaterialParams, insidePc);
461
462 // the transmissibility
463 const auto tij = elemFluxVarsCache[scvf].advectionTij();
464
465 // partial derivative of the wetting phase flux w.r.t. pw
466 derivativeMatrices[insideScvIdx][conti0EqIdx][0] += tij*upwindTerm + rho_mu*flux*insideWeight*dkrw_dsw_inside*dsw_dpw_inside;
467 }
468
480 template<class PartialDerivativeMatrices>
481 void addRobinFluxDerivatives(PartialDerivativeMatrices& derivativeMatrices,
482 const Problem& problem,
483 const Element& element,
484 const FVElementGeometry& fvGeometry,
485 const ElementVolumeVariables& curElemVolVars,
486 const ElementFluxVariablesCache& elemFluxVarsCache,
487 const SubControlVolumeFace& scvf) const
488 { /* TODO maybe forward to problem for the user to implement the Robin derivatives?*/ }
489
490private:
491 Implementation *asImp_()
492 { return static_cast<Implementation *> (this); }
493
494 const Implementation *asImp_() const
495 { return static_cast<const Implementation *> (this); }
496};
497
498} // end namespace Dumux
499
500#endif
The infrastructure to retrieve run-time parameters from Dune::ParameterTrees.
The available discretization methods in Dumux.
The reference frameworks and formulations available for splitting total fluxes into a advective and d...
Definition: adapt.hh:29
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:149
Template which always yields a false value.
Definition: typetraits.hh:37
Element-wise calculation of the Jacobian matrix for problems using the Richards fully implicit models...
Definition: porousmediumflow/richards/localresidual.hh:44
void addSourceDerivatives(PartialDerivativeMatrix &partialDerivatives, const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const VolumeVariables &curVolVars, const SubControlVolume &scv) const
Adds source derivatives for wetting and non-wetting phase.
Definition: porousmediumflow/richards/localresidual.hh:220
void addCCDirichletFluxDerivatives(PartialDerivativeMatrices &derivativeMatrices, const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &curElemVolVars, const ElementFluxVariablesCache &elemFluxVarsCache, const SubControlVolumeFace &scvf) const
Adds cell-centered Dirichlet flux derivatives for wetting and non-wetting phase.
Definition: porousmediumflow/richards/localresidual.hh:418
NumEqVector computeStorage(const Problem &problem, const SubControlVolume &scv, const VolumeVariables &volVars) const
Evaluates the rate of change of all conservation quantites (e.g. phase mass) within a sub-control vol...
Definition: porousmediumflow/richards/localresidual.hh:98
void addStorageDerivatives(PartialDerivativeMatrix &partialDerivatives, const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const VolumeVariables &curVolVars, const SubControlVolume &scv) const
Adds the storage derivative.
Definition: porousmediumflow/richards/localresidual.hh:183
NumEqVector computeFlux(const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const SubControlVolumeFace &scvf, const ElementFluxVariablesCache &elemFluxVarsCache) const
Evaluates the mass flux over a face of a sub control volume.
Definition: porousmediumflow/richards/localresidual.hh:135
std::enable_if_t< GetPropType< T, Properties::GridGeometry >::discMethod==DiscretizationMethod::cctpfa, void > addFluxDerivatives(PartialDerivativeMatrices &derivativeMatrices, const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &curElemVolVars, const ElementFluxVariablesCache &elemFluxVarsCache, const SubControlVolumeFace &scvf) const
Adds flux derivatives for wetting and non-wetting phase for cell-centered FVM using TPFA.
Definition: porousmediumflow/richards/localresidual.hh:244
void addRobinFluxDerivatives(PartialDerivativeMatrices &derivativeMatrices, const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &curElemVolVars, const ElementFluxVariablesCache &elemFluxVarsCache, const SubControlVolumeFace &scvf) const
Adds Robin flux derivatives for wetting and non-wetting phase.
Definition: porousmediumflow/richards/localresidual.hh:481
std::enable_if_t< GetPropType< T, Properties::GridGeometry >::discMethod==DiscretizationMethod::box, void > addFluxDerivatives(JacobianMatrix &A, const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &curElemVolVars, const ElementFluxVariablesCache &elemFluxVarsCache, const SubControlVolumeFace &scvf) const
Adds flux derivatives for box method.
Definition: porousmediumflow/richards/localresidual.hh:320
Declares all properties used in Dumux.