13#ifndef DUMUX_MULTIDOMAIN_BOUNDARY_FREEFLOW_POROUSMEDIUM_COUPLINGMANAGER_BASE_HH
14#define DUMUX_MULTIDOMAIN_BOUNDARY_FREEFLOW_POROUSMEDIUM_COUPLINGMANAGER_BASE_HH
19#include <dune/common/indices.hh>
29namespace FreeFlowPorousMediumDetail {
32static constexpr auto freeFlowMomentumIndex = Dune::index_constant<0>();
33static constexpr auto freeFlowMassIndex = Dune::index_constant<1>();
34static constexpr auto porousMediumIndex = Dune::index_constant<2>();
37static constexpr auto freeFlowMassToFreeFlowMomentumIndex = Dune::index_constant<0>();
38static constexpr auto freeFlowMomentumToPorousMediumIndex = Dune::index_constant<1>();
39static constexpr auto freeFlowMassToPorousMediumIndex = Dune::index_constant<2>();
40static constexpr auto noCouplingIdx = Dune::index_constant<99>();
44 auto map = std::array<std::array<std::size_t, 3>, 3>{};
47 map[freeFlowMomentumIndex][freeFlowMassIndex] = freeFlowMassToFreeFlowMomentumIndex;
48 map[freeFlowMassIndex][freeFlowMomentumIndex] = freeFlowMassToFreeFlowMomentumIndex;
51 map[freeFlowMomentumIndex][porousMediumIndex] = freeFlowMomentumToPorousMediumIndex;
52 map[porousMediumIndex][freeFlowMomentumIndex] = freeFlowMomentumToPorousMediumIndex;
55 map[freeFlowMassIndex][porousMediumIndex] = freeFlowMassToPorousMediumIndex;
56 map[porousMediumIndex][freeFlowMassIndex] = freeFlowMassToPorousMediumIndex;
61template<std::
size_t i>
64 if constexpr (i == freeFlowMomentumIndex)
65 return std::make_tuple(freeFlowMassIndex, porousMediumIndex);
66 else if constexpr (i == freeFlowMassIndex)
67 return std::make_tuple(freeFlowMomentumIndex, porousMediumIndex);
69 return std::make_tuple(freeFlowMomentumIndex, freeFlowMassIndex);
72template<std::
size_t i, std::
size_t j>
75 static_assert(i <= 2 && j <= 2);
76 static_assert(i != j);
79 return std::pair<Dune::index_constant<0>, Dune::index_constant<1>>{};
81 return std::pair<Dune::index_constant<1>, Dune::index_constant<0>>{};
86 static constexpr auto managerMap()
88 return FreeFlowPorousMediumDetail::makeCouplingManagerMap();
91 template<std::
size_t i, std::
size_t j>
92 static constexpr auto globalToLocal(Dune::index_constant<i> domainI, Dune::index_constant<j> domainJ)
94 return FreeFlowPorousMediumDetail::globalToLocalDomainIndices(domainI, domainJ);
97 template<std::
size_t i>
98 static constexpr auto coupledDomains(Dune::index_constant<i> domainI)
100 return FreeFlowPorousMediumDetail::coupledDomains(domainI);
104template<
class MDTraits>
105struct CouplingManagers
107 template<std::
size_t id>
108 using SubDomainTypeTag =
typename MDTraits::template SubDomain<id>::TypeTag;
110 using FreeFlowTraits = MultiDomainTraits<
111 SubDomainTypeTag<freeFlowMomentumIndex>, SubDomainTypeTag<freeFlowMassIndex>
114 using FreeFlowMomentumPorousMediumTraits = MultiDomainTraits<
115 SubDomainTypeTag<freeFlowMomentumIndex>, SubDomainTypeTag<porousMediumIndex>
118 using FreeFlowMassPorousMediumTraits = MultiDomainTraits<
119 SubDomainTypeTag<freeFlowMassIndex>, SubDomainTypeTag<porousMediumIndex>
137template<
class MDTraits>
141 FreeFlowPorousMediumDetail::CouplingMaps,
142 typename FreeFlowPorousMediumDetail::CouplingManagers<MDTraits>::FreeFlowCouplingManager,
143 typename FreeFlowPorousMediumDetail::CouplingManagers<MDTraits>::FreeFlowMomentumPorousMediumCouplingManager,
144 typename FreeFlowPorousMediumDetail::CouplingManagers<MDTraits>::FreeFlowMassPorousMediumCouplingManager
149 FreeFlowPorousMediumDetail::CouplingMaps,
150 typename FreeFlowPorousMediumDetail::CouplingManagers<MDTraits>::FreeFlowCouplingManager,
151 typename FreeFlowPorousMediumDetail::CouplingManagers<MDTraits>::FreeFlowMomentumPorousMediumCouplingManager,
152 typename FreeFlowPorousMediumDetail::CouplingManagers<MDTraits>::FreeFlowMassPorousMediumCouplingManager
155 using Scalar =
typename MDTraits::Scalar;
158 template<std::
size_t id>
159 using SubDomainTypeTag =
typename MDTraits::template SubDomain<id>::TypeTag;
163 template<std::
size_t id>
using FVElementGeometry =
typename GridGeometry<id>::LocalView;
164 template<std::
size_t id>
using SubControlVolumeFace =
typename FVElementGeometry<id>::SubControlVolumeFace;
165 template<std::
size_t id>
using SubControlVolume =
typename FVElementGeometry<id>::SubControlVolume;
167 template<std::
size_t id>
using NumEqVector =
typename Problem<id>::Traits::NumEqVector;
169 template<std::
size_t id>
using GridView =
typename GridGeometry<id>::GridView;
170 template<std::
size_t id>
using Element =
typename GridView<id>::template Codim<0>::Entity;
171 using SolutionVector =
typename MDTraits::SolutionVector;
175 template<std::
size_t i, std::
size_t j>
183 using ParentType::ParentType;
185 template<
class Gr
idVarsTuple>
186 void init(std::shared_ptr<Problem<freeFlowMomentumIndex>> freeFlowMomentumProblem,
187 std::shared_ptr<Problem<freeFlowMassIndex>> freeFlowMassProblem,
188 std::shared_ptr<Problem<porousMediumIndex>> porousMediumProblem,
189 GridVarsTuple&& gridVarsTuple,
190 const SolutionVector&
curSol)
196 std::get<0>(ffSolVecTuple) = std::get<freeFlowMomentumIndex>(this->
curSol());
197 std::get<1>(ffSolVecTuple) = std::get<freeFlowMassIndex>(this->
curSol());
199 freeFlowMomentumProblem, freeFlowMassProblem,
200 std::make_tuple(std::get<freeFlowMomentumIndex>(gridVarsTuple), std::get<freeFlowMassIndex>(gridVarsTuple)),
205 std::get<0>(ffMassPmSolVecTuple) = std::get<freeFlowMassIndex>(this->
curSol());
206 std::get<1>(ffMassPmSolVecTuple) = std::get<porousMediumIndex>(this->
curSol());
208 freeFlowMassProblem, porousMediumProblem, ffMassPmSolVecTuple
212 std::get<0>(ffMomentumPmSolVecTuple) = std::get<freeFlowMomentumIndex>(this->
curSol());
213 std::get<1>(ffMomentumPmSolVecTuple) = std::get<porousMediumIndex>(this->
curSol());
215 freeFlowMomentumProblem, porousMediumProblem, ffMomentumPmSolVecTuple
219 template<std::
size_t i>
220 const Problem<i>&
problem(Dune::index_constant<i> domainI)
const
222 return this->
subApply(domainI, [&](
const auto& cm,
auto&& ii) ->
const auto& {
223 return cm.problem(ii);
227 template<std::
size_t i, std::
size_t j>
229 Dune::index_constant<j> domainJ,
230 const SubControlVolumeFace<i>& scvf)
const
232 return this->
subApply(domainI, domainJ, [&](
const auto& cm,
auto&& ii,
auto&& jj){
233 return cm.isCoupled(ii, scvf);
243 template<std::
size_t i, std::
size_t j>
245 Dune::index_constant<j> domainJ,
246 const SubControlVolume<i>& scv)
const
248 return this->
subApply(domainI, domainJ, [&](
const auto& cm,
auto&& ii,
auto&& jj){
249 return cm.isCoupled(ii, scv);
263 template<std::
size_t j>
265 const Element<freeFlowMomentumIndex>& elementI,
266 const SubControlVolume<freeFlowMomentumIndex>& scvI,
267 Dune::index_constant<j> domainJ)
const
270 return this->
subApply(domainI, domainJ, [&](
const auto& cm,
auto&& ii,
auto&& jj) ->
const auto& {
271 return cm.couplingStencil(ii, elementI, scvI, jj);
Base coupling manager for coupling freeflow and porous medium flow models.
Definition couplingmanager_base.hh:146
void init(std::shared_ptr< Problem< freeFlowMomentumIndex > > freeFlowMomentumProblem, std::shared_ptr< Problem< freeFlowMassIndex > > freeFlowMassProblem, std::shared_ptr< Problem< porousMediumIndex > > porousMediumProblem, GridVarsTuple &&gridVarsTuple, const SolutionVector &curSol)
Definition couplingmanager_base.hh:186
static constexpr auto porousMediumIndex
Definition couplingmanager_base.hh:180
static constexpr auto freeFlowMassIndex
Definition couplingmanager_base.hh:179
typename ParentType::template SubCouplingManager< i, j > SubCouplingManager
Definition couplingmanager_base.hh:176
bool isCoupled(Dune::index_constant< i > domainI, Dune::index_constant< j > domainJ, const SubControlVolumeFace< i > &scvf) const
Definition couplingmanager_base.hh:228
const auto & couplingStencil(Dune::index_constant< freeFlowMomentumIndex > domainI, const Element< freeFlowMomentumIndex > &elementI, const SubControlVolume< freeFlowMomentumIndex > &scvI, Dune::index_constant< j > domainJ) const
returns an iterable container of all indices of degrees of freedom of domain j that couple with / inf...
Definition couplingmanager_base.hh:264
bool isCoupled(Dune::index_constant< i > domainI, Dune::index_constant< j > domainJ, const SubControlVolume< i > &scv) const
If the boundary entity is on a coupling boundary.
Definition couplingmanager_base.hh:244
const Problem< i > & problem(Dune::index_constant< i > domainI) const
Definition couplingmanager_base.hh:220
static constexpr auto freeFlowMomentumIndex
Definition couplingmanager_base.hh:178
Coupling manager that combines an arbitrary number of binary coupling manager (coupling two domains e...
Definition multibinarycouplingmanager.hh:50
const auto & couplingStencil(Dune::index_constant< i > domainI, const Entity &entity, Dune::index_constant< j > domainJ) const
Return the coupling element stencil for a given bulk domain element.
Definition multibinarycouplingmanager.hh:203
decltype(auto) subApply(Dune::index_constant< i > domainI, Dune::index_constant< j > domainJ, Apply &&apply)
apply a function to the domainI-domainJ sub coupling manager using its local indices
Definition multibinarycouplingmanager.hh:137
auto & subCouplingManager(Dune::index_constant< i > domainI, Dune::index_constant< j > domainJ)
return the binary sub-coupling manager
Definition multibinarycouplingmanager.hh:119
SolutionVectors & curSol()
Definition multibinarycouplingmanager.hh:370
void updateSolution(const typename MDTraits::SolutionVector &curSol)
Update the solution vector before assembly.
Definition multibinarycouplingmanager.hh:178
Defines all properties used in Dumux.
typename Detail::FreeFlowCouplingManagerSelector< Traits >::type FreeFlowCouplingManager
The interface of the coupling manager for free flow systems.
Definition multidomain/freeflow/couplingmanager.hh:47
typename GetProp< TypeTag, Property >::type GetPropType
get the type alias defined in the property
Definition propertysystem.hh:296
Coupling manager that combines an arbitrary number of binary coupling manager (coupling two domains e...
Coupling managers specialized for different discretization schemes for mass coupling.
Coupling managers specialized for different discretization schemes for momentum coupling.
Freeflow coupling managers (Navier-Stokes mass-momentum coupling)
constexpr auto coupledDomains(Dune::index_constant< i > domainI)
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:64
constexpr auto globalToLocalDomainIndices(Dune::index_constant< i >, Dune::index_constant< j >)
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:75
constexpr auto makeCouplingManagerMap()
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:44
typename FreeFlowMassPorousMediumDetail::FreeFlowMassPorousMediumCouplingManagerSelector< MDTraits >::type FreeFlowMassPorousMediumCouplingManager
Definition multidomain/boundary/freeflowporousmedium/ffmasspm/couplingmanager.hh:40
typename FreeFlowMomentumPorousMediumDetail::FreeFlowMomentumPorousMediumCouplingManagerSelector< MDTraits >::type FreeFlowMomentumPorousMediumCouplingManager
Definition multidomain/boundary/freeflowporousmedium/ffmomentumpm/couplingmanager.hh:40