From ecc72c5df858a3cf6fa7ab9b5ee3856ab355e061 Mon Sep 17 00:00:00 2001 From: Thomas Fetzer <thomas.fetzer@iws.uni-stuttgart.de> Date: Fri, 12 Jan 2018 15:02:06 +0100 Subject: [PATCH] [rans] Fix volVars update and update vtk fields --- dumux/freeflow/rans/CMakeLists.txt | 1 + dumux/freeflow/rans/model.hh | 4 + dumux/freeflow/rans/volumevariables.hh | 10 +-- dumux/freeflow/rans/vtkoutputfields.hh | 99 +++++++++++++++++++++++++ test/freeflow/rans/pipelauferproblem.hh | 7 +- 5 files changed, 112 insertions(+), 9 deletions(-) create mode 100644 dumux/freeflow/rans/vtkoutputfields.hh diff --git a/dumux/freeflow/rans/CMakeLists.txt b/dumux/freeflow/rans/CMakeLists.txt index 6aab4a5d74..386564fc51 100644 --- a/dumux/freeflow/rans/CMakeLists.txt +++ b/dumux/freeflow/rans/CMakeLists.txt @@ -3,4 +3,5 @@ install(FILES model.hh problem.hh volumevariables.hh +vtkoutputfields.hh DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dumux/freeflow/rans) diff --git a/dumux/freeflow/rans/model.hh b/dumux/freeflow/rans/model.hh index 4eec382577..597193c192 100644 --- a/dumux/freeflow/rans/model.hh +++ b/dumux/freeflow/rans/model.hh @@ -44,6 +44,7 @@ #include <dumux/freeflow/nonisothermal/model.hh> #include "volumevariables.hh" +#include "vtkoutputfields.hh" #include <dumux/material/fluidstates/immiscible.hh> #include <dumux/discretization/methods.hh> @@ -74,6 +75,9 @@ SET_BOOL_PROP(RANS, EnableInertiaTerms, true); //!< Explicitly force the conside //! The volume variables SET_TYPE_PROP(RANS, VolumeVariables, RANSVolumeVariables<TypeTag>); + +//! The specific vtk output fields +SET_TYPE_PROP(RANS, VtkOutputFields, RANSVtkOutputFields<TypeTag>); // \} } diff --git a/dumux/freeflow/rans/volumevariables.hh b/dumux/freeflow/rans/volumevariables.hh index 78f3b9fd95..2f90b5859f 100644 --- a/dumux/freeflow/rans/volumevariables.hh +++ b/dumux/freeflow/rans/volumevariables.hh @@ -82,12 +82,8 @@ public: const Element &element, const SubControlVolume& scv) { - ParentType::completeFluidState(elemSol, problem, element, scv, fluidState_); - dynamicEddyViscosity_ = scv.dofPosition()[1] * scv.dofPosition()[1]; - std::cout << dynamicEddyViscosity_ << " " - << asImp_().viscosity(defaultPhaseIdx) << " " - << effectiveViscosity(defaultPhaseIdx) << " " - << std::endl; + ParentType::update(elemSol, problem, element, scv); + dynamicEddyViscosity_ = std::max(0.0, scv.dofPosition()[1] * (0.2469 - scv.dofPosition()[1])); // TODO preliminary }; /*! @@ -159,7 +155,7 @@ public: const Element &element, const SubControlVolume &scv) { - completeFluidState(elemSol, problem, element, scv, this->fluidState_); + update(elemSol, problem, element, scv); } /*! diff --git a/dumux/freeflow/rans/vtkoutputfields.hh b/dumux/freeflow/rans/vtkoutputfields.hh new file mode 100644 index 0000000000..63de8b2fdb --- /dev/null +++ b/dumux/freeflow/rans/vtkoutputfields.hh @@ -0,0 +1,99 @@ +// -*- 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 + * \ingroup RANSModel + * \copydoc Dumux::RANSVtkOutputFields + */ +#ifndef DUMUX_RANS_VTK_OUTPUT_FIELDS_HH +#define DUMUX_RANS_VTK_OUTPUT_FIELDS_HH + +#include <dune/common/fvector.hh> +#include <dumux/common/properties.hh> +#include <dumux/common/parameters.hh> +#include <dumux/discretization/methods.hh> + +namespace Dumux +{ + +/*! + * \ingroup RANSModel + * \brief Adds vtk output fields for the Reynolds-Averaged Navier-Stokes model + */ +template<class TypeTag> +class RANSVtkOutputFields +{ + using Indices = typename GET_PROP_TYPE(TypeTag, Indices); + using Scalar = typename GET_PROP_TYPE(TypeTag, Scalar); + using GridView = typename GET_PROP_TYPE(TypeTag, GridView); + using VolumeVariables = typename GET_PROP_TYPE(TypeTag, VolumeVariables); + using SubControlVolumeFace = typename GET_PROP_TYPE(TypeTag, SubControlVolumeFace); + using FaceVariables = typename GET_PROP_TYPE(TypeTag, FaceVariables); + + using GlobalPosition = Dune::FieldVector<Scalar, GridView::dimensionworld>; + + // Helper type used for tag dispatching (to add discretization-specific fields). + template<DiscretizationMethods method> + using MethodType = std::integral_constant<DiscretizationMethods, method>; + +public: + //! Initialize the Navier-Stokes specific vtk output fields. + template <class VtkOutputModule> + static void init(VtkOutputModule& vtk) + { + vtk.addVolumeVariable([](const VolumeVariables& v){ return v.pressure(); }, "p [Pa]"); + vtk.addVolumeVariable([](const VolumeVariables& v){ return v.pressure() - 1e5; }, "p_rel [Pa]"); + vtk.addVolumeVariable([](const VolumeVariables& v){ return v.density(); }, "rho [kg/m^3]"); + vtk.addVolumeVariable([](const VolumeVariables& v){ return v.viscosity() / v.density(); }, "nu [m^2/s]"); + vtk.addVolumeVariable([](const VolumeVariables& v){ return v.dynamicEddyViscosity() / v.density(); }, "nu_t [m^2/s]"); + + // add discretization-specific fields + const auto discType = MethodType<GET_PROP_VALUE(TypeTag, DiscretizationMethod)>(); + additionalOutput_(vtk, discType); + } + +private: + + //! Adds discretization-specific fields (nothing by default). + template <class VtkOutputModule, class AnyMethod> + static void additionalOutput_(VtkOutputModule& vtk, AnyMethod) + { } + + //! Adds discretization-specific fields (velocity vectors on the faces for the staggered discretization). + template <class VtkOutputModule> + static void additionalOutput_(VtkOutputModule& vtk, MethodType<DiscretizationMethods::Staggered>) + { + const bool writeFaceVars = getParamFromGroup<bool>(GET_PROP_VALUE(TypeTag, ModelParameterGroup), "Vtk.WriteFaceData", false); + if(writeFaceVars) + { + auto faceVelocityVector = [](const SubControlVolumeFace& scvf, const FaceVariables& f) + { + GlobalPosition velocity(0.0); + velocity[scvf.directionIndex()] = f.velocitySelf(); + return velocity; + }; + + vtk.addFaceVariable(faceVelocityVector, "faceVelocity"); + } + } +}; + +} // end namespace Dumux + +#endif diff --git a/test/freeflow/rans/pipelauferproblem.hh b/test/freeflow/rans/pipelauferproblem.hh index 933dc780bf..80bae39c73 100644 --- a/test/freeflow/rans/pipelauferproblem.hh +++ b/test/freeflow/rans/pipelauferproblem.hh @@ -199,8 +199,11 @@ public: PrimaryVariables initialAtPos(const GlobalPosition &globalPos) const { PrimaryVariables values; - values[pressureIdx] = 1.1e+5; - values[velocityXIdx] = 0.0; + values[pressureIdx] = 1.0e+5; + if(isInlet(globalPos)) + { + values[velocityXIdx] = inletVelocity_; + } values[velocityYIdx] = 0.0; return values; -- GitLab