From d7bda623c34a6130f061e455b00f4bd885ebe1e3 Mon Sep 17 00:00:00 2001 From: DennisGlaeser <dennis.glaeser@iws.uni-stuttgart.de> Date: Fri, 23 Dec 2016 15:41:35 +0100 Subject: [PATCH] [1p] port ni tests to new interface The tests fail, but they do so because the output has changed. This has to be checked again.[1p] port ni tests to new interface The tests fail, but they do so because the output has changed. This has to be checked again.[1p] port ni tests to new interface The tests fail, but they do so because the output has changed. This has to be checked again.[1p] port ni tests to new interface The tests fail, but they do so because the output has changed. This has to be checked again.[1p] port ni tests to new interface The tests fail, but they do so because the output has changed. This has to be checked again.[1p] port ni tests to new interface The tests fail, but they do so because the output has changed. This has to be checked again.[1p] port ni tests to new interface The tests fail, but they do so because the output has changed. This has to be checked again.[1p] port ni tests to new interface The tests fail, but they do so because the output has changed. This has to be checked again. --- .../cellcentered/tpfa/fourierslaw.hh | 30 +++---- .../1p/implicit/1pniconductionproblem.hh | 13 ++-- .../1p/implicit/1pniconvectionproblem.hh | 10 +-- .../1p/implicit/1pnispatialparams.hh | 78 +++++-------------- 4 files changed, 43 insertions(+), 88 deletions(-) diff --git a/dumux/discretization/cellcentered/tpfa/fourierslaw.hh b/dumux/discretization/cellcentered/tpfa/fourierslaw.hh index ef480ea410..1806ae63da 100644 --- a/dumux/discretization/cellcentered/tpfa/fourierslaw.hh +++ b/dumux/discretization/cellcentered/tpfa/fourierslaw.hh @@ -141,7 +141,7 @@ private: const auto& insideVolVars = elemVolVars[insideScvIdx]; auto insideLambda = ThermalConductivityModel::effectiveThermalConductivity(insideVolVars, problem.spatialParams(), element, fvGeometry, insideScv); - Scalar ti = calculateOmega_(problem, element, scvf, insideLambda, insideScv); + Scalar ti = calculateOmega_(scvf, insideLambda, insideScv, insideVolVars.extrusionFactor()); // for the boundary (dirichlet) or at branching points we only need ti if (scvf.boundary() || scvf.numOutsideScvs() > 1) @@ -164,9 +164,9 @@ private: Scalar tj; if (dim == dimWorld) // assume the normal vector from outside is anti parallel so we save flipping a vector - tj = -1.0*calculateOmega_(problem, outsideElement, scvf, outsideLambda, outsideScv); + tj = -1.0*calculateOmega_(scvf, outsideLambda, outsideScv, outsideVolVars.extrusionFactor()); else - tj = calculateOmega_(problem, outsideElement, fvGeometry.flipScvf(scvf.index()), outsideLambda, outsideScv); + tj = calculateOmega_(fvGeometry.flipScvf(scvf.index()), outsideLambda, outsideScv, outsideVolVars.extrusionFactor()); // check for division by zero! if (ti*tj <= 0.0) @@ -178,11 +178,10 @@ private: return tij; } - static Scalar calculateOmega_(const Problem& problem, - const Element& element, - const SubControlVolumeFace& scvf, - const DimWorldMatrix &lambda, - const SubControlVolume &scv) + static Scalar calculateOmega_(const SubControlVolumeFace& scvf, + const DimWorldMatrix& lambda, + const SubControlVolume& scv, + Scalar extrusionFactor) { GlobalPosition lambdaNormal; lambda.mv(scvf.unitOuterNormal(), lambdaNormal); @@ -192,25 +191,20 @@ private: distanceVector /= distanceVector.two_norm2(); Scalar omega = lambdaNormal * distanceVector; - omega *= problem.boxExtrusionFactor(element, scv); - - return omega; + return omega*extrusionFactor; } - static Scalar calculateOmega_(const Problem& problem, - const Element& element, - const SubControlVolumeFace& scvf, + static Scalar calculateOmega_(const SubControlVolumeFace& scvf, Scalar lambda, - const SubControlVolume &scv) + const SubControlVolume &scv, + Scalar extrusionFactor) { auto distanceVector = scvf.ipGlobal(); distanceVector -= scv.center(); distanceVector /= distanceVector.two_norm2(); Scalar omega = lambda * (distanceVector * scvf.unitOuterNormal()); - omega *= problem.boxExtrusionFactor(element, scv); - - return omega; + return omega*extrusionFactor; } }; diff --git a/test/porousmediumflow/1p/implicit/1pniconductionproblem.hh b/test/porousmediumflow/1p/implicit/1pniconductionproblem.hh index d62855be9b..07751e5324 100644 --- a/test/porousmediumflow/1p/implicit/1pniconductionproblem.hh +++ b/test/porousmediumflow/1p/implicit/1pniconductionproblem.hh @@ -103,6 +103,7 @@ class OnePNIConductionProblem : public ImplicitPorousMediaProblem<TypeTag> using TimeManager = typename GET_PROP_TYPE(TypeTag, TimeManager); using ThermalConductivityModel = typename GET_PROP_TYPE(TypeTag, ThermalConductivityModel); using ElementVolumeVariables = typename GET_PROP_TYPE(TypeTag, ElementVolumeVariables); + using ElementSolution = typename GET_PROP_TYPE(TypeTag, ElementSolutionVector); using VolumeVariables = typename GET_PROP_TYPE(TypeTag, VolumeVariables); // copy some indices for convenience @@ -168,20 +169,20 @@ public: auto& temperature = *(this->resultWriter().allocateManagedBuffer(numDofs)); const auto someElement = *(elements(this->gridView()).begin()); - const auto initialPriVars = initial_(GlobalPosition(0.0)); + const auto someElemSol = this->model().elementSolution(someElement, this->model().curSol()); auto someFvGeometry = localView(this->model().globalFvGeometry()); someFvGeometry.bindElement(someElement); const auto someScv = *(scvs(someFvGeometry).begin()); VolumeVariables volVars; - volVars.update(initialPriVars, *this, someElement, someScv); + volVars.update(someElemSol, *this, someElement, someScv); - const auto porosity = this->spatialParams().porosity(someScv); + const auto porosity = this->spatialParams().porosity(someElement, someScv, someElemSol); const auto densityW = volVars.density(); const auto heatCapacityW = FluidSystem::heatCapacity(volVars.fluidState(), 0); - const auto densityS = this->spatialParams().solidDensity(someElement, someScv); - const auto heatCapacityS = this->spatialParams().solidHeatCapacity(someElement, someScv); + const auto densityS = this->spatialParams().solidDensity(someElement, someScv, someElemSol); + const auto heatCapacityS = this->spatialParams().solidHeatCapacity(someElement, someScv, someElemSol); const auto storage = densityW*heatCapacityW*porosity + densityS*heatCapacityS*(1 - porosity); const auto effectiveThermalConductivity = ThermalConductivityModel::effectiveThermalConductivity(volVars, this->spatialParams(), someElement, someFvGeometry, someScv); @@ -197,7 +198,7 @@ public: auto globalIdx = scv.dofIndex(); const auto& globalPos = scv.dofPosition(); - temperatureExact[globalIdx] = temperatureHigh_ + (initialPriVars[temperatureIdx] - temperatureHigh_) + temperatureExact[globalIdx] = temperatureHigh_ + (someElemSol[0][temperatureIdx] - temperatureHigh_) *std::erf(0.5*std::sqrt(globalPos[0]*globalPos[0]*storage/time/effectiveThermalConductivity)); temperature[globalIdx] = this->model().curSol()[globalIdx][temperatureIdx]; } diff --git a/test/porousmediumflow/1p/implicit/1pniconvectionproblem.hh b/test/porousmediumflow/1p/implicit/1pniconvectionproblem.hh index 54d81ac8bc..1a5e578e08 100644 --- a/test/porousmediumflow/1p/implicit/1pniconvectionproblem.hh +++ b/test/porousmediumflow/1p/implicit/1pniconvectionproblem.hh @@ -176,21 +176,21 @@ public: auto& temperature = *(this->resultWriter().allocateManagedBuffer(numDofs)); const auto someElement = *(elements(this->gridView()).begin()); - const auto initialPriVars = initial_(GlobalPosition(0.0)); + const auto someElemSol = this->model().elementSolution(someElement, this->model().curSol()); auto someFvGeometry = localView(this->model().globalFvGeometry()); someFvGeometry.bindElement(someElement); const auto someScv = *(scvs(someFvGeometry).begin()); VolumeVariables volVars; - volVars.update(initialPriVars, *this, someElement, someScv); + volVars.update(someElemSol, *this, someElement, someScv); - const auto porosity = this->spatialParams().porosity(someScv); + const auto porosity = this->spatialParams().porosity(someElement, someScv, someElemSol); const auto densityW = volVars.density(); const auto heatCapacityW = FluidSystem::heatCapacity(volVars.fluidState(), 0); const auto storageW = densityW*heatCapacityW*porosity; - const auto densityS = this->spatialParams().solidDensity(someElement, someScv); - const auto heatCapacityS = this->spatialParams().solidHeatCapacity(someElement, someScv); + const auto densityS = this->spatialParams().solidDensity(someElement, someScv, someElemSol); + const auto heatCapacityS = this->spatialParams().solidHeatCapacity(someElement, someScv, someElemSol); const auto storageTotal = storageW + densityS*heatCapacityS*(1 - porosity); std::cout << "storage: " << storageTotal << std::endl; diff --git a/test/porousmediumflow/1p/implicit/1pnispatialparams.hh b/test/porousmediumflow/1p/implicit/1pnispatialparams.hh index e353a398db..4fb0346274 100644 --- a/test/porousmediumflow/1p/implicit/1pnispatialparams.hh +++ b/test/porousmediumflow/1p/implicit/1pnispatialparams.hh @@ -49,96 +49,56 @@ class OnePNISpatialParams : public ImplicitSpatialParamsOneP<TypeTag> using VolumeVariables = typename GET_PROP_TYPE(TypeTag, VolumeVariables); using Element = typename GridView::template Codim<0>::Entity; + static const int dimWorld = GridView::dimensionworld; + using GlobalPosition = Dune::FieldVector<Scalar, dimWorld>; + public: OnePNISpatialParams(const Problem& problem, const GridView &gridView) - : ParentType(problem, gridView) - { - permeability_ = 1e-10; - porosity_ = 0.4; - - // heat conductivity of granite - lambdaSolid_ = 2.8; - } + : ParentType(problem, gridView) {} /*! * \brief Define the intrinsic permeability \f$\mathrm{[m^2]}\f$. * - * \param element The finite element - * \param scv The sub control volume + * \param globalPos The global position */ - Scalar intrinsicPermeability(const SubControlVolume& scv, - const VolumeVariables& volVars) const - { - return permeability_; - } + Scalar permeabilityAtPos(const GlobalPosition& globalPos) const + { return 1e-10; } /*! * \brief Define the porosity \f$\mathrm{[-]}\f$. * - * \param element The finite element - * \param scv The sub control volume + * \param globalPos The global position */ - Scalar porosity(const SubControlVolume& scv) const - { - return porosity_; - } - - /*! - * \brief Define the dispersivity. - * - * \param element The finite element - * \param scv The sub control volume - */ - Scalar dispersivity(const Element &element, - const SubControlVolume& scv) const - { - return 0; - } + Scalar porosityAtPos(const GlobalPosition& globalPos) const + { return 0.4; } /*! * \brief Returns the heat capacity \f$[J / (kg K)]\f$ of the rock matrix. * * This is only required for non-isothermal models. * - * \param element The finite element - * \param scv The sub control volume + * \param globalPos The global position */ - Scalar solidHeatCapacity(const Element &element, - const SubControlVolume& scv) const - { - return 790; // specific heat capacity of granite [J / (kg K)] - } + Scalar solidHeatCapacityAtPos(const GlobalPosition& globalPos) const + { return 790; /*specific heat capacity of granite [J / (kg K)]*/ } /*! * \brief Returns the mass density \f$[kg / m^3]\f$ of the rock matrix. * * This is only required for non-isothermal models. * - * \param element The finite element - * \param scv The sub control volume + * \param globalPos The global position */ - Scalar solidDensity(const Element &element, - const SubControlVolume& scv) const - { - return 2700; // density of granite [kg/m^3] - } + Scalar solidDensityAtPos(const GlobalPosition& globalPos) const + { return 2700; /*density of granite [kg/m^3]*/ } /*! * \brief Returns the thermal conductivity \f$\mathrm{[W/(m K)]}\f$ of the porous material. * - * \param element The finite element - * \param scv The sub control volume + * \param globalPos The global position */ - Scalar solidThermalConductivity(const Element &element, - const SubControlVolume& scv) const - { - return lambdaSolid_; - } - -private: - Scalar permeability_; - Scalar porosity_; - Scalar lambdaSolid_; + Scalar solidThermalConductivityAtPos(const GlobalPosition& globalPos) const + { return 2.8; } }; } // end namespace Dumux -- GitLab