version 3.7
multidomain/boundary/freeflowporousmedium/couplingmanager.hh
Go to the documentation of this file.
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//
13#ifndef DUMUX_MULTIDOMAIN_BOUNDARY_FREEFLOW_POROUSMEDIUM_COUPLINGMANAGER_HH
14#define DUMUX_MULTIDOMAIN_BOUNDARY_FREEFLOW_POROUSMEDIUM_COUPLINGMANAGER_HH
15
16#include <utility>
17#include <memory>
18
19#include <dune/common/indices.hh>
25
26#include "couplingconditions.hh"
27
28namespace Dumux {
29
30namespace FreeFlowPorousMediumDetail {
31
32// global subdomain indices
33static constexpr auto freeFlowMomentumIndex = Dune::index_constant<0>();
34static constexpr auto freeFlowMassIndex = Dune::index_constant<1>();
35static constexpr auto porousMediumIndex = Dune::index_constant<2>();
36
37// coupling indices
38static constexpr auto freeFlowMassToFreeFlowMomentumIndex = Dune::index_constant<0>();
39static constexpr auto freeFlowMomentumToPorousMediumIndex = Dune::index_constant<1>();
40static constexpr auto freeFlowMassToPorousMediumIndex = Dune::index_constant<2>();
41static constexpr auto noCouplingIdx = Dune::index_constant<99>();
42
43constexpr auto makeCouplingManagerMap()
44{
45 auto map = std::array<std::array<std::size_t, 3>, 3>{};
46
47 // free flow (momentum-mass)
50
51 // free flow momentum - porous medium
54
55 // free flow mass - porous medium
58
59 return map;
60}
61
62template<std::size_t i>
63constexpr auto coupledDomains(Dune::index_constant<i> domainI)
64{
65 if constexpr (i == freeFlowMomentumIndex)
66 return std::make_tuple(freeFlowMassIndex, porousMediumIndex);
67 else if constexpr (i == freeFlowMassIndex)
68 return std::make_tuple(freeFlowMomentumIndex, porousMediumIndex);
69 else // i == porousMediumIndex
70 return std::make_tuple(freeFlowMomentumIndex, freeFlowMassIndex);
71}
72
73template<std::size_t i, std::size_t j>
74constexpr auto globalToLocalDomainIndices(Dune::index_constant<i>, Dune::index_constant<j>)
75{
76 static_assert(i <= 2 && j <= 2);
77 static_assert(i != j);
78
79 if constexpr (i < j)
80 return std::pair<Dune::index_constant<0>, Dune::index_constant<1>>{};
81 else
82 return std::pair<Dune::index_constant<1>, Dune::index_constant<0>>{};
83}
84
86{
87 static constexpr auto managerMap()
88 {
90 }
91
92 template<std::size_t i, std::size_t j>
93 static constexpr auto globalToLocal(Dune::index_constant<i> domainI, Dune::index_constant<j> domainJ)
94 {
96 }
97
98 template<std::size_t i>
99 static constexpr auto coupledDomains(Dune::index_constant<i> domainI)
100 {
102 }
103};
104
105template<class MDTraits>
107{
108 template<std::size_t id>
109 using SubDomainTypeTag = typename MDTraits::template SubDomain<id>::TypeTag;
110
113 >;
114
117 >;
118
121 >;
122
129};
130
131} // end namespace Detail
132
133
138template<class MDTraits>
141 MDTraits,
142 FreeFlowPorousMediumDetail::CouplingMaps,
143 typename FreeFlowPorousMediumDetail::CouplingManagers<MDTraits>::FreeFlowCouplingManager,
144 typename FreeFlowPorousMediumDetail::CouplingManagers<MDTraits>::FreeFlowMomentumPorousMediumCouplingManager,
145 typename FreeFlowPorousMediumDetail::CouplingManagers<MDTraits>::FreeFlowMassPorousMediumCouplingManager
146>
147{
149 MDTraits,
154 >;
155
156 using Scalar = typename MDTraits::Scalar;
157
158 // the sub domain type tags
159 template<std::size_t id>
160 using SubDomainTypeTag = typename MDTraits::template SubDomain<id>::TypeTag;
161
162 template<std::size_t id> using Problem = GetPropType<SubDomainTypeTag<id>, Properties::Problem>;
163 template<std::size_t id> using GridGeometry = GetPropType<SubDomainTypeTag<id>, Properties::GridGeometry>;
164 template<std::size_t id> using FVElementGeometry = typename GridGeometry<id>::LocalView;
165 template<std::size_t id> using SubControlVolumeFace = typename FVElementGeometry<id>::SubControlVolumeFace;
166 template<std::size_t id> using SubControlVolume = typename FVElementGeometry<id>::SubControlVolume;
167 template<std::size_t id> using ElementVolumeVariables = typename GetPropType<SubDomainTypeTag<id>, Properties::GridVolumeVariables>::LocalView;
168 template<std::size_t id> using NumEqVector = typename Problem<id>::Traits::NumEqVector;
169
170 template<std::size_t id> using GridView = typename GridGeometry<id>::GridView;
171 template<std::size_t id> using Element = typename GridView<id>::template Codim<0>::Entity;
172 using SolutionVector = typename MDTraits::SolutionVector;
173
175
176public:
177
178 template<std::size_t i, std::size_t j>
179 using SubCouplingManager = typename ParentType::template SubCouplingManager<i, j>;
180
184
185public:
186 using ParentType::ParentType;
187
188 template<class GridVarsTuple>
189 void init(std::shared_ptr<Problem<freeFlowMomentumIndex>> freeFlowMomentumProblem,
190 std::shared_ptr<Problem<freeFlowMassIndex>> freeFlowMassProblem,
191 std::shared_ptr<Problem<porousMediumIndex>> porousMediumProblem,
192 GridVarsTuple&& gridVarsTuple,
193 const SolutionVector& curSol)
194 {
195 this->updateSolution(curSol); // generic coupling manager stores tuple of shared_ptr
196
197 // initialize the binary sub coupling managers
199 std::get<0>(ffSolVecTuple) = std::get<freeFlowMomentumIndex>(this->curSol());
200 std::get<1>(ffSolVecTuple) = std::get<freeFlowMassIndex>(this->curSol());
202 freeFlowMomentumProblem, freeFlowMassProblem,
203 std::make_tuple(std::get<freeFlowMomentumIndex>(gridVarsTuple), std::get<freeFlowMassIndex>(gridVarsTuple)),
204 ffSolVecTuple
205 );
206
208 std::get<0>(ffMassPmSolVecTuple) = std::get<freeFlowMassIndex>(this->curSol());
209 std::get<1>(ffMassPmSolVecTuple) = std::get<porousMediumIndex>(this->curSol());
211 freeFlowMassProblem, porousMediumProblem, ffMassPmSolVecTuple
212 );
213
215 std::get<0>(ffMomentumPmSolVecTuple) = std::get<freeFlowMomentumIndex>(this->curSol());
216 std::get<1>(ffMomentumPmSolVecTuple) = std::get<porousMediumIndex>(this->curSol());
218 freeFlowMomentumProblem, porousMediumProblem, ffMomentumPmSolVecTuple
219 );
220 }
221
225 template<std::size_t i, std::size_t j>
226 auto massCouplingCondition(Dune::index_constant<i> domainI, Dune::index_constant<j> domainJ,
227 const FVElementGeometry<i>& fvGeometry,
228 const typename FVElementGeometry<i>::SubControlVolumeFace& scvf,
229 const ElementVolumeVariables<i>& elemVolVars) const
230 {
231 static_assert(domainI != freeFlowMomentumIndex && domainJ != freeFlowMomentumIndex);
232
233 const auto& couplingContext = this->subApply(domainI, domainJ, [&](const auto& cm, auto&& ii, auto&& jj) -> const auto& {
234 return cm.couplingContext(ii, fvGeometry, scvf);
235 });
236
237 const auto& freeFlowElement = [&]
238 {
239 if constexpr (domainI == freeFlowMassIndex)
240 return fvGeometry.element();
241 else
242 return couplingContext.fvGeometry.element();
243 }();
244
245 const auto& freeFlowScvf = [&]
246 {
247 if constexpr (domainI == freeFlowMassIndex)
248 return scvf;
249 else
250 return couplingContext.fvGeometry.scvf(couplingContext.freeFlowMassScvfIdx);
251
252 }();
253
254 // todo revise velocity (see ff mom pm mgr)
255
256 couplingContext.velocity = this->subCouplingManager(freeFlowMomentumIndex, freeFlowMassIndex).faceVelocity(freeFlowElement, freeFlowScvf);
257 return CouplingConditions::massCouplingCondition(domainI, domainJ, fvGeometry, scvf, elemVolVars, couplingContext);
258 }
259
260
263
264 NumEqVector<freeFlowMomentumIndex> momentumCouplingCondition(Dune::index_constant<freeFlowMomentumIndex> domainI,
265 Dune::index_constant<porousMediumIndex> domainJ,
266 const FVElementGeometry<freeFlowMomentumIndex>& fvGeometry,
267 const typename FVElementGeometry<freeFlowMomentumIndex>::SubControlVolumeFace& scvf,
268 const ElementVolumeVariables<freeFlowMomentumIndex>& elemVolVars) const
269 {
270 if (scvf.isLateral())
271 return NumEqVector<freeFlowMomentumIndex>(0.0);
272
273 const auto& context = this->subCouplingManager(freeFlowMomentumIndex, porousMediumIndex).couplingContext(
274 domainI, fvGeometry, scvf
275 );
276
277 return CouplingConditions::momentumCouplingCondition(fvGeometry, scvf, elemVolVars, context);
278 }
279
283 auto darcyPermeability(const FVElementGeometry<freeFlowMomentumIndex>& fvGeometry,
284 const SubControlVolumeFace<freeFlowMomentumIndex>& scvf) const
285 {
286 if (scvf.isFrontal())
287 {
288 const auto& context = this->subCouplingManager(freeFlowMomentumIndex, porousMediumIndex).couplingContext(
289 Dune::index_constant<freeFlowMomentumIndex>(), fvGeometry, scvf
290 );
291
292 return CouplingConditions::darcyPermeability(fvGeometry, scvf, context);
293 }
294 else
295 {
296 const auto& orthogonalScvf = fvGeometry.lateralOrthogonalScvf(scvf);
297 const auto& orthogonalScv = fvGeometry.scv(orthogonalScvf.insideScvIdx());
298 const auto& frontalScvfOnBoundary = fvGeometry.frontalScvfOnBoundary(orthogonalScv);
299 const auto& context = this->subCouplingManager(freeFlowMomentumIndex, porousMediumIndex).couplingContext(
300 Dune::index_constant<freeFlowMomentumIndex>(), fvGeometry, frontalScvfOnBoundary
301 );
302
303 return CouplingConditions::darcyPermeability(fvGeometry, frontalScvfOnBoundary, context);
304 }
305 }
306
309
313 Scalar pressure(const Element<freeFlowMomentumIndex>& element,
314 const FVElementGeometry<freeFlowMomentumIndex>& fvGeometry,
315 const SubControlVolumeFace<freeFlowMomentumIndex>& scvf) const
316 {
318 element, fvGeometry, scvf
319 );
320 }
321
328 Scalar cellPressure(const Element<freeFlowMomentumIndex>& element,
329 const SubControlVolumeFace<freeFlowMomentumIndex>& scvf) const
330 {
332 element, scvf
333 );
334 }
335
339 Scalar density(const Element<freeFlowMomentumIndex>& element,
340 const FVElementGeometry<freeFlowMomentumIndex>& fvGeometry,
341 const SubControlVolumeFace<freeFlowMomentumIndex>& scvf,
342 const bool considerPreviousTimeStep = false) const
343 {
345 element, fvGeometry, scvf, considerPreviousTimeStep
346 );
347 }
348
349 auto insideAndOutsideDensity(const Element<freeFlowMomentumIndex>& element,
350 const FVElementGeometry<freeFlowMomentumIndex>& fvGeometry,
351 const SubControlVolumeFace<freeFlowMomentumIndex>& scvf,
352 const bool considerPreviousTimeStep = false) const
353 {
354 return this->subCouplingManager(freeFlowMomentumIndex, freeFlowMassIndex).insideAndOutsideDensity(
355 element, fvGeometry, scvf, considerPreviousTimeStep
356 );
357 }
358
362 Scalar density(const Element<freeFlowMomentumIndex>& element,
363 const SubControlVolume<freeFlowMomentumIndex>& scv,
364 const bool considerPreviousTimeStep = false) const
365 {
367 element, scv, considerPreviousTimeStep
368 );
369 }
370
374 Scalar effectiveViscosity(const Element<freeFlowMomentumIndex>& element,
375 const FVElementGeometry<freeFlowMomentumIndex>& fvGeometry,
376 const SubControlVolumeFace<freeFlowMomentumIndex>& scvf) const
377 {
378 return this->subCouplingManager(freeFlowMomentumIndex, freeFlowMassIndex).effectiveViscosity(
379 element, fvGeometry, scvf
380 );
381 }
382
386 auto faceVelocity(const Element<freeFlowMassIndex>& element,
387 const SubControlVolumeFace<freeFlowMassIndex>& scvf) const
388 {
390 element, scvf
391 );
392 }
393
394 template<std::size_t i>
395 const Problem<i>& problem(Dune::index_constant<i> domainI) const
396 {
397 return this->subApply(domainI, [&](const auto& cm, auto&& ii) -> const auto& {
398 return cm.problem(ii);
399 });
400 }
401
402 template<std::size_t i, std::size_t j>
403 bool isCoupled(Dune::index_constant<i> domainI,
404 Dune::index_constant<j> domainJ,
405 const SubControlVolumeFace<i>& scvf) const
406 {
407 return this->subApply(domainI, domainJ, [&](const auto& cm, auto&& ii, auto&& jj){
408 return cm.isCoupled(ii, scvf);
409 });
410 }
411
418 template<std::size_t i, std::size_t j>
419 bool isCoupled(Dune::index_constant<i> domainI,
420 Dune::index_constant<j> domainJ,
421 const SubControlVolume<i>& scv) const
422 {
423 return this->subApply(domainI, domainJ, [&](const auto& cm, auto&& ii, auto&& jj){
424 return cm.isCoupled(ii, scv);
425 });
426 }
427
431 bool isCoupledLateralScvf(Dune::index_constant<freeFlowMomentumIndex> domainI,
432 Dune::index_constant<porousMediumIndex> domainJ,
433 const SubControlVolumeFace<freeFlowMomentumIndex>& scvf) const
434 {
435 return this->subApply(domainI, domainJ, [&](const auto& cm, auto&& ii, auto&& jj){
436 return cm.isCoupledLateralScvf(ii, scvf);
437 });
438 }
439
440
451 template<std::size_t j>
452 const auto& couplingStencil(Dune::index_constant<freeFlowMomentumIndex> domainI,
453 const Element<freeFlowMomentumIndex>& elementI,
454 const SubControlVolume<freeFlowMomentumIndex>& scvI,
455 Dune::index_constant<j> domainJ) const
456 {
457 static_assert(freeFlowMomentumIndex != j);
458 return this->subApply(domainI, domainJ, [&](const auto& cm, auto&& ii, auto&& jj) -> const auto& {
459 return cm.couplingStencil(ii, elementI, scvI, jj);
460 });
461 }
462};
463
464} // end namespace Dumux
465
466#endif
Coupling manager for Stokes and Darcy domains with equal dimension.
Definition: multidomain/boundary/freeflowporousmedium/ffmasspm/couplingmanager.hh:35
Coupling manager for Stokes and Darcy domains with equal dimension.
Definition: multidomain/boundary/freeflowporousmedium/ffmomentumpm/couplingmanager.hh:36
Definition: freeflowporousmedium/couplingconditions.hh:72
Coupling manager for coupling freeflow and porous medium flow models.
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:147
static constexpr auto freeFlowMassIndex
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:182
auto faceVelocity(const Element< freeFlowMassIndex > &element, const SubControlVolumeFace< freeFlowMassIndex > &scvf) const
Returns the velocity at a given sub control volume face.
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:386
bool isCoupledLateralScvf(Dune::index_constant< freeFlowMomentumIndex > domainI, Dune::index_constant< porousMediumIndex > domainJ, const SubControlVolumeFace< freeFlowMomentumIndex > &scvf) const
Returns whether a given scvf is coupled to the other domain.
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:431
Scalar density(const Element< freeFlowMomentumIndex > &element, const FVElementGeometry< freeFlowMomentumIndex > &fvGeometry, const SubControlVolumeFace< freeFlowMomentumIndex > &scvf, const bool considerPreviousTimeStep=false) const
Returns the density at a given sub control volume face.
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:339
typename ParentType::template SubCouplingManager< i, j > SubCouplingManager
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:179
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: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:452
auto darcyPermeability(const FVElementGeometry< freeFlowMomentumIndex > &fvGeometry, const SubControlVolumeFace< freeFlowMomentumIndex > &scvf) const
Returns the intrinsic permeability of the coupled Darcy element.
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:283
Scalar density(const Element< freeFlowMomentumIndex > &element, const SubControlVolume< freeFlowMomentumIndex > &scv, const bool considerPreviousTimeStep=false) const
Returns the density at a given sub control volume.
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:362
static constexpr auto porousMediumIndex
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:183
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: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:189
static constexpr auto freeFlowMomentumIndex
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:181
NumEqVector< freeFlowMomentumIndex > momentumCouplingCondition(Dune::index_constant< freeFlowMomentumIndex > domainI, Dune::index_constant< porousMediumIndex > domainJ, const FVElementGeometry< freeFlowMomentumIndex > &fvGeometry, const typename FVElementGeometry< freeFlowMomentumIndex >::SubControlVolumeFace &scvf, const ElementVolumeVariables< freeFlowMomentumIndex > &elemVolVars) const
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:264
auto massCouplingCondition(Dune::index_constant< i > domainI, Dune::index_constant< j > domainJ, const FVElementGeometry< i > &fvGeometry, const typename FVElementGeometry< i >::SubControlVolumeFace &scvf, const ElementVolumeVariables< i > &elemVolVars) const
Returns the mass flux across the coupling boundary.
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:226
Scalar pressure(const Element< freeFlowMomentumIndex > &element, const FVElementGeometry< freeFlowMomentumIndex > &fvGeometry, const SubControlVolumeFace< freeFlowMomentumIndex > &scvf) const
Returns the pressure at a given sub control volume face.
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:313
bool isCoupled(Dune::index_constant< i > domainI, Dune::index_constant< j > domainJ, const SubControlVolumeFace< i > &scvf) const
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:403
Scalar cellPressure(const Element< freeFlowMomentumIndex > &element, const SubControlVolumeFace< freeFlowMomentumIndex > &scvf) const
Returns the pressure at the center of a sub control volume corresponding to a given sub control volum...
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:328
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: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:419
Scalar effectiveViscosity(const Element< freeFlowMomentumIndex > &element, const FVElementGeometry< freeFlowMomentumIndex > &fvGeometry, const SubControlVolumeFace< freeFlowMomentumIndex > &scvf) const
Returns the pressure at a given sub control volume face.
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:374
const Problem< i > & problem(Dune::index_constant< i > domainI) const
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:395
auto insideAndOutsideDensity(const Element< freeFlowMomentumIndex > &element, const FVElementGeometry< freeFlowMomentumIndex > &fvGeometry, const SubControlVolumeFace< freeFlowMomentumIndex > &scvf, const bool considerPreviousTimeStep=false) const
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:349
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
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:267
Freeflow coupling managers (Navier-Stokes mass-momentum coupling)
static constexpr auto freeFlowMomentumIndex
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:33
static constexpr auto freeFlowMassToFreeFlowMomentumIndex
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:38
constexpr auto globalToLocalDomainIndices(Dune::index_constant< i >, Dune::index_constant< j >)
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:74
static constexpr auto freeFlowMassToPorousMediumIndex
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:40
static constexpr auto porousMediumIndex
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:35
static constexpr auto noCouplingIdx
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:41
constexpr auto makeCouplingManagerMap()
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:43
static constexpr auto freeFlowMomentumToPorousMediumIndex
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:39
static constexpr auto freeFlowMassIndex
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:34
constexpr auto coupledDomains(Dune::index_constant< i > domainI)
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:63
Definition: adapt.hh:17
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:107
typename MDTraits::template SubDomain< id >::TypeTag SubDomainTypeTag
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:109
Dumux::FreeFlowCouplingManager< FreeFlowTraits > FreeFlowCouplingManager
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:124
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:86
static constexpr auto globalToLocal(Dune::index_constant< i > domainI, Dune::index_constant< j > domainJ)
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:93
static constexpr auto coupledDomains(Dune::index_constant< i > domainI)
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:99
static constexpr auto managerMap()
Definition: multidomain/boundary/freeflowporousmedium/couplingmanager.hh:87
Definition: multidomain/traits.hh:134