diff --git a/dumux/discretization/cellcentered/tpfa/computetransmissibility.hh b/dumux/discretization/cellcentered/tpfa/computetransmissibility.hh new file mode 100644 index 0000000000000000000000000000000000000000..9c73844cf03eba1f8902e53227d18a46921e75d1 --- /dev/null +++ b/dumux/discretization/cellcentered/tpfa/computetransmissibility.hh @@ -0,0 +1,86 @@ +// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- +// vi: set et ts=4 sw=4 sts=4: +/***************************************************************************** + * See the file COPYING for full copying permissions. * + * * + * 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 free functions to evaluate the transmissibilities + * associated with flux evaluations across sub-control volume faces + * in the context of the cell-centered TPFA scheme. + */ +#ifndef DUMUX_DISCRETIZATION_CC_TPFA_COMPUTE_TRANSMISSIBILITY_HH +#define DUMUX_DISCRETIZATION_CC_TPFA_COMPUTE_TRANSMISSIBILITY_HH + +namespace Dumux +{ + +/*! + * \ingroup Tpfa + * + * \brief Free function to evaluate the Tpfa transmissibility associated + * with the flux (in the form of flux = T*gradU) across a + * sub-control volume face stemming from a given sub-control + * volume with corresponding tensor T. + * + * \param scvf The sub-control volume face + * \param scv The neighboring sub-control volume + * \param K The tensor living in the neighboring scv + * \param extrusionFactor The extrusion factor of the scv + */ +template< class SubControlVolumeFace, class SubControlVolume, class FieldScalar, int dimWorld > +FieldScalar computeTpfaTransmissibility(const SubControlVolumeFace& scvf, + const SubControlVolume& scv, + const Dune::FieldMatrix<FieldScalar, dimWorld, dimWorld>& T, + typename SubControlVolume::Traits::Scalar extrusionFactor) +{ + using GlobalPosition = typename SubControlVolumeFace::Traits::GlobalPosition; + GlobalPosition Knormal; + T.mv(scvf.unitOuterNormal(), Knormal); + + auto distanceVector = scvf.ipGlobal(); + distanceVector -= scv.center(); + distanceVector /= distanceVector.two_norm2(); + + return (Knormal*distanceVector) * extrusionFactor; +} + +/*! + * \ingroup Tpfa + * + * \brief Specialization of the above function for scalar T. + * + * \param scvf The sub-control volume face + * \param scv The neighboring sub-control volume + * \param t The scalar quantity living in the neighboring scv + * \param extrusionFactor The extrusion factor of the scv + */ +template< class SubControlVolumeFace, class SubControlVolume, class FieldScalar > +FieldScalar computeTpfaTransmissibility(const SubControlVolumeFace& scvf, + const SubControlVolume &scv, + FieldScalar t, + typename SubControlVolumeFace::Traits::Scalar extrusionFactor) +{ + auto distanceVector = scvf.ipGlobal(); + distanceVector -= scv.center(); + distanceVector /= distanceVector.two_norm2(); + + return t * extrusionFactor * (distanceVector * scvf.unitOuterNormal()); +} + +} // end namespace Dumux + +#endif diff --git a/dumux/discretization/cellcentered/tpfa/darcyslaw.hh b/dumux/discretization/cellcentered/tpfa/darcyslaw.hh index 3a00ac3028abdf840c8b3122bada60e09028ccbc..197ca72ce125257534b25e79d4e705a4af0b1bd9 100644 --- a/dumux/discretization/cellcentered/tpfa/darcyslaw.hh +++ b/dumux/discretization/cellcentered/tpfa/darcyslaw.hh @@ -25,14 +25,10 @@ #ifndef DUMUX_DISCRETIZATION_CC_TPFA_DARCYS_LAW_HH #define DUMUX_DISCRETIZATION_CC_TPFA_DARCYS_LAW_HH -#include <memory> - -#include <dune/common/float_cmp.hh> - -#include <dumux/common/math.hh> #include <dumux/common/parameters.hh> #include <dumux/discretization/methods.hh> +#include <dumux/discretization/cellcentered/tpfa/computetransmissibility.hh> namespace Dumux { @@ -261,8 +257,8 @@ public: return volVars.permeability(); }; - const Scalar ti = calculateOmega_(scvf, getPermeability(insideVolVars, scvf.ipGlobal()), - insideScv, insideVolVars.extrusionFactor()); + const Scalar ti = computeTpfaTransmissibility(scvf, insideScv, getPermeability(insideVolVars, scvf.ipGlobal()), + insideVolVars.extrusionFactor()); // for the boundary (dirichlet) or at branching points we only need ti if (scvf.boundary() || scvf.numOutsideScvs() > 1) @@ -283,14 +279,14 @@ public: { // normal grids if (dim == dimWorld) - return -1.0*calculateOmega_(scvf, getPermeability(outsideVolVars, scvf.ipGlobal()), - outsideScv, outsideVolVars.extrusionFactor()); + return -1.0*computeTpfaTransmissibility(scvf, outsideScv, getPermeability(outsideVolVars, scvf.ipGlobal()), + outsideVolVars.extrusionFactor()); // embedded surface and network grids //(the outside normal vector might differ from the inside normal vector) else - return calculateOmega_(fvGeometry.flipScvf(scvf.index()), getPermeability(outsideVolVars, scvf.ipGlobal()), - outsideScv, outsideVolVars.extrusionFactor()); + return computeTpfaTransmissibility(fvGeometry.flipScvf(scvf.index()), outsideScv, getPermeability(outsideVolVars, scvf.ipGlobal()), + outsideVolVars.extrusionFactor()); }(); @@ -303,42 +299,6 @@ public: return tij; } - -private: - //! compute the transmissibility ti, overload for tensor permeabilites - static Scalar calculateOmega_(const SubControlVolumeFace& scvf, - const DimWorldMatrix &K, - const SubControlVolume &scv, - Scalar extrusionFactor) - { - GlobalPosition Knormal; - K.mv(scvf.unitOuterNormal(), Knormal); - - auto distanceVector = scvf.ipGlobal(); - distanceVector -= scv.center(); - distanceVector /= distanceVector.two_norm2(); - - Scalar omega = Knormal * distanceVector; - omega *= extrusionFactor; - - return omega; - } - - //! compute the transmissibility ti, overload for scalar permeabilites - static Scalar calculateOmega_(const SubControlVolumeFace& scvf, - const Scalar K, - const SubControlVolume &scv, - Scalar extrusionFactor) - { - auto distanceVector = scvf.ipGlobal(); - distanceVector -= scv.center(); - distanceVector /= distanceVector.two_norm2(); - - Scalar omega = K * (distanceVector * scvf.unitOuterNormal()); - omega *= extrusionFactor; - - return omega; - } }; } // end namespace Dumux diff --git a/dumux/discretization/cellcentered/tpfa/fickslaw.hh b/dumux/discretization/cellcentered/tpfa/fickslaw.hh index 8f8696714773f4e5b18d7f0ec81e733812c9e229..36667762470ce5b9685cff50cbd156f20e51b945 100644 --- a/dumux/discretization/cellcentered/tpfa/fickslaw.hh +++ b/dumux/discretization/cellcentered/tpfa/fickslaw.hh @@ -24,13 +24,11 @@ #ifndef DUMUX_DISCRETIZATION_CC_TPFA_FICKS_LAW_HH #define DUMUX_DISCRETIZATION_CC_TPFA_FICKS_LAW_HH -#include <dune/common/float_cmp.hh> -#include <dumux/common/math.hh> #include <dumux/common/parameters.hh> #include <dumux/discretization/methods.hh> -#include <dumux/discretization/fluxvariablescaching.hh> +#include <dumux/discretization/cellcentered/tpfa/computetransmissibility.hh> namespace Dumux { @@ -180,10 +178,7 @@ public: using EffDiffModel = typename GET_PROP_TYPE(TypeTag, EffectiveDiffusivityModel); auto insideD = insideVolVars.diffusionCoefficient(phaseIdx, compIdx); insideD = EffDiffModel::effectiveDiffusivity(insideVolVars.porosity(), insideVolVars.saturation(phaseIdx), insideD); - const Scalar ti = calculateOmega_(scvf, - insideD, - insideScv, - insideVolVars.extrusionFactor()); + const Scalar ti = computeTpfaTransmissibility(scvf, insideScv, insideD, insideVolVars.extrusionFactor()); // for the boundary (dirichlet) or at branching points we only need ti if (scvf.boundary() || scvf.numOutsideScvs() > 1) @@ -203,15 +198,12 @@ public: Scalar tj; if (dim == dimWorld) // assume the normal vector from outside is anti parallel so we save flipping a vector - tj = -1.0*calculateOmega_(scvf, - outsideD, - outsideScv, - outsideVolVars.extrusionFactor()); + tj = -1.0*computeTpfaTransmissibility(scvf, outsideD, outsideScv, outsideVolVars.extrusionFactor()); else - tj = calculateOmega_(fvGeometry.flipScvf(scvf.index()), - outsideD, - outsideScv, - outsideVolVars.extrusionFactor()); + tj = computeTpfaTransmissibility(fvGeometry.flipScvf(scvf.index()), + outsideD, + outsideScv, + outsideVolVars.extrusionFactor()); // check if we are dividing by zero! if (ti*tj <= 0.0) @@ -264,41 +256,6 @@ public: } return rho/(scvf.numOutsideScvs()+1); } - -private: - - static Scalar calculateOmega_(const SubControlVolumeFace& scvf, - const DimWorldMatrix &D, - const SubControlVolume &scv, - const Scalar extrusionFactor) - { - GlobalPosition Dnormal; - D.mv(scvf.unitOuterNormal(), Dnormal); - - auto distanceVector = scvf.ipGlobal(); - distanceVector -= scv.center(); - distanceVector /= distanceVector.two_norm2(); - - Scalar omega = Dnormal * distanceVector; - omega *= extrusionFactor; - - return omega; - } - - static Scalar calculateOmega_(const SubControlVolumeFace& scvf, - const Scalar D, - const SubControlVolume &scv, - const Scalar extrusionFactor) - { - auto distanceVector = scvf.ipGlobal(); - distanceVector -= scv.center(); - distanceVector /= distanceVector.two_norm2(); - - Scalar omega = D * (distanceVector * scvf.unitOuterNormal()); - omega *= extrusionFactor; - - return omega; - } }; } // end namespace diff --git a/dumux/discretization/cellcentered/tpfa/fourierslaw.hh b/dumux/discretization/cellcentered/tpfa/fourierslaw.hh index a7a0e3f8af26fd3315a1ad3dc0176370ffb4dee8..62833620c2bb7c7f6ca41951d6c1de7339da5798 100644 --- a/dumux/discretization/cellcentered/tpfa/fourierslaw.hh +++ b/dumux/discretization/cellcentered/tpfa/fourierslaw.hh @@ -24,12 +24,10 @@ #ifndef DUMUX_DISCRETIZATION_CC_TPFA_FOURIERS_LAW_HH #define DUMUX_DISCRETIZATION_CC_TPFA_FOURIERS_LAW_HH -#include <dune/common/float_cmp.hh> -#include <dumux/common/math.hh> #include <dumux/common/parameters.hh> #include <dumux/discretization/methods.hh> -#include <dumux/discretization/fluxvariablescaching.hh> +#include <dumux/discretization/cellcentered/tpfa/computetransmissibility.hh> namespace Dumux { @@ -146,7 +144,7 @@ public: const auto& insideVolVars = elemVolVars[insideScvIdx]; auto insideLambda = ThermalConductivityModel::effectiveThermalConductivity(insideVolVars, problem.spatialParams(), element, fvGeometry, insideScv); - Scalar ti = calculateOmega_(scvf, insideLambda, insideScv, insideVolVars.extrusionFactor()); + Scalar ti = computeTpfaTransmissibility(scvf, insideScv, insideLambda, insideVolVars.extrusionFactor()); // for the boundary (dirichlet) or at branching points we only need ti if (scvf.boundary() || scvf.numOutsideScvs() > 1) @@ -169,9 +167,9 @@ public: Scalar tj; if (dim == dimWorld) // assume the normal vector from outside is anti parallel so we save flipping a vector - tj = -1.0*calculateOmega_(scvf, outsideLambda, outsideScv, outsideVolVars.extrusionFactor()); + tj = -1.0*computeTpfaTransmissibility(scvf, outsideScv, outsideLambda, outsideVolVars.extrusionFactor()); else - tj = calculateOmega_(fvGeometry.flipScvf(scvf.index()), outsideLambda, outsideScv, outsideVolVars.extrusionFactor()); + tj = computeTpfaTransmissibility(fvGeometry.flipScvf(scvf.index()), outsideScv, outsideLambda, outsideVolVars.extrusionFactor()); // check for division by zero! if (ti*tj <= 0.0) @@ -211,35 +209,6 @@ private: } return sumTempTi/sumTi; } - - static Scalar calculateOmega_(const SubControlVolumeFace& scvf, - const DimWorldMatrix& lambda, - const SubControlVolume& scv, - Scalar extrusionFactor) - { - GlobalPosition lambdaNormal; - lambda.mv(scvf.unitOuterNormal(), lambdaNormal); - - auto distanceVector = scvf.ipGlobal(); - distanceVector -= scv.center(); - distanceVector /= distanceVector.two_norm2(); - - Scalar omega = lambdaNormal * distanceVector; - return omega*extrusionFactor; - } - - static Scalar calculateOmega_(const SubControlVolumeFace& scvf, - Scalar lambda, - const SubControlVolume &scv, - Scalar extrusionFactor) - { - auto distanceVector = scvf.ipGlobal(); - distanceVector -= scv.center(); - distanceVector /= distanceVector.two_norm2(); - - Scalar omega = lambda * (distanceVector * scvf.unitOuterNormal()); - return omega*extrusionFactor; - } }; } // end namespace Dumux