| Line | Branch | Exec | Source |
|---|---|---|---|
| 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 | // SPDX-FileCopyrightText: Copyright © DuMux Project contributors, see AUTHORS.md in root folder | ||
| 5 | // SPDX-License-Identifier: GPL-3.0-or-later | ||
| 6 | // | ||
| 7 | /*! | ||
| 8 | * \file | ||
| 9 | * \ingroup TwoPTwoCTests | ||
| 10 | * \brief The spatial parameters for the 2p2c chemical nonequilibrium problem. | ||
| 11 | */ | ||
| 12 | |||
| 13 | #ifndef DUMUX_MPNC_COMPARISON_SPATIAL_PARAMS_HH | ||
| 14 | #define DUMUX_MPNC_COMPARISON_SPATIAL_PARAMS_HH | ||
| 15 | |||
| 16 | #include <dumux/porousmediumflow/properties.hh> | ||
| 17 | #include <dumux/porousmediumflow/fvspatialparams.hh> | ||
| 18 | #include <dumux/porousmediumflow/fvspatialparamsnonequilibrium.hh> | ||
| 19 | |||
| 20 | #include <dumux/material/fluidmatrixinteractions/2p/brookscorey.hh> | ||
| 21 | #include <dumux/material/fluidmatrixinteractions/2p/interfacialarea/interfacialarea.hh> | ||
| 22 | #include <dumux/material/fluidmatrixinteractions/2p/interfacialarea/pcmax.hh> | ||
| 23 | |||
| 24 | namespace Dumux { | ||
| 25 | |||
| 26 | /** | ||
| 27 | * \ingroup TwoPTwoCTests | ||
| 28 | * \brief The spatial parameters for the 2p2c chemical nonequilibrium problem. | ||
| 29 | */ | ||
| 30 | template<class GridGeometry, class Scalar> | ||
| 31 | class TwoPTwoCChemicalNonequilibriumSpatialParams | ||
| 32 | : public FVPorousMediumFlowSpatialParamsNonEquilibrium<GridGeometry, Scalar, | ||
| 33 | TwoPTwoCChemicalNonequilibriumSpatialParams<GridGeometry, Scalar>> | ||
| 34 | { | ||
| 35 | using GridView = typename GridGeometry::GridView; | ||
| 36 | using FVElementGeometry = typename GridGeometry::LocalView; | ||
| 37 | using SubControlVolume = typename FVElementGeometry::SubControlVolume; | ||
| 38 | |||
| 39 | using Element = typename GridView::template Codim<0>::Entity; | ||
| 40 | using ThisType = TwoPTwoCChemicalNonequilibriumSpatialParams<GridGeometry, Scalar>; | ||
| 41 | using ParentType = FVPorousMediumFlowSpatialParamsNonEquilibrium<GridGeometry, Scalar, ThisType>; | ||
| 42 | |||
| 43 | using GlobalPosition = typename Element::Geometry::GlobalCoordinate; | ||
| 44 | |||
| 45 | enum {dimWorld=GridView::dimensionworld}; | ||
| 46 | |||
| 47 | using PcKrSwCurve = FluidMatrix::BrooksCoreyDefault<Scalar>; | ||
| 48 | |||
| 49 | using WettingNonwettingInterfacialArea = FluidMatrix::InterfacialArea<Scalar, | ||
| 50 | FluidMatrix::InterfacialAreaPcMax, | ||
| 51 | FluidMatrix::WettingNonwettingInterfacialAreaPcSw>; | ||
| 52 | public: | ||
| 53 | //! Export permeability type | ||
| 54 | using PermeabilityType = Scalar; | ||
| 55 | |||
| 56 | 2 | TwoPTwoCChemicalNonequilibriumSpatialParams(std::shared_ptr<const GridGeometry> gridGeometry) | |
| 57 | : ParentType(gridGeometry) | ||
| 58 | 2 | , permeability_(1e-11) | |
| 59 | 2 | , porosity_(0.4) | |
| 60 |
4/8✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
|
6 | , pcKrSwCurve_("SpatialParams") |
| 61 | { | ||
| 62 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | characteristicLength_ = getParam<Scalar>("SpatialParams.MeanPoreSize"); |
| 63 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | factorMassTransfer_ = getParam<Scalar>("SpatialParams.MassTransferFactor"); |
| 64 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | temperature_ = 273.15 + 25; // -> 25°C |
| 65 | |||
| 66 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
4 | auto anwParams = WettingNonwettingInterfacialArea::makeBasicParams("SpatialParams.WettingNonwettingArea"); |
| 67 | |||
| 68 | // determine maximum capillary pressure for wetting-nonwetting surface | ||
| 69 |
1/2✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
|
2 | anwParams.setPcMax(pcKrSwCurve_.pc(/*sw = */0.0)); |
| 70 | |||
| 71 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
2 | aNw_ = std::make_unique<WettingNonwettingInterfacialArea>(anwParams); |
| 72 | 2 | } | |
| 73 | |||
| 74 | template<class ElementSolution> | ||
| 75 | 394268 | PermeabilityType permeability(const Element& element, | |
| 76 | const SubControlVolume& scv, | ||
| 77 | const ElementSolution& elemSol) const | ||
| 78 | { | ||
| 79 | 394268 | return permeability_; | |
| 80 | } | ||
| 81 | |||
| 82 | /*! | ||
| 83 | * \brief Defines the porosity \f$[-]\f$ of the soil | ||
| 84 | * | ||
| 85 | * \param globalPos The global position of the sub-control volume. | ||
| 86 | * \return the material parameters object | ||
| 87 | */ | ||
| 88 | 394268 | Scalar porosityAtPos(const GlobalPosition& globalPos) const | |
| 89 | { | ||
| 90 | 394268 | return porosity_; | |
| 91 | } | ||
| 92 | |||
| 93 | /*! | ||
| 94 | * \brief Returns the fluid-matrix interaction law at a given location | ||
| 95 | */ | ||
| 96 | 1182804 | auto fluidMatrixInteractionAtPos(const GlobalPosition& globalPos) const | |
| 97 | { | ||
| 98 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 394268 times.
|
788536 | return makeFluidMatrixInteraction(pcKrSwCurve_, *aNw_); |
| 99 | } | ||
| 100 | |||
| 101 | /*! | ||
| 102 | * \brief Returns the characteristic length for the mass transfer. | ||
| 103 | * | ||
| 104 | * \param globalPos The position in global coordinates. | ||
| 105 | */ | ||
| 106 | 394268 | const Scalar characteristicLengthAtPos(const GlobalPosition & globalPos) const | |
| 107 | 394268 | { return characteristicLength_ ; } | |
| 108 | |||
| 109 | /*! | ||
| 110 | * \brief Return the pre factor the the energy transfer. | ||
| 111 | * | ||
| 112 | * \param globalPos The position in global coordinates. | ||
| 113 | */ | ||
| 114 | 394268 | const Scalar factorMassTransferAtPos(const GlobalPosition & globalPos) const | |
| 115 | 394268 | { return factorMassTransfer_; } | |
| 116 | |||
| 117 | /*! | ||
| 118 | * \brief Function for defining which phase is to be considered as the wetting phase. | ||
| 119 | * | ||
| 120 | * \param globalPos The global position of the sub-control volume. | ||
| 121 | * \return The wetting phase index | ||
| 122 | */ | ||
| 123 | template<class FluidSystem> | ||
| 124 | int wettingPhaseAtPos(const GlobalPosition& globalPos) const | ||
| 125 | { return FluidSystem::H2OIdx; } | ||
| 126 | |||
| 127 | /*! | ||
| 128 | * \brief Returns the temperature in the domain at the given position | ||
| 129 | * \param globalPos The position in global coordinates where the temperature should be specified. | ||
| 130 | */ | ||
| 131 | 19373 | Scalar temperatureAtPos (const GlobalPosition& globalPos) const | |
| 132 | { | ||
| 133 |
2/4✓ Branch 1 taken 681 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 141 times.
✗ Branch 5 not taken.
|
19173 | return temperature_; |
| 134 | } | ||
| 135 | |||
| 136 | private: | ||
| 137 | |||
| 138 | const Scalar permeability_; | ||
| 139 | const Scalar porosity_; | ||
| 140 | static constexpr Scalar eps_ = 1e-6; | ||
| 141 | |||
| 142 | const PcKrSwCurve pcKrSwCurve_; | ||
| 143 | std::unique_ptr<const WettingNonwettingInterfacialArea> aNw_; | ||
| 144 | |||
| 145 | Scalar factorMassTransfer_ ; | ||
| 146 | Scalar characteristicLength_ ; | ||
| 147 | Scalar temperature_; | ||
| 148 | }; | ||
| 149 | |||
| 150 | } // end namespace Dumux | ||
| 151 | |||
| 152 | #endif | ||
| 153 |