diff --git a/doc/doxygen/images/effectiveareasforconduction_dnm.png b/doc/doxygen/images/effectiveareasforconduction_dnm.png new file mode 100644 index 0000000000000000000000000000000000000000..a937bfeeabe2ec9cec9ef1f24e9ed8cfba043680 Binary files /dev/null and b/doc/doxygen/images/effectiveareasforconduction_dnm.png differ diff --git a/test/multidomain/dualnetwork/fourierslaw.hh b/test/multidomain/dualnetwork/fourierslaw.hh index 1f0e3b2a4fc1ccdd80d0022f6267d63fe43c00ed..1a29d80ecb6d99bad8dad18b73f89dcaad548fdb 100644 --- a/test/multidomain/dualnetwork/fourierslaw.hh +++ b/test/multidomain/dualnetwork/fourierslaw.hh @@ -17,6 +17,10 @@ namespace Dumux::PoreNetwork { +/*! +* \ingroup DualNetworkCoupling +* \brief Implements a Fourier's law assuming pyramid frustum shapes for the geometry from pore bodies to pore throats. +*/ template<bool isFluid> struct FluidOrGrainPyramidFouriersLaw { @@ -130,6 +134,10 @@ struct FluidOrGrainPyramidFouriersLaw } }; +/*! +* \ingroup DualNetworkCoupling +* \brief Implements a Fourier's law and scales the transmissibillity with a fixed, user-defined factor. +*/ template<bool isFluid> struct FixedFactorFouriersLaw { @@ -190,8 +198,24 @@ struct FixedFactorFouriersLaw } }; +/*! +* \ingroup DualNetworkCoupling +* \brief Implements a Fourier's law taking effective areas available for conduction into account. +* +* This Fourier's law is based on the work of Koch et al (2021) https://doi.org/10.1007/s11242-021-01602-5. +* It assumes pyramid frustum shapes for the geometry from pore bodies to pore throats, but not taking the full area +* of pore bodies into account, but the effective areas available for conduction. +* +* Depending on the conductivity ratio between the fluid and the solid \f$ \kappa = \frac{\Å‚ambda_s}{\lambda_s}\f$, +* the area available for conduction of heat through each phase might be restricted due to the other phase. +* The effective areas available for heat conduction in the solid are shown in the picture below: +* \image html effectiveareasforconduction_dnm.png +* This picture (figure 3) was taken from Koch et al (2021) https://doi.org/10.1007/s11242-021-01602-5. +* \f$A_{A}\f$ denotes here the contact area between two grains (solid bodies) and +* \f$\tilde{A}\f$ denotes the effective area of the solid body. +*/ template<bool isFluid> -struct FancyFactorFouriersLaw +struct FluidSolidEffectiveAreasFouriersLaw { template<class Problem, class Element, class FVElementGeometry, class ElementVolumeVariables, class ElementFluxVariablesCache> @@ -219,6 +243,7 @@ struct FancyFactorFouriersLaw const typename FVElementGeometry::SubControlVolumeFace& scvf, const ElementFluxVariablesCache& elemFluxVarsCache) { + //For transmissibillity calculation see section 5.2 in Koch et al (2021) https://doi.org/10.1007/s11242-021-01602-5 using Scalar = typename ElementVolumeVariables::VolumeVariables::PrimaryVariables::value_type; const auto& insideScv = fvGeometry.scv(scvf.insideScvIdx()); @@ -270,6 +295,7 @@ struct FancyFactorFouriersLaw const Scalar ApInside = insideVolVars.poreVolume()/(2.0*distanceInside); const Scalar ApOutside = outsideVolVars.poreVolume()/(2.0*distanceOutside); + //For effective areas see figure 3 in Koch et al (2021) https://doi.org/10.1007/s11242-021-01602-5 Scalar effectiveAreaInside = 0.0; Scalar effectiveAreaOutside = 0.0; Scalar At = 0.0; @@ -341,6 +367,11 @@ struct FancyFactorFouriersLaw } }; +/*! +* \ingroup DualNetworkCoupling +* \brief Implements a Fourier's law and scales a fixed transmissibillity with a factor +* depending on the position of the throat. +*/ template<class BaseLaw> struct ScalingFouriersLaw { @@ -397,7 +428,7 @@ struct ScalingFouriersLaw template<bool isFluid> struct FlexibleFouriersLaw { - enum class Mode {pyramid, fixedFactor, fancyFactor, tpfa}; + enum class Mode {pyramid, fixedFactor, fluidSolidEffectiveAreas, tpfa}; template<class Problem, class Element, class FVElementGeometry, class ElementVolumeVariables, class ElementFluxVariablesCache> @@ -430,8 +461,8 @@ struct FlexibleFouriersLaw const auto m = getParamFromGroup<std::string>(problem.paramGroup(), "FouriersLaw.ThroatConductionType"); if (m == "Pyramid") return Mode::pyramid; - else if (m == "FancyFactor") - return Mode::fancyFactor; + else if (m == "FluidSolidEffectiveAreas") + return Mode::fluidSolidEffectiveAreas; else if (m == "FixedFactor") return Mode::fixedFactor; else @@ -442,8 +473,8 @@ struct FlexibleFouriersLaw return FluidOrGrainPyramidFouriersLaw<isFluid>::transmissibility(problem, element, fvGeometry, elemVolVars, scvf, elemFluxVarsCache); else if (mode == Mode::fixedFactor) return FixedFactorFouriersLaw<isFluid>::transmissibility(problem, element, fvGeometry, elemVolVars, scvf, elemFluxVarsCache); - else if (mode == Mode::fancyFactor) - return FancyFactorFouriersLaw<isFluid>::transmissibility(problem, element, fvGeometry, elemVolVars, scvf, elemFluxVarsCache); + else if (mode == Mode::fluidSolidEffectiveAreas) + return FluidSolidEffectiveAreasFouriersLaw<isFluid>::transmissibility(problem, element, fvGeometry, elemVolVars, scvf, elemFluxVarsCache); else return 0.0; // TODO implement TPFA } }; diff --git a/test/multidomain/dualnetwork/params.input b/test/multidomain/dualnetwork/params.input index 77b25fed75998cde2425b2aebacefa82ce7c4523..db7d4f519ac2766f2b26882ad3bcff1fd6208be8 100644 --- a/test/multidomain/dualnetwork/params.input +++ b/test/multidomain/dualnetwork/params.input @@ -19,7 +19,7 @@ OutletIndex = 6 HeaterIndex = 1 [FouriersLaw] -ThroatConductionType = FancyFactor +ThroatConductionType = FluidSolidEffectiveAreas C0Fluid = 0.1 C0Solid = 0.45 CInfFactorFluid = 1