// -*- 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 3 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 . * *****************************************************************************/ #ifndef DUMUX_FVVELOCITY_HH #define DUMUX_FVVELOCITY_HH // dumux environment #include #include #include "velocitydefault.hh" /** * @file * @brief Finite volume velocity reconstruction */ namespace Dumux { /*! \ingroup IMPET * * \brief Base class for finite volume velocity reconstruction * * Provides a basic frame for calculating a global velocity field. * The definition of the local velocity calculation as well as the storage or other postprocessing * has to be provided by the local velocity implementation. * This local implementation has to have the form of VelocityDefault. * * \tparam TypeTag The Type Tag * \tparam Velocity The implementation of the local velocity calculation */ template class FVVelocity { using GridView = typename GetPropType::GridView; using Problem = GetPropType; using CellData = GetPropType; public: //!Initialize velocity implementation void initialize() { velocity_.initialize(); } //function which iterates through the grid and calculates the global velocity field void calculateVelocity(); /*! \brief Adds velocity output to the output file * * \tparam MultiWriter Class defining the output writer * \param writer The output writer (usually a VTKMultiWriter object) * */ template void addOutputVtkFields(MultiWriter &writer) { velocity_.addOutputVtkFields(writer); } //! Constructs a FVVelocity object /** * \param problem A problem class object */ FVVelocity(Problem& problem) : problem_(problem), velocity_(problem) {} private: Problem& problem_; Velocity velocity_; }; /*! \brief Function which reconstructs a global velocity field * * Iterates through the grid and calls the local calculateVelocity(...) or calculateVelocityOnBoundary(...) * functions which have to be provided by the local velocity implementation (see e.g. VelocityDefault ) */ template void FVVelocity::calculateVelocity() { for (const auto& element : elements(problem_.gridView())) { // cell information int globalIdxI = problem_.variables().index(element); CellData& cellDataI = problem_.variables().cellData(globalIdxI); /***** flux term ***********/ // iterate over all faces of the cell for (const auto& intersection : intersections(problem_.gridView(), element)) { /************* handle interior face *****************/ if (intersection.neighbor()) { int isIndex = intersection.indexInInside(); if (!cellDataI.fluxData().haveVelocity(isIndex)) velocity_.calculateVelocity(intersection, cellDataI); } // end neighbor /************* boundary face ************************/ else { velocity_.calculateVelocityOnBoundary(intersection, cellDataI); } } //end interfaces loop } // end grid traversal return; } }//end namespace Dumux #endif