diff --git a/dumux/flux/porenetwork/grainfourierslaw.hh b/dumux/flux/porenetwork/grainfourierslaw.hh index c3cb061e4d0180ec947990c80c883bab72948013..cb5947f4e23698d13b089cb8b4c7383fc5baece1 100644 --- a/dumux/flux/porenetwork/grainfourierslaw.hh +++ b/dumux/flux/porenetwork/grainfourierslaw.hh @@ -61,7 +61,7 @@ struct TruncatedPyramidGrainFouriersLaw // the pyramid base length of the inside pore const Scalar insideBaseSideLength = [&]() { - static const bool useAdaptedVolume = getParamFromGroup<bool>(problem.paramGroup(), "Problem.UseVolumeEqualPyramid", false); + static const bool useAdaptedVolume = getParamFromGroup<bool>(problem.paramGroup(), "FouriersLaw.UseVolumeEqualPyramid", false); if (useAdaptedVolume) return getPyramidBaseLengthFromVolume(0.5*insideVolVars.poreVolume(), insideHeight); @@ -72,7 +72,7 @@ struct TruncatedPyramidGrainFouriersLaw // the pyramid base length of the outside pore const Scalar outsideBaseSideLength = [&]() { - static const bool useAdaptedVolume = getParamFromGroup<bool>(problem.paramGroup(), "Problem.UseVolumeEqualPyramid", false); + static const bool useAdaptedVolume = getParamFromGroup<bool>(problem.paramGroup(), "FouriersLaw.UseVolumeEqualPyramid", false); if (useAdaptedVolume) return getPyramidBaseLengthFromVolume(0.5*outsideVolVars.poreVolume(), outsideHeight); diff --git a/dumux/multidomain/dualnetwork/couplingmanager.hh b/dumux/multidomain/dualnetwork/couplingmanager.hh index 27bbf3eac24fab5c5eb1948d1daeb0d0a302f117..24c1bd276a5c83d08e18e175c49384b3c657e7c4 100644 --- a/dumux/multidomain/dualnetwork/couplingmanager.hh +++ b/dumux/multidomain/dualnetwork/couplingmanager.hh @@ -394,7 +394,7 @@ public: enum class FluidTemperatureMode {mean, self, upstream}; static const auto fluidTemperatureMode = [&] { - static const auto mode = getParam<std::string>("Problem.FluidTemperatureMode", "mean"); + static const auto mode = getParam<std::string>("DualNetwork.FluidTemperatureMode", "mean"); std::cout << "Using FluidTemperatureMode " << mode << std::endl; if (mode == "mean") return FluidTemperatureMode::mean; @@ -422,9 +422,9 @@ public: using std::abs; const Scalar Re = DimLessNum::reynoldsNumber(abs(velocity), characteristicLength, meanKinematicViscosity); - static const Scalar fixedLambda = getParam<Scalar>("Problem.FixedConvectionLambda", -1.0); - static const Scalar lambaFactor = getParam<Scalar>("Problem.ConvectionLambaFactor", 0.9); - static const Scalar lambaExponent = getParam<Scalar>("Problem.ConvectionLambaExponent", 0.4); + static const Scalar fixedLambda = getParam<Scalar>("DualNetwork.FixedConvectionLambda", -1.0); + static const Scalar lambaFactor = getParam<Scalar>("DualNetwork.ConvectionLambaFactor", 0.9); + static const Scalar lambaExponent = getParam<Scalar>("DualNetwork.ConvectionLambaExponent", 0.4); using std::pow; const Scalar lambda = fixedLambda > 0.0 ? fixedLambda : 1.0 + lambaFactor*pow(Re, lambaExponent); //approximation: see eq.30 in Koch et al (2021) https://doi.org/10.1007/s11242-021-01602-5 const Scalar selfA = connection.connectionArea / connection.convectionVoidElementIdx.size(); @@ -452,12 +452,12 @@ public: DUNE_THROW(Dune::InvalidStateException, "No neighbor area found"); }; - static const bool useAvgA = getParam<bool>("Problem.UseAverageConvectionArea", false); + static const bool useAvgA = getParam<bool>("DualNetwork.UseAverageConvectionArea", false); const Scalar A = useAvgA ? 0.5*(selfA + neighborA()) : selfA; const Scalar deltaT = (elementCouplingContext_.boundDomainId() == voidDomainIdx) ? (tSolid - tFluid) : (tFluid - tSolid); - static const int verbose = getParam<int>("Problem.SourceVerboseForDof", -1); + static const int verbose = getParam<int>("DualNetwork.SourceVerboseForDof", -1); if (verbose >= 0 && (connection.voidVertexIdx == verbose || connection.solidVertexIdx == verbose)) { std::cout << "\n" << std::endl; @@ -487,7 +487,7 @@ public: { bindCouplingContext(domainI, element); - static const int verbose = getParam<int>("Problem.SourceVerboseForDof", -1); + static const int verbose = getParam<int>("DualNetwork.SourceVerboseForDof", -1); if (scv.dofIndex() == verbose) std::cout << "Start Source at elemn " << fvGeometry.gridGeometry().elementMapper().index(element) << " *******************************" << std::endl; @@ -557,12 +557,12 @@ public: const auto poreRadiusVoid = [&] { - static const bool useExactPoreRadiusVoid = getParam<bool>("Problem.UseExactPoreRadiusVoid", false); + static const bool useExactPoreRadiusVoid = getParam<bool>("DualNetwork.UseExactPoreRadiusVoid", false); if (useExactPoreRadiusVoid) { using std::sqrt; - static const Scalar R = getParam<Scalar>("Problem.SphereRadius", 50e-6); - static const Scalar overlapFactor = getParam<Scalar>("Problem.OverlapFactor"); + static const Scalar R = getParam<Scalar>("DualNetwork.SphereRadius", 50e-6); + static const Scalar overlapFactor = getParam<Scalar>("DualNetwork.OverlapFactor"); static const Scalar dx = overlapFactor*R; static const Scalar r = sqrt(3.0) * dx - R; return r; @@ -573,10 +573,10 @@ public: const auto poreRadiusSolid = [&] { - static const bool useExactPoreRadiusSolid = getParam<bool>("Problem.UseExactPoreRadiusSolid", false); + static const bool useExactPoreRadiusSolid = getParam<bool>("DualNetwork.UseExactPoreRadiusSolid", false); if (useExactPoreRadiusSolid) { - static const Scalar R = getParam<Scalar>("Problem.SphereRadius", 50e-6); + static const Scalar R = getParam<Scalar>("DualNetwork.SphereRadius", 50e-6); return R; } else @@ -624,20 +624,20 @@ public: }(); const Scalar kappa = fluidThermalConductivity / solidThermalConductivity; - static const Scalar Nu = getParam<Scalar>("Problem.Nu", 1.0); - static const Scalar Bi = getParam<Scalar>("Problem.Bi", 1.0); + static const Scalar Nu = getParam<Scalar>("DualNetwork.Nu", 1.0); + static const Scalar Bi = getParam<Scalar>("DualNetwork.Bi", 1.0); - static const bool useExactConnectionLength = getParam<bool>("Problem.UseExactConnectionLength", false); + static const bool useExactConnectionLength = getParam<bool>("DualNetwork.UseExactConnectionLength", false); const Scalar length = useExactConnectionLength ? poreRadiusSolid + poreRadiusVoid : connection.connectionLength; - static const bool useExactConnectionAreaSphere = getParam<bool>("Problem.UseExactConnectionAreaSphere", false); - static const Scalar connectionAreaShapeFactor = getParam<Scalar>("Problem.ConnectionAreaShapeFactor", 0.9); + static const bool useExactConnectionAreaSphere = getParam<bool>("DualNetwork.UseExactConnectionAreaSphere", false); + static const Scalar connectionAreaShapeFactor = getParam<Scalar>("DualNetwork.ConnectionAreaShapeFactor", 0.9); const Scalar area = [&]() { if (useExactConnectionAreaSphere) { - static const Scalar R = getParam<Scalar>("Problem.SphereRadius", 50e-6); - static const Scalar overlapFactor = getParam<Scalar>("Problem.OverlapFactor"); + static const Scalar R = getParam<Scalar>("DualNetwork.SphereRadius", 50e-6); + static const Scalar overlapFactor = getParam<Scalar>("DualNetwork.OverlapFactor"); static const auto dx = overlapFactor*R; static const auto h = R - dx; static const auto interfacialArea = 4*M_PI*R*R - 6*(2*M_PI*R*h); diff --git a/test/multidomain/dualnetwork/fourierslaw.hh b/test/multidomain/dualnetwork/fourierslaw.hh index e3672706c612bcb08ee9a55019bf2e4741f6523b..a14b73be29dfc17b4f378a8a37624fb9956a51b3 100644 --- a/test/multidomain/dualnetwork/fourierslaw.hh +++ b/test/multidomain/dualnetwork/fourierslaw.hh @@ -70,7 +70,7 @@ struct FluidOrGrainPyramidFouriersLaw const auto throatArea = [&]() { - static const Scalar givenArea = getParamFromGroup<Scalar>(problem.paramGroup(), "Problem.ThroatArea", 0.0); + static const Scalar givenArea = getParamFromGroup<Scalar>(problem.paramGroup(), "FouriersLaw.ThroatArea", 0.0); if (givenArea > 0.0) return givenArea; @@ -83,7 +83,7 @@ struct FluidOrGrainPyramidFouriersLaw const Scalar pyramidFrustumTopArea = [&]() { - static const bool realArea = getParamFromGroup<bool>(problem.paramGroup(), "Problem.UseRealThroatAreaInPyramid", true); + static const bool realArea = getParamFromGroup<bool>(problem.paramGroup(), "FouriersLaw.UseRealThroatAreaInPyramid", true); if (realArea) return throatArea; else @@ -96,11 +96,11 @@ struct FluidOrGrainPyramidFouriersLaw const auto getPyramidFrustumBaseArea = [&](const auto& volVars, const Scalar distance) { - static const Scalar givenArea = getParamFromGroup<Scalar>(problem.paramGroup(), "Problem.PoreArea", 0.0); + static const Scalar givenArea = getParamFromGroup<Scalar>(problem.paramGroup(), "FouriersLaw.PoreArea", 0.0); if (givenArea > 0.0) return givenArea; - static const bool realVolume = getParamFromGroup<bool>(problem.paramGroup(), "Problem.UseVolumeEqualPyramid", true); + static const bool realVolume = getParamFromGroup<bool>(problem.paramGroup(), "FouriersLaw.UseVolumeEqualPyramid", true); if (realVolume) { // Using the formula for the volume of a pyramid frustum to calculate its base length and base area: @@ -181,7 +181,7 @@ struct FixedFactorFouriersLaw const auto distanceInside = (insideScv.dofPosition() - throatCenter).two_norm(); const auto distanceOutside = (outsideScv.dofPosition() - throatCenter).two_norm(); - static const Scalar fixedFactor = getParamFromGroup<Scalar>(problem.paramGroup(), "Problem.FixedFourierFactor"); + static const Scalar fixedFactor = getParamFromGroup<Scalar>(problem.paramGroup(), "FouriersLaw.FixedFourierFactor"); const auto insideTransmissibility = insideThermalConducitivity*4*distanceInside*fixedFactor; const auto outsideTransmissibility = outsideThermalConducitivity*4*distanceOutside*fixedFactor; @@ -240,7 +240,7 @@ struct FancyFactorFouriersLaw const auto distance = [&](const auto& scv) { - static const bool useThroatCenter = getParamFromGroup<bool>(problem.paramGroup(), "Problem.UseThroatCenter", true); + static const bool useThroatCenter = getParamFromGroup<bool>(problem.paramGroup(), "FouriersLaw.UseThroatCenter", true); if (useThroatCenter) { const auto throatCenter = problem.spatialParams().throatCenter(eIdx); @@ -248,8 +248,8 @@ struct FancyFactorFouriersLaw } else { - static const Scalar R = getParam<Scalar>("Problem.SphereRadius", 50e-6); - static const Scalar overlapFactor = getParam<Scalar>("Problem.OverlapFactor"); + static const Scalar R = getParam<Scalar>("DualNetwork.SphereRadius", 50e-6); + static const Scalar overlapFactor = getParam<Scalar>("DualNetwork.OverlapFactor"); static const auto dx = overlapFactor*R; return dx; } @@ -278,10 +278,10 @@ struct FancyFactorFouriersLaw return At*(Cinf + ((C0 - Cinf)*(Cinf - 1.0))/((Cinf - 1.0) + kappaFactor*(1.0 - C0))); }; - static const Scalar useExactThroatAreaSphere = getParam<bool>("Problem.UseExactThroatAreaSphere", false); + static const Scalar useExactThroatAreaSphere = getParam<bool>("DualNetwork.UseExactThroatAreaSphere", false); if (useExactThroatAreaSphere) { - static const Scalar R = getParamFromGroup<Scalar>(problem.paramGroup(), "Problem.SphereRadius", 50e-6); + static const Scalar R = getParamFromGroup<Scalar>(problem.paramGroup(), "DualNetwork.SphereRadius", 50e-6); const auto As = [](Scalar x, Scalar dx, Scalar R) { return M_PI*(R - x)*(R + x); }; const auto Asq = [](Scalar x, Scalar dx, Scalar R) { return 4*dx*dx; }; const auto Asemicirc = [](Scalar x, Scalar dx, Scalar R) { @@ -310,10 +310,10 @@ struct FancyFactorFouriersLaw return elemFluxVarsCache[scvf].grainContactArea(); }(); - static const Scalar C0 = isFluid ? getParamFromGroup<Scalar>(problem.paramGroup(), "Problem.C0Fluid") - : getParamFromGroup<Scalar>(problem.paramGroup(), "Problem.C0Solid"); - static const Scalar CinfFactor = isFluid ? getParamFromGroup<Scalar>(problem.paramGroup(), "Problem.CInfFactorFluid") - : getParamFromGroup<Scalar>(problem.paramGroup(), "Problem.CInfFactorSolid"); + static const Scalar C0 = isFluid ? getParamFromGroup<Scalar>(problem.paramGroup(), "FouriersLaw.C0Fluid") + : getParamFromGroup<Scalar>(problem.paramGroup(), "FouriersLaw.C0Solid"); + static const Scalar CinfFactor = isFluid ? getParamFromGroup<Scalar>(problem.paramGroup(), "FouriersLaw.CInfFactorFluid") + : getParamFromGroup<Scalar>(problem.paramGroup(), "FouriersLaw.CInfFactorSolid"); using std::max; const Scalar CinfInside = max(ApInside/At*CinfFactor, 1.0); const Scalar CinfOutside = max(ApOutside/At*CinfFactor, 1.0); @@ -359,7 +359,7 @@ struct ScalingFouriersLaw using Scalar = typename ElementVolumeVariables::VolumeVariables::PrimaryVariables::value_type; const auto deltaT = insideVolVars.temperature() - outsideVolVars.temperature(); - static const bool useScaling = getParamFromGroup<bool>(problem.paramGroup(), "Problem.UseFourierScaling", true); + static const bool useScaling = getParamFromGroup<bool>(problem.paramGroup(), "FouriersLaw.UseFourierScaling", true); if (!useScaling) return transmissibility(problem, element, fvGeometry, elemVolVars, scvf, elemFluxVarsCache) * deltaT; @@ -426,7 +426,7 @@ struct FlexibleFouriersLaw { static const Mode mode = [&]() { - const auto m = getParamFromGroup<std::string>(problem.paramGroup(), "Problem.ThroatConductionType"); + const auto m = getParamFromGroup<std::string>(problem.paramGroup(), "FouriersLaw.ThroatConductionType"); if (m == "Pyramid") return Mode::pyramid; else if (m == "FancyFactor") diff --git a/test/multidomain/dualnetwork/params.input b/test/multidomain/dualnetwork/params.input index 05d9edd9a75a1909552551bf6f34865f328697b9..77b25fed75998cde2425b2aebacefa82ce7c4523 100644 --- a/test/multidomain/dualnetwork/params.input +++ b/test/multidomain/dualnetwork/params.input @@ -12,20 +12,24 @@ EnableGravity = false InitialTemperature = 300 EnableHeating = true PaddingThickness = 5.345e-06 +DualNetworkSourceMode = convection InletIndex = 5 # for z dir OutletIndex = 6 HeaterIndex = 1 -Nu = 1 -Bi = 1 +[FouriersLaw] +ThroatConductionType = FancyFactor C0Fluid = 0.1 C0Solid = 0.45 CInfFactorFluid = 1 CInfFactorSolid = 0.50 + +[DualNetwork] +Nu = 1 +Bi = 1 ConnectionAreaShapeFactor = 0.55 -SourceMode = convection FluidTemperatureMode = self UseAverageConvectionArea = true ConvectionLambaFactor = 0.3 # set to 0.9 for metal @@ -38,7 +42,7 @@ OutletPressure = 0 InletTemperature = 300 OutletTemperature = 300 BottomTemperature = 400 -ThroatConductionType = FancyFactor + UseRobinInlet = true RobinShapeFactor = 1.0 # EnableCoupling = false @@ -47,7 +51,6 @@ RobinShapeFactor = 1.0 Name = solid InletTemperature = 300 BottomTemperature = 400 -ThroatConductionType = FancyFactor UseRobinInlet = true RobinShapeFactor = 1.0 # EnableCoupling = false diff --git a/test/multidomain/dualnetwork/problem_solid.hh b/test/multidomain/dualnetwork/problem_solid.hh index 4dd666c7278658c78ed4def802ded081795d1f19..0aa84247a6e492257dd3800b10814765cabdf72f 100644 --- a/test/multidomain/dualnetwork/problem_solid.hh +++ b/test/multidomain/dualnetwork/problem_solid.hh @@ -59,7 +59,7 @@ public: inletIndex_ = getParamFromGroup<int>(this->paramGroup(), "Problem.InletIndex"); heaterIndex_ = getParamFromGroup<int>(this->paramGroup(), "Problem.HeaterIndex"); - const auto mode = getParamFromGroup<std::string>(this->paramGroup(), "Problem.SourceMode", "max"); + const auto mode = getParamFromGroup<std::string>(this->paramGroup(), "Problem.DualNetworkSourceMode", "max"); if (mode == "conduction") sourceMode_ = SourceMode::conduction; else if (mode == "convection") diff --git a/test/multidomain/dualnetwork/problem_void.hh b/test/multidomain/dualnetwork/problem_void.hh index 95a049f5dba418ef026a194dcf477f6fe5fd9bc8..f2761da3f864fc838cefaf5d159b09db195064f4 100644 --- a/test/multidomain/dualnetwork/problem_void.hh +++ b/test/multidomain/dualnetwork/problem_void.hh @@ -68,7 +68,7 @@ public: outletIndex_ = getParamFromGroup<int>(this->paramGroup(), "Problem.OutletIndex"); heaterIndex_ = getParamFromGroup<int>(this->paramGroup(), "Problem.HeaterIndex"); - const auto mode = getParamFromGroup<std::string>(this->paramGroup(), "Problem.SourceMode", "max"); + const auto mode = getParamFromGroup<std::string>(this->paramGroup(), "Problem.DualNetworkSourceMode", "max"); if (mode == "conduction") sourceMode_ = SourceMode::conduction; else if (mode == "convection")