From 0cad8ac81bd0efd9b47e41861297b45062a89a2a Mon Sep 17 00:00:00 2001 From: Kilian Weishaupt <kilian.weishaupt@iws.uni-stuttgart.de> Date: Wed, 20 Dec 2017 17:37:25 +0100 Subject: [PATCH] [staggered] Add fluxstencil class for Navier-Stokes --- .../staggered/freeflow/fluxstencil.hh | 135 ++++++++++++++++++ .../staggered/freeflow/properties.hh | 3 + dumux/discretization/staggered/properties.hh | 6 +- 3 files changed, 141 insertions(+), 3 deletions(-) create mode 100644 dumux/discretization/staggered/freeflow/fluxstencil.hh diff --git a/dumux/discretization/staggered/freeflow/fluxstencil.hh b/dumux/discretization/staggered/freeflow/fluxstencil.hh new file mode 100644 index 0000000000..0d37f8e9f8 --- /dev/null +++ b/dumux/discretization/staggered/freeflow/fluxstencil.hh @@ -0,0 +1,135 @@ +// -*- 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 + * \copydoc Dumux::StaggeredNavierStokesFluxStencils + */ +#ifndef DUMUX_STAGGERED_NAVIERSTOKES_FLUX_STENCIL_HH +#define DUMUX_STAGGERED_NAVIERSTOKES_FLUX_STENCIL_HH + +#include <vector> +#include <dumux/common/properties.hh> + +namespace Dumux +{ + +/*! + * \brief Computes the stencil for the Navier-Stokes specific staggered grid discretization. +* For a full description of the stencils, please see the document under dumux/doc/docextra/staggered + */ +template<class TypeTag> +class StaggeredNavierStokesFluxStencils +{ + using GridView = typename GET_PROP_TYPE(TypeTag, GridView); + using FVGridGeometry = typename GET_PROP_TYPE(TypeTag, FVGridGeometry); + using FVElementGeometry = typename GET_PROP_TYPE(TypeTag, FVElementGeometry); + using SubControlVolumeFace = typename GET_PROP_TYPE(TypeTag, SubControlVolumeFace); + + using Element = typename GridView::template Codim<0>::Entity; + using IndexType = typename GridView::IndexSet::IndexType; + + using DofTypeIndices = typename GET_PROP(TypeTag, DofTypeIndices); + typename DofTypeIndices::CellCenterIdx cellCenterIdx; + typename DofTypeIndices::FaceIdx faceIdx; + + using Stencil = std::vector<IndexType>; + +public: + + /* + * \brief Computes the stencil for cell center dofs w.r.t to other cell center dofs. + * Basically, these are the dof indices of the neighboring elements plus the dof index of the element itself. + */ + static void computeCellCenterToCellCenterStencil(Stencil& stencil, + const Element& element, + const FVElementGeometry& fvGeometry, + const SubControlVolumeFace& scvf) + { + // the first entry is always the cc dofIdx itself + if(stencil.empty()) + stencil.push_back(scvf.insideScvIdx()); + if(!scvf.boundary()) + stencil.push_back(scvf.outsideScvIdx()); + } + + /* + * \brief Computes the stencil for cell center dofs w.r.t to face dofs. + * Basically, these are the dof indices of the element's faces. + */ + static void computeCellCenterToFaceStencil(Stencil& stencil, + const Element& element, + const FVElementGeometry& fvGeometry, + const SubControlVolumeFace& scvf) + { + stencil.push_back(scvf.dofIndex()); + } + + /* + * \brief Computes the stencil for face dofs w.r.t to cell center dofs. + * Basically, these are the dof indices of the elements adjacent to the face and those of + * the elements adjacent to the faces parallel to the own face. + */ + static void computeFaceToCellCenterStencil(Stencil& stencil, + const FVElementGeometry& fvGeometry, + const SubControlVolumeFace& scvf) + { + const auto eIdx = scvf.insideScvIdx(); + stencil.push_back(scvf.insideScvIdx()); + + for(const auto& data : scvf.pairData()) + { + auto& normalFace = fvGeometry.scvf(eIdx, data.localNormalFaceIdx); + if(!normalFace.boundary()) + { + const auto outerParallelElementDofIdx = normalFace.outsideScvIdx(); + stencil.push_back(outerParallelElementDofIdx); + } + } + } + + /* + * \brief Computes the stencil for face dofs w.r.t to face dofs. + * For a full description of the stencil, please see the document under dumux/doc/docextra/staggered + */ + static void computeFaceToFaceStencil(Stencil& stencil, + const FVElementGeometry& fvGeometry, + const SubControlVolumeFace& scvf) + { + // the first entries are always the face dofIdx itself and the one of the opposing face + if(stencil.empty()) + { + stencil.push_back(scvf.dofIndex()); + stencil.push_back(scvf.dofIndexOpposingFace()); + } + + for(const auto& data : scvf.pairData()) + { + stencil.push_back(data.normalPair.first); + const auto outerParallelFaceDofIdx = data.outerParallelFaceDofIdx; + if(outerParallelFaceDofIdx >= 0) + stencil.push_back(outerParallelFaceDofIdx); + if(!scvf.boundary()) + stencil.push_back(data.normalPair.second); + } + } +}; + +} // end namespace Dumux + +#endif //DUMUX_STAGGERED_NAVIERSTOKES_FLUX_STENCIL_HH diff --git a/dumux/discretization/staggered/freeflow/properties.hh b/dumux/discretization/staggered/freeflow/properties.hh index 8dbac411bc..14acdd8483 100644 --- a/dumux/discretization/staggered/freeflow/properties.hh +++ b/dumux/discretization/staggered/freeflow/properties.hh @@ -31,6 +31,7 @@ #include <dumux/freeflow/properties.hh> #include "subcontrolvolumeface.hh" +#include "fluxstencil.hh" #include "facevariables.hh" #include "boundarytypes.hh" #include "velocityoutput.hh" @@ -110,6 +111,8 @@ public: SET_TYPE_PROP(StaggeredFreeFlowModel, VelocityOutput, StaggeredFreeFlowVelocityOutput<TypeTag>); +SET_TYPE_PROP(StaggeredFreeFlowModel, StaggeredFluxStencils, StaggeredNavierStokesFluxStencils<TypeTag>); + } // namespace Properties } // namespace Dumux diff --git a/dumux/discretization/staggered/properties.hh b/dumux/discretization/staggered/properties.hh index fe45e134f6..c85872c21e 100644 --- a/dumux/discretization/staggered/properties.hh +++ b/dumux/discretization/staggered/properties.hh @@ -23,8 +23,8 @@ * \brief Defines a type tag and some properties for models using the staggered scheme. */ -#ifndef DUMUX_STAGGERDs_PROPERTIES_HH -#define DUMUX_STAGGERDs_PROPERTIES_HH +#ifndef DUMUX_STAGGERD_PROPERTIES_HH +#define DUMUX_STAGGERD_PROPERTIES_HH #include <dumux/common/properties.hh> @@ -51,7 +51,6 @@ #include <dune/istl/multitypeblockvector.hh> #include <dune/istl/multitypeblockmatrix.hh> - namespace Dumux { @@ -66,6 +65,7 @@ NEW_PROP_TAG(FaceSolutionVector); NEW_PROP_TAG(StaggeredFaceSolution); NEW_PROP_TAG(ElementFaceVariables); NEW_PROP_TAG(EnableGlobalFaceVariablesCache); +NEW_PROP_TAG(StaggeredFluxStencils); //! Type tag for the staggered scheme. NEW_TYPE_TAG(StaggeredModel, INHERITS_FROM(FiniteVolumeModel)); -- GitLab