Line | Branch | Exec | Source |
---|---|---|---|
1 | // -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- | ||
2 | // vi: set et ts=4 sw=4 sts=4: | ||
3 | // | ||
4 | // SPDX-FileCopyrightInfo: Copyright © DuMux Project contributors, see AUTHORS.md in root folder | ||
5 | // SPDX-License-Identifier: GPL-3.0-or-later | ||
6 | // | ||
7 | /*! | ||
8 | * \file | ||
9 | * \ingroup NavierStokesModel | ||
10 | * \copydoc Dumux::NavierStokesMassProblem | ||
11 | */ | ||
12 | #ifndef DUMUX_NAVIERSTOKES_MASS_PROBLEM_HH | ||
13 | #define DUMUX_NAVIERSTOKES_MASS_PROBLEM_HH | ||
14 | |||
15 | #include <dune/common/exceptions.hh> | ||
16 | #include <dune/common/typetraits.hh> | ||
17 | #include <dumux/common/numeqvector.hh> | ||
18 | #include <dumux/common/properties.hh> | ||
19 | #include <dumux/common/fvproblemwithspatialparams.hh> | ||
20 | #include <dumux/discretization/method.hh> | ||
21 | |||
22 | namespace Dumux { | ||
23 | |||
24 | // default implementation | ||
25 | template<class TypeTag, class DiscretizationMethod> | ||
26 | class NavierStokesMassProblemImpl : public FVProblemWithSpatialParams<TypeTag> | ||
27 | { | ||
28 | using ParentType = FVProblemWithSpatialParams<TypeTag>; | ||
29 | using Implementation = GetPropType<TypeTag, Properties::Problem>; | ||
30 | |||
31 | using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>; | ||
32 | using GridView = typename GridGeometry::GridView; | ||
33 | using FVElementGeometry = typename GridGeometry::LocalView; | ||
34 | using SubControlVolumeFace = typename FVElementGeometry::SubControlVolumeFace; | ||
35 | using Element = typename GridView::template Codim<0>::Entity; | ||
36 | using GlobalPosition = typename SubControlVolumeFace::GlobalPosition; | ||
37 | using VelocityVector = GlobalPosition; | ||
38 | using Scalar = GetPropType<TypeTag, Properties::Scalar>; | ||
39 | using CouplingManager = GetPropType<TypeTag, Properties::CouplingManager>; | ||
40 | using ModelTraits = GetPropType<TypeTag, Properties::ModelTraits>; | ||
41 | |||
42 | static constexpr bool isCoupled_ = !std::is_empty_v<CouplingManager>; | ||
43 | |||
44 | public: | ||
45 | |||
46 | //! These types are used in place of the typical NumEqVector type. | ||
47 | //! In the momentum problem, there is a discrepancy between | ||
48 | //! the assembly NumEqVector type, and the type used in the residual. | ||
49 | //! These aliases are used in both problems to differentiate. | ||
50 | using InitialValues = Dune::FieldVector<Scalar, ModelTraits::numEq()>; | ||
51 | using Sources = Dune::FieldVector<Scalar, ModelTraits::numEq()>; | ||
52 | using DirichletValues = Dune::FieldVector<Scalar, ModelTraits::numEq()>; | ||
53 | using BoundaryFluxes = Dune::FieldVector<Scalar, ModelTraits::numEq()>; | ||
54 | |||
55 | //! Export the boundary types. | ||
56 | using BoundaryTypes = Dumux::BoundaryTypes<ModelTraits::numEq()>; | ||
57 | |||
58 | //! this problem is used for the mass balance model | ||
59 | static constexpr bool isMomentumProblem() { return false; } | ||
60 | |||
61 | /*! | ||
62 | * \brief The constructor | ||
63 | * \param gridGeometry The finite volume grid geometry | ||
64 | * \param couplingManager The coupling manager (couples mass and momentum equations) | ||
65 | * \param paramGroup The parameter group in which to look for runtime parameters first (default is "") | ||
66 | */ | ||
67 | 64 | NavierStokesMassProblemImpl(std::shared_ptr<const GridGeometry> gridGeometry, | |
68 | std::shared_ptr<CouplingManager> couplingManager, | ||
69 | const std::string& paramGroup = "") | ||
70 | : ParentType(gridGeometry, paramGroup) | ||
71 |
2/6✓ Branch 2 taken 64 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 64 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
128 | , couplingManager_(couplingManager) |
72 | 64 | {} | |
73 | |||
74 | /*! | ||
75 | * \brief The constructor for usage without a coupling manager | ||
76 | * \param gridGeometry The finite volume grid geometry | ||
77 | * \param paramGroup The parameter group in which to look for runtime parameters first (default is "") | ||
78 | */ | ||
79 | NavierStokesMassProblemImpl(std::shared_ptr<const GridGeometry> gridGeometry, | ||
80 | const std::string& paramGroup = "") | ||
81 | : NavierStokesMassProblemImpl(gridGeometry, {}, paramGroup) | ||
82 | {} | ||
83 | |||
84 | /*! | ||
85 | * \brief Returns the normal velocity at a given sub control volume face. | ||
86 | */ | ||
87 | ✗ | VelocityVector faceVelocity(const Element& element, | |
88 | const FVElementGeometry& fvGeometry, | ||
89 | const SubControlVolumeFace& scvf) const | ||
90 | { | ||
91 | if constexpr (isCoupled_) | ||
92 |
0/7✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
300263518 | return couplingManager_->faceVelocity(element, scvf); |
93 | else | ||
94 | return asImp_().velocityAtPos(scvf.ipGlobal()); | ||
95 | } | ||
96 | |||
97 | /*! | ||
98 | * \brief Returns the velocity at the element center. | ||
99 | */ | ||
100 | VelocityVector elementVelocity(const FVElementGeometry& fvGeometry) const | ||
101 | { | ||
102 | if constexpr (isCoupled_) | ||
103 | ✗ | return couplingManager_->elementVelocity(fvGeometry); | |
104 | else | ||
105 | return asImp_().velocityAtPos(fvGeometry.element().geometry().center()); | ||
106 | } | ||
107 | |||
108 | /*! | ||
109 | * \brief Returns the velocity at a given position. | ||
110 | */ | ||
111 | VelocityVector velocityAtPos(const GlobalPosition&) const | ||
112 | { | ||
113 | DUNE_THROW(Dune::NotImplemented, "velocityAtPos not implemented"); | ||
114 | } | ||
115 | |||
116 | const CouplingManager& couplingManager() const | ||
117 | { | ||
118 | if constexpr (isCoupled_) | ||
119 |
8/8✓ Branch 0 taken 1420 times.
✓ Branch 1 taken 9300 times.
✓ Branch 2 taken 1420 times.
✓ Branch 3 taken 9300 times.
✓ Branch 4 taken 2050 times.
✓ Branch 5 taken 1750 times.
✓ Branch 6 taken 2050 times.
✓ Branch 7 taken 1750 times.
|
34390 | return *couplingManager_; |
120 | else | ||
121 | DUNE_THROW(Dune::InvalidStateException, | ||
122 | "Accessing coupling manager of an uncoupled problem is not possible." | ||
123 | ); | ||
124 | } | ||
125 | |||
126 | private: | ||
127 | //! Returns the implementation of the problem (i.e. static polymorphism) | ||
128 | Implementation &asImp_() | ||
129 | { return *static_cast<Implementation *>(this); } | ||
130 | |||
131 | //! \copydoc asImp_() | ||
132 | const Implementation &asImp_() const | ||
133 | { return *static_cast<const Implementation *>(this); } | ||
134 | |||
135 | std::shared_ptr<CouplingManager> couplingManager_; | ||
136 | }; | ||
137 | |||
138 | /*! | ||
139 | * \ingroup NavierStokesModel | ||
140 | * \brief Navier-Stokes mass problem class | ||
141 | * | ||
142 | * Inherit from this problem to implement Navier-Stokes mass problems | ||
143 | */ | ||
144 | template<class TypeTag> | ||
145 | using NavierStokesMassProblem = NavierStokesMassProblemImpl< | ||
146 | TypeTag, typename GetPropType<TypeTag, Properties::GridGeometry>::DiscretizationMethod | ||
147 | >; | ||
148 | |||
149 | } // end namespace Dumux | ||
150 | |||
151 | #endif | ||
152 |