diff --git a/dumux/boxmodels/1p2c/1p2cboundaryvariables.hh b/dumux/boxmodels/1p2c/1p2cboundaryvariables.hh deleted file mode 100644 index eb7c4c75ed66dfb16e3a8ffa3e42e7f3a48b244e..0000000000000000000000000000000000000000 --- a/dumux/boxmodels/1p2c/1p2cboundaryvariables.hh +++ /dev/null @@ -1,324 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * Copyright (C) 2010 by Katherina Baber, Klaus Mosthaf * - * Copyright (C) 2008-2009 by Bernd Flemisch, Andreas Lauser * - * Institute of Hydraulic Engineering * - * University of Stuttgart, Germany * - * email: <givenname>.<name>@iws.uni-stuttgart.de * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see <http://www.gnu.org/licenses/>. * - *****************************************************************************/ -/*! - * \file - * - * \brief This file contains the data which is required to calculate - * all fluxes of the fluid phase over the boundary of a finite volume. - * - * This means pressure and temperature gradients, phase densities at - * the integration point of the boundary, etc. - */ -#ifndef DUMUX_1P2C_BOUNDARY_VARIABLES_HH -#define DUMUX_1P2C_BOUNDARY_VARIABLES_HH - -#include <dumux/common/math.hh> -#include "1p2cproperties.hh" - -namespace Dumux -{ - -/*! - * \ingroup OnePTwoCModel - * \brief This template class contains the data which is required to - * calculate the fluxes of the fluid phases over the boundary of a - * finite volume for the 1p2c model. - * - * This means pressure and velocity gradients, phase density and viscosity at - * the integration point of the boundary, etc. - */ -template <class TypeTag> -class OnePTwoCBoundaryVariables -{ - typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem; - typedef typename GET_PROP_TYPE(TypeTag, VolumeVariables) VolumeVariables; - typedef typename GET_PROP_TYPE(TypeTag, ElementVolumeVariables) ElementVolumeVariables; - - typedef typename GET_PROP_TYPE(TypeTag, OnePTwoCIndices) Indices; - enum { - phaseIdx = Indices::phaseIdx, - comp0Idx = Indices::comp0Idx, - comp1Idx = Indices::comp1Idx - }; - - typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; - typedef typename GridView::template Codim<0>::Entity Element; - enum { dim = GridView::dimension }; - - typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; - typedef Dune::FieldVector<Scalar, dim> Vector; - typedef Dune::FieldMatrix<Scalar, dim, dim> Tensor; - - typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry; - typedef typename FVElementGeometry::BoundaryFace BoundaryFace; - -public: - OnePTwoCBoundaryVariables(const Problem &problem, - const Element &element, - const FVElementGeometry &elemGeom, - int boundaryFaceIdx, - const ElementVolumeVariables &elemDat, - int scvIdx) - : fvElemGeom_(elemGeom), scvIdx_(scvIdx) - { - boundaryFace_ = &fvElemGeom_.boundaryFace[boundaryFaceIdx]; - - pressureAtBIP_ = Scalar(0); - massFractionAtBIP_ = Scalar(0); - densityAtIP_ = Scalar(0); - viscosityAtIP_ = Scalar(0); - molarDensityAtIP_ = Scalar(0); - potentialGrad_ = Scalar(0); - concentrationGrad_ = Scalar(0); - moleFracGrad_ = Scalar(0); - massFracGrad_ = Scalar(0); - K_= Scalar(0); - - calculateBoundaryValues_(problem, element, elemDat); - }; - - /*! - * \brief Return the pressure potential multiplied with the - * intrinsic permeability which goes from vertex i to - * vertex j. - * - * Note that the length of the face's normal is the area of the - * phase, so this is not the actual velocity by the integral of - * the velocity over the face's area. Also note that the phase - * mobility is not yet included here since this would require a - * decision on the upwinding approach (which is done in the - * actual model). - */ - Scalar KmvpNormal() const - { return KmvpNormal_; } - - /*! - * \brief The binary diffusion coefficient for each fluid phase in the porous medium. - */ - Scalar porousDiffCoeff() const - { return porousDiffCoeff_; }; - - /*! - * \brief Return pressure \f$\mathrm{[Pa]}\f$ of a phase at the integration - * point. - */ - Scalar pressureAtBIP() const - { return pressureAtBIP_; } - - /*! - * \brief Return massFraction \f$\mathrm{[-]}\f$ of component 1 at the integration - * point. - */ - Scalar massFractionAtBIP() const - { return massFractionAtBIP_; } - - /*! - * \brief Return density \f$\mathrm{[kg/m^3]}\f$ of a phase at the integration - * point. - */ - Scalar densityAtIP() const - { return densityAtIP_; } - - /*! - * \brief Return viscosity \f$\mathrm{[Pa s]}\f$ of a phase at the integration - * point. - */ - Scalar viscosityAtIP() const - { return viscosityAtIP_; } - - /*! - * \brief Return molar density \f$\mathrm{[mol/m^3]}\f$ of a phase at the integration - * point. - */ - Scalar molarDensityAtIP() const - { return molarDensityAtIP_; } - - /*! - * \brief The concentration gradient of a component in a phase. - * - * \param compIdx The index of the considered component - */ - const Vector &concentrationGrad(int compIdx) const - { - if (compIdx != 1) - { DUNE_THROW(Dune::InvalidStateException, - "The 1p2c model is supposed to need " - "only the concentration gradient of " - "the second component!"); } - return concentrationGrad_; - }; - - /*! - * \brief The molar concentration gradient of a component in a phase. - * - * \param compIdx The index of the considered component - */ - const Vector &moleFracGrad(int compIdx) const - { - if (compIdx != 1) - { DUNE_THROW(Dune::InvalidStateException, - "The 1p2c model is supposed to need " - "only the concentration gradient of " - "the second component!"); } - return moleFracGrad_; - }; - - /*! - * \brief The mass fraction gradient of a component in a phase. - * - * \param compIdx The index of the considered component - */ - const Vector &massFracGrad(int compIdx) const - { - if (compIdx != 1) - { DUNE_THROW(Dune::InvalidStateException, - "The 1p2c model is supposed to need " - "only the concentration gradient of " - "the second component!"); } - return massFracGrad_; - }; - - const FVElementGeometry &fvElemGeom() const - { return fvElemGeom_; } - - const BoundaryFace& boundaryFace() const - { return *boundaryFace_; } - -protected: - - /*! - * \brief Transforms scalar permeability into tensor. - * - * \param k scalar permeability - * - */ - void calculateK_(Scalar k) - { - K_[0][0] = K_[1][1] = k; - } - - void calculateK_(Tensor K) - { - K_ = K; - } - /*! - * \brief Calculation of the pressure and concentration gradients - * - * \param problem The considered problem file - * \param element The considered element of the grid - * \param elemDat The parameters stored in the considered element - */ - void calculateBoundaryValues_(const Problem &problem, - const Element &element, - const ElementVolumeVariables &elemDat) - { - Vector tmp(0.0); - - // calculate gradients and secondary variables at IPs of the boundary - for (int idx = 0; - idx < fvElemGeom_.numVertices; - idx++) // loop over adjacent vertices - { - // FE gradient at vertex idx - const Vector& feGrad = boundaryFace_->grad[idx]; - - pressureAtBIP_ += elemDat[idx].pressure() * - boundaryFace_->shapeValue[idx]; - - // compute sum of pressure gradients for each phase - // the pressure gradient - tmp = feGrad; - tmp *= elemDat[idx].pressure(); - potentialGrad_ += tmp; - - massFractionAtBIP_ += - elemDat[idx].massFraction(comp1Idx) - * boundaryFace_->shapeValue[idx]; - // the concentration gradient of the non-wetting - // component in the wetting phase - tmp = feGrad; - tmp *= elemDat[idx].fluidState().molarity(phaseIdx, comp1Idx); - concentrationGrad_ += tmp; - - tmp = feGrad; - tmp *= elemDat[idx].fluidState().moleFraction(phaseIdx, comp1Idx); - moleFracGrad_ += tmp; - - tmp = feGrad; - tmp *= elemDat[idx].fluidState().massFraction(phaseIdx, comp1Idx); - massFracGrad_ += tmp; - - - densityAtIP_ += elemDat[idx].density()*boundaryFace_->shapeValue[idx]; - viscosityAtIP_ += elemDat[idx].viscosity()*boundaryFace_->shapeValue[idx]; - molarDensityAtIP_ += elemDat[idx].molarDensity()*boundaryFace_->shapeValue[idx]; - } - - tmp = problem.gravity(); - tmp *= densityAtIP_; - - potentialGrad_ -= tmp; - - calculateK_(problem.spatialParameters().intrinsicPermeability(element, fvElemGeom_, scvIdx_)); - Vector Kmvp; - K_.mv(potentialGrad_, Kmvp); - KmvpNormal_ = -(Kmvp*boundaryFace_->normal); - - const VolumeVariables &vertDat = elemDat[scvIdx_]; - - Scalar tau = problem.spatialParameters().tortuosity(element, fvElemGeom_, scvIdx_); - - porousDiffCoeff_ = vertDat.porosity()*tau*vertDat.diffCoeff(); - } - - const FVElementGeometry &fvElemGeom_; - const BoundaryFace *boundaryFace_; - - // gradients - Vector potentialGrad_; - Vector concentrationGrad_; - Vector moleFracGrad_; - Vector massFracGrad_; - - // quanitities at the integration point - Scalar pressureAtBIP_; - Scalar massFractionAtBIP_; - Scalar densityAtIP_; - Scalar viscosityAtIP_; - Scalar molarDensityAtIP_; - - //intrinsic permeability tensor - Tensor K_; - // intrinsic permeability times pressure potential gradient - // projected on the face normal - Scalar KmvpNormal_; - - // the diffusion coefficient for the porous medium - Scalar porousDiffCoeff_; - - int scvIdx_; -}; - -} // end namespace - -#endif diff --git a/dumux/boxmodels/1p2c/1p2cfluxvariables.hh b/dumux/boxmodels/1p2c/1p2cfluxvariables.hh index 6da4fbb22370f5f98ad6ff1aa73b1c298493079e..182b4d8a0f34fe02246b4b2ba8174306f9eeacad 100644 --- a/dumux/boxmodels/1p2c/1p2cfluxvariables.hh +++ b/dumux/boxmodels/1p2c/1p2cfluxvariables.hh @@ -96,12 +96,11 @@ public: OnePTwoCFluxVariables(const Problem &problem, const Element &element, const FVElementGeometry &elemGeom, - int scvfIdx, - const ElementVolumeVariables &elemDat) - : fvElemGeom_(elemGeom) + int faceIdx, + const ElementVolumeVariables &elemDat, + bool onBoundary = false) + : fvGeom_(elemGeom), faceIdx_(faceIdx), onBoundary_(onBoundary) { - scvfIdx_ = scvfIdx; - viscosityAtIP_ = Scalar(0); molarDensityAtIP_ = Scalar(0); densityAtIP_ = Scalar(0); @@ -141,10 +140,16 @@ public: { return Kmvp_; } /*! - * \brief Return the subcontrol volume face. + * \brief The face of the current sub-control volume. This may be either + * an inner sub-control-volume face or a SCV face on the boundary. */ - const SCVFace &face() const - { return fvElemGeom_.subContVolFace[scvfIdx_]; } + const SCVFace &face() const + { + if (onBoundary_) + return fvGeom_.boundaryFace[faceIdx_]; + else + return fvGeom_.subContVolFace[faceIdx_]; + } /*! * \brief Return the intrinsic permeability tensor. @@ -298,7 +303,7 @@ protected: // use finite-element gradients tmp = 0.0; for (int idx = 0; - idx < fvElemGeom_.numVertices; + idx < fvGeom_.numVertices; idx++) // loop over adjacent vertices { // FE gradient at vertex idx @@ -362,8 +367,8 @@ protected: // estimate the gravitational acceleration at a given SCV face // using the arithmetic mean - Vector f(problem.boxGravity(element, fvElemGeom_, face().i)); - f += problem.boxGravity(element, fvElemGeom_, face().j); + Vector f(problem.boxGravity(element, fvGeom_, face().i)); + f += problem.boxGravity(element, fvGeom_, face().j); f /= 2; // make it a force @@ -390,10 +395,10 @@ protected: const SpatialParameters &sp = problem.spatialParameters(); sp.meanK(K_, sp.intrinsicPermeability(element, - fvElemGeom_, + fvGeom_, face().i), sp.intrinsicPermeability(element, - fvElemGeom_, + fvGeom_, face().j)); } @@ -493,8 +498,9 @@ protected: dispersionTensor_[i][i] += vNorm*dispersivity[1]; } - const FVElementGeometry &fvElemGeom_; - int scvfIdx_; + const FVElementGeometry &fvGeom_; + const int faceIdx_; + const bool onBoundary_; //! pressure potential gradient Vector potentialGrad_; diff --git a/dumux/boxmodels/1p2c/1p2clocalresidual.hh b/dumux/boxmodels/1p2c/1p2clocalresidual.hh index 85599a2bcdebc9236989f757e931df3498a20546..86650517636702860f1599709072a0f894c14d62 100644 --- a/dumux/boxmodels/1p2c/1p2clocalresidual.hh +++ b/dumux/boxmodels/1p2c/1p2clocalresidual.hh @@ -38,7 +38,6 @@ #include <dumux/boxmodels/1p2c/1p2cproperties.hh> #include <dumux/boxmodels/1p2c/1p2cvolumevariables.hh> #include <dumux/boxmodels/1p2c/1p2cfluxvariables.hh> -#include <dumux/boxmodels/1p2c/1p2cboundaryvariables.hh> #include <dune/common/collectivecommunication.hh> #include <vector> @@ -67,7 +66,6 @@ protected: typedef typename GET_PROP_TYPE(TypeTag, VolumeVariables) VolumeVariables; typedef typename GET_PROP_TYPE(TypeTag, FluxVariables) FluxVariables; - typedef typename GET_PROP_TYPE(TypeTag, BoundaryVariables) BoundaryVariables; typedef typename GET_PROP_TYPE(TypeTag, ElementVolumeVariables) ElementVolumeVariables; typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; typedef typename GET_PROP_TYPE(TypeTag, BoundaryTypes) BoundaryTypes; @@ -157,14 +155,15 @@ public: * \param flux The flux over the SCV (sub-control-volume) face for each component * \param faceId The index of the considered face of the sub control volume */ - void computeFlux(PrimaryVariables &flux, int faceId) const + void computeFlux(PrimaryVariables &flux, int faceId, bool onBoundary=false) const { flux = 0; FluxVariables fluxVars(this->problem_(), this->elem_(), this->fvElemGeom_(), faceId, - this->curVolVars_()); + this->curVolVars_(), + onBoundary); asImp_()->computeAdvectiveFlux(flux, fluxVars); asImp_()->computeDiffusiveFlux(flux, fluxVars); @@ -286,21 +285,13 @@ public: int scvIdx, int boundaryFaceIdx) { - // temporary vector to store the neumann boundary fluxes const BoundaryTypes &bcTypes = this->bcTypes_(scvIdx); - // deal with neumann boundaries + // deal with outflow boundaries if (bcTypes.hasOutflow()) { - const BoundaryVariables boundaryVars(this->problem_(), - this->elem_(), - this->fvElemGeom_(), - boundaryFaceIdx, - this->curVolVars_(), - scvIdx); - //calculate outflow fluxes PrimaryVariables values(0.0); - asImp_()->computeOutflowValues_(values, boundaryVars, scvIdx, boundaryFaceIdx); + asImp_()->computeFlux(values, boundaryFaceIdx, true); Valgrind::CheckDefined(values); for (int equationIdx = 0; equationIdx < numEq; ++equationIdx) @@ -313,56 +304,6 @@ public: } } - /*! - * \brief Compute the fluxes at the outflow boundaries - */ - void computeOutflowValues_(PrimaryVariables &values, - const BoundaryVariables &boundaryVars, - const int scvIdx, - const int boundaryFaceIdx) - - { - const VolumeVariables& vertVars = this->curVolVars_()[scvIdx]; - - // mass balance - if(!useMoles) //use massfractions - { - values[contiEqIdx] += boundaryVars.KmvpNormal()*vertVars.density()/vertVars.viscosity(); - } - else //use molefractions - { - values[contiEqIdx] += boundaryVars.KmvpNormal()*vertVars.molarDensity()/vertVars.viscosity(); - } - - // component transport - if(!useMoles)//use massfractions - { - // advective flux - values[transEqIdx]+= - boundaryVars.KmvpNormal()*vertVars.density()/vertVars.viscosity() - *vertVars.fluidState().massFraction(phaseIdx, comp1Idx); - - // diffusive flux of comp1 component in phase0 - Scalar tmp = -(boundaryVars.massFracGrad(comp1Idx)*boundaryVars.boundaryFace().normal); - - tmp *= boundaryVars.porousDiffCoeff()*boundaryVars.densityAtIP(); - values[transEqIdx] += tmp;//* FluidSystem::molarMass(comp1Idx); - } - else //use molefractions - { - // advective flux - values[transEqIdx]+= - boundaryVars.KmvpNormal()*vertVars.molarDensity()/vertVars.viscosity() - *vertVars.fluidState().moleFraction(phaseIdx, comp1Idx); - - // diffusive flux of comp1 component in phase0 - Scalar tmp = -(boundaryVars.moleFracGrad(comp1Idx)*boundaryVars.boundaryFace().normal); - - tmp *= boundaryVars.porousDiffCoeff()*boundaryVars.molarDensityAtIP(); - values[transEqIdx] += tmp; - } - } - Implementation *asImp_() { return static_cast<Implementation *> (this); } const Implementation *asImp_() const diff --git a/dumux/boxmodels/1p2c/1p2cpropertydefaults.hh b/dumux/boxmodels/1p2c/1p2cpropertydefaults.hh index ce1baeae082107dcab4bcbe66744fea820a99ddf..b073b159e5e796cc065db6081416574387d449aa 100644 --- a/dumux/boxmodels/1p2c/1p2cpropertydefaults.hh +++ b/dumux/boxmodels/1p2c/1p2cpropertydefaults.hh @@ -41,7 +41,6 @@ #include "1p2cvolumevariables.hh" #include "1p2cfluxvariables.hh" #include "1p2cindices.hh" -#include "1p2cboundaryvariables.hh" namespace Dumux { @@ -69,9 +68,6 @@ SET_TYPE_PROP(BoxOnePTwoC, VolumeVariables, OnePTwoCVolumeVariables<TypeTag>); //! define the FluxVariables SET_TYPE_PROP(BoxOnePTwoC, FluxVariables, OnePTwoCFluxVariables<TypeTag>); -// the BoundaryVariables property -SET_TYPE_PROP(BoxOnePTwoC, BoundaryVariables, OnePTwoCBoundaryVariables<TypeTag>); - //! set default upwind weight to 1.0, i.e. fully upwind SET_SCALAR_PROP(BoxOnePTwoC, UpwindWeight, 1.0); diff --git a/dumux/boxmodels/2p2c/2p2clocalresidual.hh b/dumux/boxmodels/2p2c/2p2clocalresidual.hh index 8a23eabb40d6a5f7676ce6b6262abbde4fe1e2c9..883fe53f9a90ab73bc583b45e770a49beba276b2 100644 --- a/dumux/boxmodels/2p2c/2p2clocalresidual.hh +++ b/dumux/boxmodels/2p2c/2p2clocalresidual.hh @@ -213,6 +213,7 @@ class TwoPTwoCLocalResidual: public GET_PROP_TYPE(TypeTag, BaseLocalResidual) * * \param flux The flux over the SCV (sub-control-volume) face for each component * \param faceIdx The index of the SCV face + * \param onBoundary Evaluate flux at inner SCV face or on a boundary face */ void computeFlux(PrimaryVariables &flux, int faceIdx, bool onBoundary=false) const {