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;
173 template<std::
size_t id>
174 using SubSolutionVector
175 = std::decay_t<decltype(std::declval<SolutionVector>()[Dune::index_constant<id>()])>;
179 template<std::
size_t i, std::
size_t j>
184 static constexpr auto porousMediumIndex = FreeFlowPorousMediumDetail::porousMediumIndex;
187 using ParentType::ParentType;
189 template<
class Gr
idVarsTuple>
190 void init(std::shared_ptr<Problem<freeFlowMomentumIndex>> freeFlowMomentumProblem,
191 std::shared_ptr<Problem<freeFlowMassIndex>> freeFlowMassProblem,
192 std::shared_ptr<Problem<porousMediumIndex>> porousMediumProblem,
193 GridVarsTuple&& gridVarsTuple,
194 const SolutionVector&
curSol)
197 this->init_(freeFlowMomentumProblem, freeFlowMassProblem, porousMediumProblem, std::forward<GridVarsTuple>(gridVarsTuple),
curSol);
202 freeFlowMomentumProblem, freeFlowMassProblem,
203 std::make_tuple(std::get<freeFlowMomentumIndex>(gridVarsTuple), std::get<freeFlowMassIndex>(gridVarsTuple)),
204 FFSol{ std::get<freeFlowMomentumIndex>(this->
curSol()), std::get<freeFlowMassIndex>(this->
curSol()) }
208 template<
class Gr
idVarsTuple>
209 void init(std::shared_ptr<Problem<freeFlowMomentumIndex>> freeFlowMomentumProblem,
210 std::shared_ptr<Problem<freeFlowMassIndex>> freeFlowMassProblem,
211 std::shared_ptr<Problem<porousMediumIndex>> porousMediumProblem,
212 GridVarsTuple&& gridVarsTuple,
213 const SolutionVector&
curSol,
214 const SolutionVector& prevSol)
217 this->init_(freeFlowMomentumProblem, freeFlowMassProblem, porousMediumProblem, std::forward<GridVarsTuple>(gridVarsTuple),
curSol);
220 using FFPrevSol = std::tuple<const SubSolutionVector<freeFlowMomentumIndex>*,
const SubSolutionVector<freeFlowMassIndex>*>;
222 freeFlowMomentumProblem, freeFlowMassProblem,
223 std::make_tuple(std::get<freeFlowMomentumIndex>(gridVarsTuple), std::get<freeFlowMassIndex>(gridVarsTuple)),
224 FFSol{ std::get<freeFlowMomentumIndex>(this->
curSol()), std::get<freeFlowMassIndex>(this->
curSol()) },
229 template<std::
size_t i>
230 const Problem<i>&
problem(Dune::index_constant<i> domainI)
const
232 return this->
subApply(domainI, [&](
const auto& cm,
auto&& ii) ->
const auto& {
233 return cm.problem(ii);
237 template<std::
size_t i, std::
size_t j>
238 bool isCoupled(Dune::index_constant<i> domainI,
239 Dune::index_constant<j> domainJ,
240 const SubControlVolumeFace<i>& scvf)
const
242 return this->
subApply(domainI, domainJ, [&](
const auto& cm,
auto&& ii,
auto&& jj){
243 return cm.isCoupled(ii, scvf);
253 template<std::
size_t i, std::
size_t j>
254 bool isCoupled(Dune::index_constant<i> domainI,
255 Dune::index_constant<j> domainJ,
256 const SubControlVolume<i>& scv)
const
258 return this->
subApply(domainI, domainJ, [&](
const auto& cm,
auto&& ii,
auto&& jj){
259 return cm.isCoupled(ii, scv);
273 template<std::
size_t j>
274 const auto&
couplingStencil(Dune::index_constant<freeFlowMomentumIndex> domainI,
275 const Element<freeFlowMomentumIndex>& elementI,
276 const SubControlVolume<freeFlowMomentumIndex>& scvI,
277 Dune::index_constant<j> domainJ)
const
280 return this->
subApply(domainI, domainJ, [&](
const auto& cm,
auto&& ii,
auto&& jj) ->
const auto& {
281 return cm.couplingStencil(ii, elementI, scvI, jj);
288 template<
class Gr
idVarsTuple>
289 void init_(std::shared_ptr<Problem<freeFlowMomentumIndex>> freeFlowMomentumProblem,
290 std::shared_ptr<Problem<freeFlowMassIndex>> freeFlowMassProblem,
291 std::shared_ptr<Problem<porousMediumIndex>> porousMediumProblem,
292 GridVarsTuple&& gridVarsTuple,
293 const SolutionVector&
curSol)
298 using FFMassPMSol =
typename SubCouplingManager<freeFlowMassIndex, porousMediumIndex>::SolutionVectorStorage;
300 freeFlowMassProblem, porousMediumProblem,
301 FFMassPMSol{ std::get<freeFlowMassIndex>(this->
curSol()), std::get<porousMediumIndex>(this->
curSol()) }
304 using FFMomPMSol =
typename SubCouplingManager<freeFlowMomentumIndex, porousMediumIndex>::SolutionVectorStorage;
306 freeFlowMomentumProblem, porousMediumProblem,
307 FFMomPMSol{ std::get<freeFlowMomentumIndex>(this->
curSol()), std::get<porousMediumIndex>(this->
curSol()) }
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:189
static constexpr auto porousMediumIndex
Definition couplingmanager_base.hh:183
static constexpr auto freeFlowMassIndex
Definition couplingmanager_base.hh:182
typename ParentType::template SubCouplingManager< i, j > SubCouplingManager
Definition couplingmanager_base.hh:179
bool isCoupled(Dune::index_constant< i > domainI, Dune::index_constant< j > domainJ, const SubControlVolumeFace< i > &scvf) const
Definition couplingmanager_base.hh:237
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:273
const Problem< i > & problem(Dune::index_constant< i > domainI) const
Definition couplingmanager_base.hh:229
static constexpr auto freeFlowMomentumIndex
Definition couplingmanager_base.hh:181
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
MultiBinaryCouplingManager()
Definition multibinarycouplingmanager.hh:103
decltype(auto) subApply(Dune::index_constant< i > domainI, Dune::index_constant< j > domainJ, Apply &&apply)
Definition multibinarycouplingmanager.hh:137
auto & subCouplingManager(Dune::index_constant< i > domainI, Dune::index_constant< j > domainJ)
Definition multibinarycouplingmanager.hh:119
SolutionVectors & curSol()
Definition multibinarycouplingmanager.hh:370
void updateSolution(const typename MDTraits::SolutionVector &curSol)
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 FreeFlowMomentumPorousMediumDetail::FreeFlowMomentumPorousMediumCouplingManagerSelector< MDTraits >::type FreeFlowMomentumPorousMediumCouplingManager
Definition multidomain/boundary/freeflowporousmedium/ffmomentumpm/couplingmanager.hh:40
typename FreeFlowMassPorousMediumDetail::FreeFlowMassPorousMediumCouplingManagerSelector< MDTraits >::type FreeFlowMassPorousMediumCouplingManager
Definition multidomain/boundary/freeflowporousmedium/ffmasspm/couplingmanager.hh:40