26#ifndef DUMUX_2P_INCOMPRESSIBLE_TEST_LOCAL_RESIDUAL_HH
27#define DUMUX_2P_INCOMPRESSIBLE_TEST_LOCAL_RESIDUAL_HH
50template<
class TypeTag>
63 using FVElementGeometry =
typename GridGeometry::LocalView;
64 using SubControlVolume =
typename GridGeometry::SubControlVolume;
65 using SubControlVolumeFace =
typename GridGeometry::SubControlVolumeFace;
68 using Element =
typename GridView::template Codim<0>::Entity;
72 static constexpr int numPhases = ModelTraits::numFluidPhases();
73 static constexpr int pressureIdx = ModelTraits::Indices::pressureIdx;
74 static constexpr int saturationIdx = ModelTraits::Indices::saturationIdx;
75 static constexpr int conti0EqIdx = ModelTraits::Indices::conti0EqIdx;
78 using ParentType::ParentType;
93 template<
class PartialDerivativeMatrix>
95 const Problem& problem,
96 const Element& element,
97 const FVElementGeometry& fvGeometry,
98 const VolumeVariables& curVolVars,
99 const SubControlVolume& scv)
const
101 static_assert(!FluidSystem::isCompressible(0),
102 "2p/incompressiblelocalresidual.hh: Only incompressible fluids are allowed!");
103 static_assert(!FluidSystem::isCompressible(1),
104 "2p/incompressiblelocalresidual.hh: Only incompressible fluids are allowed!");
105 static_assert(ModelTraits::numFluidPhases() == 2,
106 "2p/incompressiblelocalresidual.hh: Only two-phase models are allowed!");
108 "2p/incompressiblelocalresidual.hh: Analytic differentiation has to be checked for p1-s0 formulation!");
110 const auto poreVolume = Extrusion::volume(scv)*curVolVars.porosity();
111 const auto dt = this->timeLoop().timeStepSize();
114 partialDerivatives[conti0EqIdx+0][saturationIdx] -= poreVolume*curVolVars.density(0)/dt;
115 partialDerivatives[conti0EqIdx+1][saturationIdx] += poreVolume*curVolVars.density(1)/dt;
128 template<
class PartialDerivativeMatrix>
130 const Problem& problem,
131 const Element& element,
132 const FVElementGeometry& fvGeometry,
133 const VolumeVariables& curVolVars,
134 const SubControlVolume& scv)
const
151 template<
class PartialDerivativeMatrices,
class T = TypeTag>
154 const Problem& problem,
155 const Element& element,
156 const FVElementGeometry& fvGeometry,
157 const ElementVolumeVariables& curElemVolVars,
158 const ElementFluxVariablesCache& elemFluxVarsCache,
159 const SubControlVolumeFace& scvf)
const
161 static_assert(!FluidSystem::isCompressible(0),
162 "2p/incompressiblelocalresidual.hh: Only incompressible fluids are allowed!");
163 static_assert(!FluidSystem::isCompressible(1),
164 "2p/incompressiblelocalresidual.hh: Only incompressible fluids are allowed!");
165 static_assert(FluidSystem::viscosityIsConstant(0),
166 "2p/incompressiblelocalresidual.hh: Only fluids with constant viscosities are allowed!");
167 static_assert(FluidSystem::viscosityIsConstant(1),
168 "2p/incompressiblelocalresidual.hh: Only fluids with constant viscosities are allowed!");
169 static_assert(ModelTraits::numFluidPhases() == 2,
170 "2p/incompressiblelocalresidual.hh: Only two-phase models are allowed!");
172 "2p/incompressiblelocalresidual.hh: Analytic differentiation has to be checked for p1-s0 formulation!");
177 static const Scalar upwindWeight = getParamFromGroup<Scalar>(problem.paramGroup(),
"Flux.UpwindWeight");
178 const auto flux_w = AdvectionType::flux(problem, element, fvGeometry, curElemVolVars, scvf, 0, elemFluxVarsCache);
179 const auto flux_n = AdvectionType::flux(problem, element, fvGeometry, curElemVolVars, scvf, 1, elemFluxVarsCache);
180 const auto insideWeight_w = std::signbit(flux_w) ? (1.0 - upwindWeight) : upwindWeight;
181 const auto outsideWeight_w = 1.0 - insideWeight_w;
182 const auto insideWeight_n = std::signbit(flux_n) ? (1.0 - upwindWeight) : upwindWeight;
183 const auto outsideWeight_n = 1.0 - insideWeight_n;
186 const auto insideScvIdx = scvf.insideScvIdx();
187 const auto outsideScvIdx = scvf.outsideScvIdx();
188 const auto outsideElement = fvGeometry.gridGeometry().element(outsideScvIdx);
189 const auto& insideScv = fvGeometry.scv(insideScvIdx);
190 const auto& outsideScv = fvGeometry.scv(outsideScvIdx);
191 const auto& insideVolVars = curElemVolVars[insideScvIdx];
192 const auto& outsideVolVars = curElemVolVars[outsideScvIdx];
202 const auto& insidefluidMatrixInteraction = Deprecated::makePcKrSw(Scalar{}, problem.spatialParams(),
205 elementSolution<FVElementGeometry>(insideVolVars.priVars()));
206 const auto& outsidefluidMatrixInteraction = Deprecated::makePcKrSw(Scalar{}, problem.spatialParams(),
209 elementSolution<FVElementGeometry>(outsideVolVars.priVars()));
212 auto& dI_dI = derivativeMatrices[insideScvIdx];
213 auto& dI_dJ = derivativeMatrices[outsideScvIdx];
216 static const auto rho_w = insideVolVars.density(0);
217 static const auto rho_n = insideVolVars.density(1);
218 static const auto rhow_muw = rho_w/insideVolVars.viscosity(0);
219 static const auto rhon_mun = rho_n/insideVolVars.viscosity(1);
220 const auto rhowKrw_muw_inside = rho_w*insideVolVars.mobility(0);
221 const auto rhonKrn_mun_inside = rho_n*insideVolVars.mobility(1);
222 const auto rhowKrw_muw_outside = rho_w*outsideVolVars.mobility(0);
223 const auto rhonKrn_mun_outside = rho_n*outsideVolVars.mobility(1);
226 const auto insideSw = insideVolVars.saturation(0);
227 const auto outsideSw = outsideVolVars.saturation(0);
228 const auto dKrw_dSn_inside = -1.0*insidefluidMatrixInteraction.dkrw_dsw(insideSw);
229 const auto dKrw_dSn_outside = -1.0*outsidefluidMatrixInteraction.dkrw_dsw(outsideSw);
230 const auto dKrn_dSn_inside = -1.0*insidefluidMatrixInteraction.dkrn_dsw(insideSw);
231 const auto dKrn_dSn_outside = -1.0*outsidefluidMatrixInteraction.dkrn_dsw(outsideSw);
232 const auto dpc_dSn_inside = -1.0*insidefluidMatrixInteraction.dpc_dsw(insideSw);
233 const auto dpc_dSn_outside = -1.0*outsidefluidMatrixInteraction.dpc_dsw(outsideSw);
235 const auto tij = elemFluxVarsCache[scvf].advectionTij();
238 const auto up_w = rhowKrw_muw_inside*insideWeight_w + rhowKrw_muw_outside*outsideWeight_w;
239 const auto up_n = rhonKrn_mun_inside*insideWeight_n + rhonKrn_mun_outside*outsideWeight_n;
240 const auto rho_mu_flux_w = rhow_muw*flux_w;
241 const auto rho_mu_flux_n = rhon_mun*flux_n;
242 const auto tij_up_w = tij*up_w;
243 const auto tij_up_n = tij*up_n;
246 dI_dI[conti0EqIdx+0][pressureIdx] += tij_up_w;
247 dI_dJ[conti0EqIdx+0][pressureIdx] -= tij_up_w;
250 dI_dI[conti0EqIdx+0][saturationIdx] += rho_mu_flux_w*dKrw_dSn_inside*insideWeight_w;
251 dI_dJ[conti0EqIdx+0][saturationIdx] += rho_mu_flux_w*dKrw_dSn_outside*outsideWeight_w;
254 dI_dI[conti0EqIdx+1][pressureIdx] += tij_up_n;
255 dI_dJ[conti0EqIdx+1][pressureIdx] -= tij_up_n;
258 dI_dI[conti0EqIdx+1][saturationIdx] += rho_mu_flux_n*dKrn_dSn_inside*insideWeight_n;
259 dI_dJ[conti0EqIdx+1][saturationIdx] += rho_mu_flux_n*dKrn_dSn_outside*outsideWeight_n;
262 dI_dI[conti0EqIdx+1][saturationIdx] += tij_up_n*dpc_dSn_inside;
263 dI_dJ[conti0EqIdx+1][saturationIdx] -= tij_up_n*dpc_dSn_outside;
280 template<
class JacobianMatrix,
class T = TypeTag>
283 const Problem& problem,
284 const Element& element,
285 const FVElementGeometry& fvGeometry,
286 const ElementVolumeVariables& curElemVolVars,
287 const ElementFluxVariablesCache& elemFluxVarsCache,
288 const SubControlVolumeFace& scvf)
const
290 static_assert(!FluidSystem::isCompressible(0),
291 "2p/incompressiblelocalresidual.hh: Only incompressible fluids are allowed!");
292 static_assert(!FluidSystem::isCompressible(1),
293 "2p/incompressiblelocalresidual.hh: Only incompressible fluids are allowed!");
294 static_assert(FluidSystem::viscosityIsConstant(0),
295 "2p/incompressiblelocalresidual.hh: Only fluids with constant viscosities are allowed!");
296 static_assert(FluidSystem::viscosityIsConstant(1),
297 "2p/incompressiblelocalresidual.hh: Only fluids with constant viscosities are allowed!");
298 static_assert(ModelTraits::numFluidPhases() == 2,
299 "2p/incompressiblelocalresidual.hh: Only two-phase models are allowed!");
301 "2p/incompressiblelocalresidual.hh: Analytic differentiation has to be checked for p0-s1 formulation!");
306 static const Scalar upwindWeight = getParamFromGroup<Scalar>(problem.paramGroup(),
"Flux.UpwindWeight");
307 const auto flux_w = AdvectionType::flux(problem, element, fvGeometry, curElemVolVars, scvf, 0, elemFluxVarsCache);
308 const auto flux_n = AdvectionType::flux(problem, element, fvGeometry, curElemVolVars, scvf, 1, elemFluxVarsCache);
309 const auto insideWeight_w = std::signbit(flux_w) ? (1.0 - upwindWeight) : upwindWeight;
310 const auto outsideWeight_w = 1.0 - insideWeight_w;
311 const auto insideWeight_n = std::signbit(flux_n) ? (1.0 - upwindWeight) : upwindWeight;
312 const auto outsideWeight_n = 1.0 - insideWeight_n;
315 const auto insideScvIdx = scvf.insideScvIdx();
316 const auto outsideScvIdx = scvf.outsideScvIdx();
317 const auto& insideScv = fvGeometry.scv(insideScvIdx);
318 const auto& outsideScv = fvGeometry.scv(outsideScvIdx);
319 const auto& insideVolVars = curElemVolVars[insideScv];
320 const auto& outsideVolVars = curElemVolVars[outsideScv];
322 const auto elemSol =
elementSolution(element, curElemVolVars, fvGeometry);
332 const auto& insidefluidMatrixInteraction = Deprecated::makePcKrSw(Scalar{}, problem.spatialParams(),
336 const auto& outsidefluidMatrixInteraction = Deprecated::makePcKrSw(Scalar{}, problem.spatialParams(),
342 static const auto rho_w = insideVolVars.density(0);
343 static const auto rho_n = insideVolVars.density(1);
344 static const auto rhow_muw = rho_w/insideVolVars.viscosity(0);
345 static const auto rhon_mun = rho_n/insideVolVars.viscosity(1);
346 const auto rhowKrw_muw_inside = rho_w*insideVolVars.mobility(0);
347 const auto rhonKrn_mun_inside = rho_n*insideVolVars.mobility(1);
348 const auto rhowKrw_muw_outside = rho_w*outsideVolVars.mobility(0);
349 const auto rhonKrn_mun_outside = rho_n*outsideVolVars.mobility(1);
352 const auto ti = AdvectionType::calculateTransmissibilities(problem,
357 elemFluxVarsCache[scvf]);
360 auto& dI_dJ_inside = A[insideScv.dofIndex()];
361 auto& dI_dJ_outside = A[outsideScv.dofIndex()];
364 const auto up_w = rhowKrw_muw_inside*insideWeight_w + rhowKrw_muw_outside*outsideWeight_w;
365 const auto up_n = rhonKrn_mun_inside*insideWeight_n + rhonKrn_mun_outside*outsideWeight_n;
366 const auto rho_mu_flux_w = rhow_muw*flux_w;
367 const auto rho_mu_flux_n = rhon_mun*flux_n;
370 for (
const auto& scvJ : scvs(fvGeometry))
372 const auto globalJ = scvJ.dofIndex();
373 const auto localJ = scvJ.indexInElement();
376 const auto tj = ti[localJ];
379 const auto tj_up_w = tj*up_w;
380 dI_dJ_inside[globalJ][conti0EqIdx+0][pressureIdx] += tj_up_w;
381 dI_dJ_outside[globalJ][conti0EqIdx+0][pressureIdx] -= tj_up_w;
384 const auto tj_up_n = tj*up_n;
385 dI_dJ_inside[globalJ][conti0EqIdx+1][pressureIdx] += tj_up_n;
386 dI_dJ_outside[globalJ][conti0EqIdx+1][pressureIdx] -= tj_up_n;
390 if (localJ == insideScvIdx)
393 const auto insideSw = insideVolVars.saturation(0);
394 const auto dKrw_dSn_inside = -1.0*insidefluidMatrixInteraction.dkrw_dsw(insideSw);
395 const auto dFluxW_dSnJ = rho_mu_flux_w*dKrw_dSn_inside*insideWeight_w;
396 dI_dJ_inside[globalJ][conti0EqIdx+0][saturationIdx] += dFluxW_dSnJ;
397 dI_dJ_outside[globalJ][conti0EqIdx+0][saturationIdx] -= dFluxW_dSnJ;
400 const auto dKrn_dSn_inside = -1.0*insidefluidMatrixInteraction.dkrn_dsw(insideSw);
401 const auto dFluxN_dSnJ_krn = rho_mu_flux_n*dKrn_dSn_inside*insideWeight_n;
402 dI_dJ_inside[globalJ][conti0EqIdx+1][saturationIdx] += dFluxN_dSnJ_krn;
403 dI_dJ_outside[globalJ][conti0EqIdx+1][saturationIdx] -= dFluxN_dSnJ_krn;
406 const auto dFluxN_dSnJ_pc = -1.0*tj_up_n*insidefluidMatrixInteraction.dpc_dsw(insideSw);
407 dI_dJ_inside[globalJ][conti0EqIdx+1][saturationIdx] += dFluxN_dSnJ_pc;
408 dI_dJ_outside[globalJ][conti0EqIdx+1][saturationIdx] -= dFluxN_dSnJ_pc;
410 else if (localJ == outsideScvIdx)
413 const auto outsideSw = outsideVolVars.saturation(0);
414 const auto dKrw_dSn_outside = -1.0*outsidefluidMatrixInteraction.dkrw_dsw(outsideSw);
415 const auto dFluxW_dSnJ = rho_mu_flux_w*dKrw_dSn_outside*outsideWeight_w;
416 dI_dJ_inside[globalJ][conti0EqIdx+0][saturationIdx] += dFluxW_dSnJ;
417 dI_dJ_outside[globalJ][conti0EqIdx+0][saturationIdx] -= dFluxW_dSnJ;
419 const auto dKrn_dSn_outside = -1.0*outsidefluidMatrixInteraction.dkrn_dsw(outsideSw);
420 const auto dFluxN_dSnJ_krn = rho_mu_flux_n*dKrn_dSn_outside*outsideWeight_n;
421 dI_dJ_inside[globalJ][conti0EqIdx+1][saturationIdx] += dFluxN_dSnJ_krn;
422 dI_dJ_outside[globalJ][conti0EqIdx+1][saturationIdx] -= dFluxN_dSnJ_krn;
424 const auto dFluxN_dSnJ_pc = -1.0*tj_up_n*outsidefluidMatrixInteraction.dpc_dsw(outsideSw);
425 dI_dJ_inside[globalJ][conti0EqIdx+1][saturationIdx] += dFluxN_dSnJ_pc;
426 dI_dJ_outside[globalJ][conti0EqIdx+1][saturationIdx] -= dFluxN_dSnJ_pc;
436 const auto& fluidMatrixInteractionJ = Deprecated::makePcKrSw(Scalar{}, problem.spatialParams(),
440 const auto swJ = curElemVolVars[scvJ].saturation(0);
441 const auto dFluxN_dSnJ_pc = tj_up_n*fluidMatrixInteractionJ.dpc_dsw(swJ);
442 dI_dJ_inside[globalJ][conti0EqIdx+1][saturationIdx] -= dFluxN_dSnJ_pc;
443 dI_dJ_outside[globalJ][conti0EqIdx+1][saturationIdx] += dFluxN_dSnJ_pc;
462 template<
class PartialDerivativeMatrices>
464 const Problem& problem,
465 const Element& element,
466 const FVElementGeometry& fvGeometry,
467 const ElementVolumeVariables& curElemVolVars,
468 const ElementFluxVariablesCache& elemFluxVarsCache,
469 const SubControlVolumeFace& scvf)
const
474 static const Scalar upwindWeight = getParamFromGroup<Scalar>(problem.paramGroup(),
"Flux.UpwindWeight");
475 const auto flux_w = AdvectionType::flux(problem, element, fvGeometry, curElemVolVars, scvf, 0, elemFluxVarsCache);
476 const auto flux_n = AdvectionType::flux(problem, element, fvGeometry, curElemVolVars, scvf, 1, elemFluxVarsCache);
477 const auto insideWeight_w = std::signbit(flux_w) ? (1.0 - upwindWeight) : upwindWeight;
478 const auto outsideWeight_w = 1.0 - insideWeight_w;
479 const auto insideWeight_n = std::signbit(flux_n) ? (1.0 - upwindWeight) : upwindWeight;
480 const auto outsideWeight_n = 1.0 - insideWeight_n;
483 const auto insideScvIdx = scvf.insideScvIdx();
484 const auto& insideScv = fvGeometry.scv(insideScvIdx);
485 const auto& insideVolVars = curElemVolVars[insideScvIdx];
486 const auto& outsideVolVars = curElemVolVars[scvf.outsideScvIdx()];
493 const auto& insidefluidMatrixInteraction = Deprecated::makePcKrSw(Scalar{}, problem.spatialParams(),
496 elementSolution<FVElementGeometry>(insideVolVars.priVars()));
499 static const auto rho_w = insideVolVars.density(0);
500 static const auto rho_n = insideVolVars.density(1);
501 static const auto rhow_muw = rho_w/insideVolVars.viscosity(0);
502 static const auto rhon_mun = rho_n/insideVolVars.viscosity(1);
503 const auto rhowKrw_muw_inside = rho_w*insideVolVars.mobility(0);
504 const auto rhonKrn_mun_inside = rho_n*insideVolVars.mobility(1);
505 const auto rhowKrw_muw_outside = rho_w*outsideVolVars.mobility(0);
506 const auto rhonKrn_mun_outside = rho_n*outsideVolVars.mobility(1);
509 auto& dI_dI = derivativeMatrices[insideScvIdx];
512 const auto insideSw = insideVolVars.saturation(0);
513 const auto dKrw_dSn_inside = -1.0*insidefluidMatrixInteraction.dkrw_dsw(insideSw);
514 const auto dKrn_dSn_inside = -1.0*insidefluidMatrixInteraction.dkrn_dsw(insideSw);
515 const auto dpc_dSn_inside = -1.0*insidefluidMatrixInteraction.dpc_dsw(insideSw);
517 const auto tij = elemFluxVarsCache[scvf].advectionTij();
519 const auto up_w = rhowKrw_muw_inside*insideWeight_w + rhowKrw_muw_outside*outsideWeight_w;
520 dI_dI[conti0EqIdx+0][pressureIdx] += tij*up_w;
523 dI_dI[conti0EqIdx+0][saturationIdx] += rhow_muw*flux_w*dKrw_dSn_inside*insideWeight_w;
526 const auto up_n = rhonKrn_mun_inside*insideWeight_n + rhonKrn_mun_outside*outsideWeight_n;
527 dI_dI[conti0EqIdx+1][pressureIdx] += tij*up_n;
530 dI_dI[conti0EqIdx+1][saturationIdx] += rhon_mun*flux_n*dKrn_dSn_inside*insideWeight_n;
533 dI_dI[conti0EqIdx+1][saturationIdx] += tij*dpc_dSn_inside*up_n;
547 template<
class PartialDerivativeMatrices>
549 const Problem& problem,
550 const Element& element,
551 const FVElementGeometry& fvGeometry,
552 const ElementVolumeVariables& curElemVolVars,
553 const ElementFluxVariablesCache& elemFluxVarsCache,
554 const SubControlVolumeFace& scvf)
const
The infrastructure to retrieve run-time parameters from Dune::ParameterTrees.
Element solution classes and factory functions.
The available discretization methods in Dumux.
Helper classes to compute the integration elements.
Defines an enumeration for the formulations accepted by the two-phase model.
@ p0s1
first phase pressure and second phase saturation as primary variables
auto elementSolution(const Element &element, const SolutionVector &sol, const GridGeometry &gg) -> std::enable_if_t< GridGeometry::discMethod==DiscretizationMethod::box, BoxElementSolution< typename GridGeometry::LocalView, std::decay_t< decltype(std::declval< SolutionVector >()[0])> > >
Make an element solution for box schemes.
Definition: box/elementsolution.hh:115
typename Extrusion< T >::type Extrusion_t
Convenience alias for obtaining the extrusion type.
Definition: extrusion.hh:177
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
Element-wise calculation of the residual and its derivatives for a two-phase, incompressible test pro...
Definition: 2p/incompressiblelocalresidual.hh:52
void addStorageDerivatives(PartialDerivativeMatrix &partialDerivatives, const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const VolumeVariables &curVolVars, const SubControlVolume &scv) const
Adds storage derivatives for wetting and nonwetting phase.
Definition: 2p/incompressiblelocalresidual.hh:94
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 nonwetting phase.
Definition: 2p/incompressiblelocalresidual.hh:548
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 nonwetting phase.
Definition: 2p/incompressiblelocalresidual.hh:129
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 nonwetting phase for cell-centered FVM using TPFA.
Definition: 2p/incompressiblelocalresidual.hh:153
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 wetting and nonwetting phase for box method.
Definition: 2p/incompressiblelocalresidual.hh:282
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 nonwetting phase.
Definition: 2p/incompressiblelocalresidual.hh:463
Element-wise calculation of the residual for problems using the n-phase immiscible fully implicit mod...
Definition: porousmediumflow/immiscible/localresidual.hh:39
Declares all properties used in Dumux.
Element-wise calculation of the residual for problems using the n-phase immiscible fully implicit mod...