From f955d6c08d359115e402a77d3f5d326f68819323 Mon Sep 17 00:00:00 2001 From: DennisGlaeser <dennis.glaeser@iws.uni-stuttgart.de> Date: Thu, 25 Feb 2016 21:44:19 +0100 Subject: [PATCH] [ImplicitModel] Implement the flux variables class This flux variables class contains the flux variables for the different types of possible fluxes (Darcy, molecular diffusion, heat transport). Template specializations are provided for the different combinations of fluxes. --- dumux/implicit/fluxvariables.hh | 340 ++++++++++++++++++++++++++++++++ 1 file changed, 340 insertions(+) create mode 100644 dumux/implicit/fluxvariables.hh diff --git a/dumux/implicit/fluxvariables.hh b/dumux/implicit/fluxvariables.hh new file mode 100644 index 0000000000..c8d886c28b --- /dev/null +++ b/dumux/implicit/fluxvariables.hh @@ -0,0 +1,340 @@ +// -*- 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 Base class for the flux variables + */ +#ifndef DUMUX_IMPLICIT_FLUXVARIABLES_HH +#define DUMUX_IMPLICIT_FLUXVARIABLES_HH + +#include <dumux/implicit/properties.hh> + +namespace Dumux +{ + +/*! + * \ingroup ImplicitModel + * \brief Base class for the flux variables + * specializations are provided for combinations of diffusion processes + */ +template<class TypeTag, bool darcy, bool diffusion, bool energy> +class FluxVariables {}; + + +// specialization for pure darcy flow +template<class TypeTag> +class FluxVariables<TypeTag, true, false, false> +{ + using Problem = typename GET_PROP_TYPE(TypeTag, Problem); + using SubControlVolumeFace = typename GET_PROP_TYPE(TypeTag, SubControlVolumeFace); + using DarcyFluxVariables = typename GET_PROP_TYPE(TypeTag, DarcyFluxVariables); + +public: + void update(const Problem& problem, const SubControlVolumeFace &scv) + { + darcyFluxVars_.update(problem, scv); + } + + const DarcyFluxVariables& darcyFluxVars() const + { + return darcyFluxVars_; + } + + DarcyFluxVariables& darcyFluxVars() + { + return darcyFluxVars_; + } + +private: + DarcyFluxVariables darcyFluxVars_; +}; + + +// specialization for darcy flow with diffusion +template<class TypeTag> +class FluxVariables<TypeTag, true, true, false> +{ + using Problem = typename GET_PROP_TYPE(TypeTag, Problem); + using SubControlVolumeFace = typename GET_PROP_TYPE(TypeTag, SubControlVolumeFace); + using DarcyFluxVariables = typename GET_PROP_TYPE(TypeTag, DarcyFluxVariables); + using DiffusionFluxVariables = typename GET_PROP_TYPE(TypeTag, DiffusionFluxVariables); + + enum + { + numPhases = GET_PROP_VALUE(TypeTag, numPhases); + numComponents = GET_PROP_VALUE(TypeTag, numComponents); + }; + +public: + void update(const Problem& problem, const SubControlVolumeFace &scv) + { + darcyFluxVars_.update(problem, scv); + for (int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) + for (int compIdx = 0; compIdx < numComponents; ++compIdx) + diffusionFluxVariables_.update(problem, scv, phaseIdx, compIdx); + } + + const DarcyFluxVariables& darcyFluxVars() const + { + return darcyFluxVars_; + } + + DarcyFluxVariables& darcyFluxVars() + { + return darcyFluxVars_; + } + + const DiffusionFluxVariables& diffusionFluxVars(const int phaseIdx, const int compIdx) const + { + return diffusionFluxVariables_[phaseIdx][compIdx]; + } + + DiffusionFluxVariables& diffusionFluxVars(const int phaseIdx, const int compIdx) + { + return diffusionFluxVariables_[phaseIdx][compIdx]; + } + +private: + DarcyFluxVariables darcyFluxVars_; + std::array< std::array<DiffusionFluxVariables, numComponents>, numPhases> diffusionFluxVariables_; +}; + + +// specialization for pure diffusion +template<class TypeTag> +class FluxVariables<TypeTag, false, true, false> +{ + using Problem = typename GET_PROP_TYPE(TypeTag, Problem); + using SubControlVolumeFace = typename GET_PROP_TYPE(TypeTag, SubControlVolumeFace); + using DiffusionFluxVariables = typename GET_PROP_TYPE(TypeTag, DiffusionFluxVariables); + + enum + { + numPhases = GET_PROP_VALUE(TypeTag, numPhases); + numComponents = GET_PROP_VALUE(TypeTag, numComponents); + }; + +public: + void update(const Problem& problem, const SubControlVolumeFace &scv) + { + for (int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) + for (int compIdx = 0; compIdx < numComponents; ++compIdx) + diffusionFluxVariables_.update(problem, scv, phaseIdx, compIdx); + } + + const DiffusionFluxVariables& diffusionFluxVars(const int phaseIdx, const int compIdx) const + { + return diffusionFluxVariables_[phaseIdx][compIdx]; + } + + DiffusionFluxVariables& diffusionFluxVars(const int phaseIdx, const int compIdx) + { + return diffusionFluxVariables_[phaseIdx][compIdx]; + } + +private: + std::array< std::array<DiffusionFluxVariables, numComponents>, numPhases> diffusionFluxVariables_; +}; + + +// specialization for non-isothermal darcy flow +template<class TypeTag> +class FluxVariables<TypeTag, true, false, true> +{ + using Problem = typename GET_PROP_TYPE(TypeTag, Problem); + using SubControlVolumeFace = typename GET_PROP_TYPE(TypeTag, SubControlVolumeFace); + using DarcyFluxVariables = typename GET_PROP_TYPE(TypeTag, DarcyFluxVariables); + using EnergyFluxVariables = typename GET_PROP_TYPE(TypeTag, EnergyFluxVariables); + +public: + void update(const Problem& problem, const SubControlVolumeFace &scv) + { + darcyFluxVars_.update(problem, scv); + energyFluxVars_.update(problem, scv); + } + + const DarcyFluxVariables& darcyFluxVars() const + { + return darcyFluxVars_; + } + + DarcyFluxVariables& darcyFluxVars() + { + return darcyFluxVars_; + } + + const EnergyFluxVariables& energyFluxVars() const + { + return energyFluxVars_; + } + + EnergyFluxVariables& energyFluxVars() + { + return energyFluxVars_; + } + +private: + DarcyFluxVariables darcyFluxVars_; + EnergyFluxVariables energyFluxVars_; +}; + + +// specialization for non-isothermal darcy flow with diffusion +template<class TypeTag> +class FluxVariables<TypeTag, true, true, true> +{ + using Problem = typename GET_PROP_TYPE(TypeTag, Problem); + using SubControlVolumeFace = typename GET_PROP_TYPE(TypeTag, SubControlVolumeFace); + using DarcyFluxVariables = typename GET_PROP_TYPE(TypeTag, DarcyFluxVariables); + using DiffusionFluxVariables = typename GET_PROP_TYPE(TypeTag, DiffusionFluxVariables); + using EnergyFluxVariables = typename GET_PROP_TYPE(TypeTag, EnergyFluxVariables); + + enum + { + numPhases = GET_PROP_VALUE(TypeTag, numPhases); + numComponents = GET_PROP_VALUE(TypeTag, numComponents); + }; + +public: + void update(const Problem& problem, const SubControlVolumeFace &scv) + { + darcyFluxVars_.update(problem, scv); + for (int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) + for (int compIdx = 0; compIdx < numComponents; ++compIdx) + diffusionFluxVariables_.update(problem, scv, phaseIdx, compIdx); + energyFluxVars_.update(problem, scv); + } + + const DarcyFluxVariables& darcyFluxVars() const + { + return darcyFluxVars_; + } + + DarcyFluxVariables& darcyFluxVars() + { + return darcyFluxVars_; + } + + const EnergyFluxVariables& energyFluxVars() const + { + return energyFluxVars_; + } + + EnergyFluxVariables& energyFluxVars() + { + return energyFluxVars_; + } + + const DiffusionFluxVariables& diffusionFluxVars(const int phaseIdx, const int compIdx) const + { + return diffusionFluxVariables_[phaseIdx][compIdx]; + } + + DiffusionFluxVariables& diffusionFluxVars(const int phaseIdx, const int compIdx) + { + return diffusionFluxVariables_[phaseIdx][compIdx]; + } + +private: + DarcyFluxVariables darcyFluxVars_; + std::array< std::array<DiffusionFluxVariables, numComponents>, numPhases> diffusionFluxVariables_; + EnergyFluxVariables energyFluxVars_; +}; + + +// specialization for non-isothermal pure diffusion +template<class TypeTag> +class FluxVariables<TypeTag, false, true, true> +{ + using Problem = typename GET_PROP_TYPE(TypeTag, Problem); + using SubControlVolumeFace = typename GET_PROP_TYPE(TypeTag, SubControlVolumeFace); + using DiffusionFluxVariables = typename GET_PROP_TYPE(TypeTag, DiffusionFluxVariables); + using EnergyFluxVariables = typename GET_PROP_TYPE(TypeTag, EnergyFluxVariables); + + enum + { + numPhases = GET_PROP_VALUE(TypeTag, numPhases); + numComponents = GET_PROP_VALUE(TypeTag, numComponents); + }; + +public: + void update(const Problem& problem, const SubControlVolumeFace &scv) + { + for (int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) + for (int compIdx = 0; compIdx < numComponents; ++compIdx) + diffusionFluxVariables_.update(problem, scv, phaseIdx, compIdx); + energyFluxVars_.update(problem, scv); + } + + const EnergyFluxVariables& energyFluxVars() const + { + return energyFluxVars_; + } + + EnergyFluxVariables& energyFluxVars() + { + return energyFluxVars_; + } + + const DiffusionFluxVariables& diffusionFluxVars(const int phaseIdx, const int compIdx) const + { + return diffusionFluxVariables_[phaseIdx][compIdx]; + } + + DiffusionFluxVariables& diffusionFluxVars(const int phaseIdx, const int compIdx) + { + return diffusionFluxVariables_[phaseIdx][compIdx]; + } + +private: + std::array< std::array<DiffusionFluxVariables, numComponents>, numPhases> diffusionFluxVariables_; + EnergyFluxVariables energyFluxVars_; +}; + + +// specialization for pure heat transport +template<class TypeTag> +class FluxVariables<TypeTag, false, false, true> +{ + using Problem = typename GET_PROP_TYPE(TypeTag, Problem); + using SubControlVolumeFace = typename GET_PROP_TYPE(TypeTag, SubControlVolumeFace); + using EnergyFluxVariables = typename GET_PROP_TYPE(TypeTag, EnergyFluxVariables); + +public: + void update(const Problem& problem, const SubControlVolumeFace &scv) + { + energyFluxVars_.update(problem, scv); + } + + const EnergyFluxVariables& energyFluxVars() const + { + return energyFluxVars_; + } + + EnergyFluxVariables& energyFluxVars() + { + return energyFluxVars_; + } + +private: + EnergyFluxVariables energyFluxVars_; +}; +} // end namespace + +#endif -- GitLab