version 3.10.0
Loading...
Searching...
No Matches
multidomain/boundary/freeflowporenetwork/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-FileCopyrightText: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
5// SPDX-License-Identifier: GPL-3.0-or-later
6//
12
13#ifndef DUMUX_MULTIDOMAIN_BOUNDARY_FREEFLOW_PORENETWORK_COUPLINGMANAGER_HH
14#define DUMUX_MULTIDOMAIN_BOUNDARY_FREEFLOW_PORENETWORK_COUPLINGMANAGER_HH
15
16#include <utility>
17#include <memory>
18
19#include <dune/common/indices.hh>
25
26#include "couplingconditions.hh"
27#include "couplingmapper.hh"
28
29namespace Dumux {
30
32
33// global subdomain indices
34static constexpr auto freeFlowMomentumIndex = Dune::index_constant<0>();
35static constexpr auto freeFlowMassIndex = Dune::index_constant<1>();
36static constexpr auto poreNetworkIndex = Dune::index_constant<2>();
37
38// coupling indices
39static constexpr auto freeFlowMassToFreeFlowMomentumIndex = Dune::index_constant<0>();
40static constexpr auto freeFlowMomentumToPoreNetworkIndex = Dune::index_constant<1>();
41static constexpr auto freeFlowMassToPoreNetworkIndex = Dune::index_constant<2>();
42static constexpr auto noCouplingIdx = Dune::index_constant<99>();
43
44constexpr auto makeCouplingManagerMap()
45{
46 auto map = std::array<std::array<std::size_t, 3>, 3>{};
47
48 // free flow (momentum-mass)
51
52 // free flow momentum - porous medium
55
56 // free flow mass - porous medium
59
60 return map;
61}
62
63template<std::size_t i>
64constexpr auto coupledDomains(Dune::index_constant<i> domainI)
65{
66 if constexpr (i == freeFlowMomentumIndex)
67 return std::make_tuple(freeFlowMassIndex, poreNetworkIndex);
68 else if constexpr (i == freeFlowMassIndex)
69 return std::make_tuple(freeFlowMomentumIndex, poreNetworkIndex);
70 else // i == poreNetworkIndex
71 return std::make_tuple(freeFlowMomentumIndex, freeFlowMassIndex);
72}
73
74template<std::size_t i, std::size_t j>
75constexpr auto globalToLocalDomainIndices(Dune::index_constant<i>, Dune::index_constant<j>)
76{
77 static_assert(i <= 2 && j <= 2);
78 static_assert(i != j);
79
80 if constexpr (i < j)
81 return std::pair<Dune::index_constant<0>, Dune::index_constant<1>>{};
82 else
83 return std::pair<Dune::index_constant<1>, Dune::index_constant<0>>{};
84}
85
87{
88 static constexpr auto managerMap()
89 {
91 }
92
93 template<std::size_t i, std::size_t j>
94 static constexpr auto globalToLocal(Dune::index_constant<i> domainI, Dune::index_constant<j> domainJ)
95 {
97 }
98
99 template<std::size_t i>
100 static constexpr auto coupledDomains(Dune::index_constant<i> domainI)
101 {
103 }
104};
105
106template<class MDTraits>
131
132} // end namespace Detail
133
138template<class MDTraits>
141 MDTraits,
142 FreeFlowPoreNetworkDetail::CouplingMaps,
143 typename FreeFlowPoreNetworkDetail::CouplingManagers<MDTraits>::FreeFlowCouplingManager,
144 typename FreeFlowPoreNetworkDetail::CouplingManagers<MDTraits>::FreeFlowMomentumPoreNetworkCouplingManager,
145 typename FreeFlowPoreNetworkDetail::CouplingManagers<MDTraits>::FreeFlowMassPoreNetworkCouplingManager
146>
147{
148 using ParentType = MultiBinaryCouplingManager<
149 MDTraits,
154 >;
155
157
158 using Scalar = typename MDTraits::Scalar;
159
160 // the sub domain type tags
161 template<std::size_t id>
162 using SubDomainTypeTag = typename MDTraits::template SubDomain<id>::TypeTag;
163
164 template<std::size_t id> using Problem = GetPropType<SubDomainTypeTag<id>, Properties::Problem>;
165 template<std::size_t id> using GridGeometry = GetPropType<SubDomainTypeTag<id>, Properties::GridGeometry>;
166 template<std::size_t id> using FVElementGeometry = typename GridGeometry<id>::LocalView;
167 template<std::size_t id> using SubControlVolumeFace = typename FVElementGeometry<id>::SubControlVolumeFace;
168 template<std::size_t id> using SubControlVolume = typename FVElementGeometry<id>::SubControlVolume;
169 template<std::size_t id> using ElementVolumeVariables = typename GetPropType<SubDomainTypeTag<id>, Properties::GridVolumeVariables>::LocalView;
170 template<std::size_t id> using NumEqVector = typename Problem<id>::Traits::NumEqVector;
171
172 template<std::size_t id> using GridView = typename GridGeometry<id>::GridView;
173 template<std::size_t id> using Element = typename GridView<id>::template Codim<0>::Entity;
174 using SolutionVector = typename MDTraits::SolutionVector;
175
176 template<std::size_t id>
177 using SubSolutionVector
178 = std::decay_t<decltype(std::declval<SolutionVector>()[Dune::index_constant<id>()])>;
179
181 using CouplingMapper = StaggeredFreeFlowPoreNetworkCouplingMapper;
182
183public:
184
185 template<std::size_t i, std::size_t j>
186 using SubCouplingManager = typename ParentType::template SubCouplingManager<i, j>;
191
192public:
193 using ParentType::ParentType;
194
195 template<class GridVarsTuple>
196 void init(std::shared_ptr<Problem<freeFlowMomentumIndex>> freeFlowMomentumProblem,
197 std::shared_ptr<Problem<freeFlowMassIndex>> freeFlowMassProblem,
198 std::shared_ptr<Problem<poreNetworkIndex>> poreNetworkProblem,
199 GridVarsTuple&& gridVarsTuple,
200 const SolutionVector& curSol)
201 {
202 // initialize sub coupling manager that are not stationary or transient problem specific
203 this->init_(freeFlowMomentumProblem, freeFlowMassProblem, poreNetworkProblem, std::forward<GridVarsTuple>(gridVarsTuple), curSol);
204
205 // initialize stationary-specific sub coupling manager for free-flow
208 freeFlowMomentumProblem, freeFlowMassProblem,
209 std::make_tuple(std::get<freeFlowMomentumIndex>(gridVarsTuple), std::get<freeFlowMassIndex>(gridVarsTuple)),
210 FFSol{ std::get<freeFlowMomentumIndex>(this->curSol()), std::get<freeFlowMassIndex>(this->curSol()) }
211 );
212 }
213
214 template<class GridVarsTuple>
215 void init(std::shared_ptr<Problem<freeFlowMomentumIndex>> freeFlowMomentumProblem,
216 std::shared_ptr<Problem<freeFlowMassIndex>> freeFlowMassProblem,
217 std::shared_ptr<Problem<poreNetworkIndex>> poreNetworkProblem,
218 GridVarsTuple&& gridVarsTuple,
219 const SolutionVector& curSol,
220 const SolutionVector& prevSol)
221 {
222 // initialize sub coupling manager that are not stationary or transient problem specific
223 this->init_(freeFlowMomentumProblem, freeFlowMassProblem, poreNetworkProblem, std::forward<GridVarsTuple>(gridVarsTuple), curSol);
224
226 using FFPrevSol = std::tuple<const SubSolutionVector<freeFlowMomentumIndex>*, const SubSolutionVector<freeFlowMassIndex>*>;
228 freeFlowMomentumProblem, freeFlowMassProblem,
229 std::make_tuple(std::get<freeFlowMomentumIndex>(gridVarsTuple), std::get<freeFlowMassIndex>(gridVarsTuple)),
230 FFSol{ std::get<freeFlowMomentumIndex>(this->curSol()), std::get<freeFlowMassIndex>(this->curSol()) },
231 FFPrevSol{ &prevSol[freeFlowMomentumIndex], &prevSol[freeFlowMassIndex] }
232 );
233 }
234
237 */
238 auto massCouplingCondition(Dune::index_constant<poreNetworkIndex> domainI,
239 Dune::index_constant<freeFlowMassIndex> domainJ,
240 const FVElementGeometry<poreNetworkIndex>& fvGeometry,
241 const typename FVElementGeometry<poreNetworkIndex>::SubControlVolume& scv,
242 const ElementVolumeVariables<poreNetworkIndex>& elemVolVars) const
243 {
244 const auto& couplingContext = this->subApply(domainI, domainJ, [&](const auto& cm, auto&& ii, auto&& jj) -> const auto& {
245 return cm.couplingContext(ii, fvGeometry, scv);
246 });
247
248 const auto& freeFlowMassGridGeometry = this->subApply(domainI, domainJ, [&](const auto& cm, auto&& ii, auto&& jj) -> const auto& {
249 return cm.problem(jj).gridGeometry();
250 });
251
252 for (auto& c : couplingContext)
253 {
254 const auto& freeFlowElement = freeFlowMassGridGeometry.element(c.scv.elementIndex());
255 c.velocity = this->subCouplingManager(freeFlowMomentumIndex, freeFlowMassIndex).faceVelocity(freeFlowElement, c.scvf);
256 }
257
258 return CouplingConditions::massCouplingCondition(domainI, domainJ, fvGeometry, scv, elemVolVars, couplingContext);
259 }
260
263 */
264 auto massCouplingCondition(Dune::index_constant<freeFlowMassIndex> domainI,
265 Dune::index_constant<poreNetworkIndex> domainJ,
266 const FVElementGeometry<freeFlowMassIndex>& fvGeometry,
267 const typename FVElementGeometry<freeFlowMassIndex>::SubControlVolumeFace& scvf,
268 const ElementVolumeVariables<freeFlowMassIndex>& elemVolVars) const
269 {
270 const auto& couplingContext = this->subApply(domainI, domainJ, [&](const auto& cm, auto&& ii, auto&& jj) -> const auto& {
271 return cm.couplingContext(ii, fvGeometry, scvf);
272 });
273
274 couplingContext.velocity = this->subCouplingManager(freeFlowMomentumIndex, freeFlowMassIndex).faceVelocity(fvGeometry.element(), scvf);
275 return CouplingConditions::massCouplingCondition(domainI, domainJ, fvGeometry, scvf, elemVolVars, couplingContext);
276 }
277
280 */
281 auto energyCouplingCondition(Dune::index_constant<poreNetworkIndex> domainI,
282 Dune::index_constant<freeFlowMassIndex> domainJ,
283 const FVElementGeometry<poreNetworkIndex>& fvGeometry,
284 const typename FVElementGeometry<poreNetworkIndex>::SubControlVolume& scv,
285 const ElementVolumeVariables<poreNetworkIndex>& elemVolVars) const
286 {
287 const auto& couplingContext = this->subApply(domainI, domainJ, [&](const auto& cm, auto&& ii, auto&& jj) -> const auto& {
288 return cm.couplingContext(ii, fvGeometry, scv);
289 });
290
291 const auto& freeFlowMassGridGeometry = this->subApply(domainI, domainJ, [&](const auto& cm, auto&& ii, auto&& jj) -> const auto& {
292 return cm.problem(jj).gridGeometry();
293 });
294
295 for (auto& c : couplingContext)
296 {
297 const auto& freeFlowElement = freeFlowMassGridGeometry.element(c.scv.elementIndex());
298 c.velocity = this->subCouplingManager(freeFlowMomentumIndex, freeFlowMassIndex).faceVelocity(freeFlowElement, c.scvf);
299 }
300
301 return CouplingConditions::energyCouplingCondition(domainI, domainJ, fvGeometry, scv, elemVolVars, couplingContext);
302 }
303
306 */
307 auto energyCouplingCondition(Dune::index_constant<freeFlowMassIndex> domainI,
308 Dune::index_constant<poreNetworkIndex> domainJ,
309 const FVElementGeometry<freeFlowMassIndex>& fvGeometry,
310 const typename FVElementGeometry<freeFlowMassIndex>::SubControlVolumeFace& scvf,
311 const ElementVolumeVariables<freeFlowMassIndex>& elemVolVars) const
312 {
313 const auto& couplingContext = this->subApply(domainI, domainJ, [&](const auto& cm, auto&& ii, auto&& jj) -> const auto& {
314 return cm.couplingContext(ii, fvGeometry, scvf);
315 });
316
317 couplingContext.velocity = this->subCouplingManager(freeFlowMomentumIndex, freeFlowMassIndex).faceVelocity(fvGeometry.element(), scvf);
318 return CouplingConditions::energyCouplingCondition(domainI, domainJ, fvGeometry, scvf, elemVolVars, couplingContext);
319 }
320
324 NumEqVector<freeFlowMomentumIndex> momentumCouplingCondition(Dune::index_constant<freeFlowMomentumIndex> domainI,
325 Dune::index_constant<poreNetworkIndex> domainJ,
326 const FVElementGeometry<freeFlowMomentumIndex>& fvGeometry,
327 const typename FVElementGeometry<freeFlowMomentumIndex>::SubControlVolumeFace& scvf,
328 const ElementVolumeVariables<freeFlowMomentumIndex>& elemVolVars) const
329 {
330 if (scvf.isLateral())
331 return NumEqVector<freeFlowMomentumIndex>(0.0);
332
333 const auto& context = this->subCouplingManager(freeFlowMomentumIndex, poreNetworkIndex).couplingContext(
334 fvGeometry, scvf
335 );
336
337 return CouplingConditions::momentumCouplingCondition(fvGeometry, scvf, elemVolVars, context);
338 }
340 Scalar coupledPoreInscribedRadius(const FVElementGeometry<freeFlowMomentumIndex>& fvGeometry,
341 const typename FVElementGeometry<freeFlowMomentumIndex>::SubControlVolumeFace& scvf) const
342 {
343 const auto& context = this->subCouplingManager(freeFlowMomentumIndex, poreNetworkIndex).couplingContext(
344 fvGeometry, scvf
345 );
346
347 const auto& pnmScv = [&]
348 {
349 for (const auto& scv : scvs(context.fvGeometry))
350 if (scv.dofIndex() == context.poreNetworkDofIdx)
351 return scv;
352
353 DUNE_THROW(Dune::InvalidStateException, "No scv found");
354 }();
355
356 return context.elemVolVars[pnmScv].poreInscribedRadius();
357 }
359 auto interfaceThroatVelocity(const FVElementGeometry<freeFlowMomentumIndex>& fvGeometry,
360 const typename FVElementGeometry<freeFlowMomentumIndex>::SubControlVolumeFace& scvf) const
361 {
362 const auto& context = this->subCouplingManager(freeFlowMomentumIndex, poreNetworkIndex).couplingContext(
363 fvGeometry, scvf
364 );
365
366 return CouplingConditions::interfaceThroatVelocity(fvGeometry, scvf, context);
367 }
368
369 // //////////////////////// Conditions for FreeFlowMomentum - FreeFlowMass coupling //////////
370 // ///////////////////////////////////////////////////////////////////////////////////////////
371
374 */
375 Scalar pressure(const Element<freeFlowMomentumIndex>& element,
376 const FVElementGeometry<freeFlowMomentumIndex>& fvGeometry,
377 const SubControlVolumeFace<freeFlowMomentumIndex>& scvf) const
378 {
380 element, fvGeometry, scvf
381 );
382 }
383
389 */
390 Scalar cellPressure(const Element<freeFlowMomentumIndex>& element,
391 const SubControlVolumeFace<freeFlowMomentumIndex>& scvf) const
392 {
394 element, scvf
395 );
396 }
397
400 */
401 Scalar density(const Element<freeFlowMomentumIndex>& element,
402 const FVElementGeometry<freeFlowMomentumIndex>& fvGeometry,
403 const SubControlVolumeFace<freeFlowMomentumIndex>& scvf,
404 const bool considerPreviousTimeStep = false) const
405 {
407 element, fvGeometry, scvf, considerPreviousTimeStep
408 );
409 }
411 auto insideAndOutsideDensity(const Element<freeFlowMomentumIndex>& element,
412 const FVElementGeometry<freeFlowMomentumIndex>& fvGeometry,
413 const SubControlVolumeFace<freeFlowMomentumIndex>& scvf,
414 const bool considerPreviousTimeStep = false) const
415 {
416 return this->subCouplingManager(freeFlowMomentumIndex, freeFlowMassIndex).insideAndOutsideDensity(
417 element, fvGeometry, scvf, considerPreviousTimeStep
418 );
419 }
420
423 */
424 Scalar density(const Element<freeFlowMomentumIndex>& element,
425 const SubControlVolume<freeFlowMomentumIndex>& scv,
426 const bool considerPreviousTimeStep = false) const
427 {
429 element, scv, considerPreviousTimeStep
430 );
431 }
432
435 */
436 Scalar effectiveViscosity(const Element<freeFlowMomentumIndex>& element,
437 const FVElementGeometry<freeFlowMomentumIndex>& fvGeometry,
438 const SubControlVolumeFace<freeFlowMomentumIndex>& scvf) const
439 {
440 return this->subCouplingManager(freeFlowMomentumIndex, freeFlowMassIndex).effectiveViscosity(
441 element, fvGeometry, scvf
442 );
443 }
444
447 */
448 auto faceVelocity(const Element<freeFlowMassIndex>& element,
449 const SubControlVolumeFace<freeFlowMassIndex>& scvf) const
450 {
452 element, scvf
453 );
454 }
455
456 template<std::size_t i>
457 const Problem<i>& problem(Dune::index_constant<i> domainI) const
458 {
459 return this->subApply(domainI, [&](const auto& cm, auto&& ii) -> const auto& {
460 return cm.problem(ii);
461 });
462 }
463
464 template<std::size_t i, std::size_t j>
465 bool isCoupled(Dune::index_constant<i> domainI,
466 Dune::index_constant<j> domainJ,
467 const SubControlVolumeFace<i>& scvf) const
468 {
469 return this->subApply(domainI, domainJ, [&](const auto& cm, auto&& ii, auto&& jj){
470 return cm.isCoupled(ii, scvf);
471 });
472 }
473
480 template<std::size_t i, std::size_t j>
481 bool isCoupled(Dune::index_constant<i> domainI,
482 Dune::index_constant<j> domainJ,
483 const SubControlVolume<i>& scv) const
484 {
485 return this->subApply(domainI, domainJ, [&](const auto& cm, auto&& ii, auto&& jj){
486 return cm.isCoupled(ii, scv);
487 });
488 }
489
500 template<std::size_t j>
501 const auto& couplingStencil(Dune::index_constant<freeFlowMomentumIndex> domainI,
502 const Element<freeFlowMomentumIndex>& elementI,
503 const SubControlVolume<freeFlowMomentumIndex>& scvI,
504 Dune::index_constant<j> domainJ) const
505 {
506 static_assert(freeFlowMomentumIndex != j);
507 return this->subApply(domainI, domainJ, [&](const auto& cm, auto&& ii, auto&& jj) -> const auto& {
508 return cm.couplingStencil(ii, elementI, scvI, jj);
509 });
510 }
511
512private:
513 /*
514 * \brief Initializes sub-coupling managers for stationary and transient problems
515 */
516 template<class GridVarsTuple>
517 void init_(std::shared_ptr<Problem<freeFlowMomentumIndex>> freeFlowMomentumProblem,
518 std::shared_ptr<Problem<freeFlowMassIndex>> freeFlowMassProblem,
519 std::shared_ptr<Problem<poreNetworkIndex>> poreNetworkProblem,
520 GridVarsTuple&& gridVarsTuple,
521 const SolutionVector& curSol)
522 {
523 this->updateSolution(curSol); // generic coupling manager stores tuple of shared_ptr
524
525 auto couplingMapper = std::make_shared<CouplingMapper>();
526 couplingMapper->update(freeFlowMomentumProblem->gridGeometry(),
527 freeFlowMassProblem->gridGeometry(),
528 poreNetworkProblem->gridGeometry()
529 );
530
531 // initialize the binary sub coupling managers for stationary and transient problems
532 using FFMassPNMSol = typename SubCouplingManager<freeFlowMassIndex, poreNetworkIndex>::SolutionVectorStorage;
534 freeFlowMassProblem, poreNetworkProblem, couplingMapper,
535 FFMassPNMSol{ std::get<freeFlowMassIndex>(this->curSol()), std::get<poreNetworkIndex>(this->curSol()) }
536 );
537
538 using FFMomPNMSol = typename SubCouplingManager<freeFlowMomentumIndex, poreNetworkIndex>::SolutionVectorStorage;
540 freeFlowMomentumProblem, poreNetworkProblem,
541 std::make_tuple(std::get<freeFlowMomentumIndex>(gridVarsTuple), std::get<poreNetworkIndex>(gridVarsTuple)),
542 couplingMapper, FFMomPNMSol{ std::get<freeFlowMomentumIndex>(this->curSol()), std::get<poreNetworkIndex>(this->curSol()) }
543 );
544 }
545
546};
547
548} // end namespace Dumux
549
550#endif
Coupling mapper for staggered free-flow and pore-network models.
Coupling manager for free-flow mass and pore-network models.
Definition multidomain/boundary/freeflowporenetwork/ffmassporenetwork/couplingmanager.hh:35
Coupling manager for free-flow momentum and pore-network models.
Definition multidomain/boundary/freeflowporenetwork/ffmomentumporenetwork/couplingmanager.hh:35
Coupling manager for coupling freeflow and pore-network models.
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:147
auto insideAndOutsideDensity(const Element< freeFlowMomentumIndex > &element, const FVElementGeometry< freeFlowMomentumIndex > &fvGeometry, const SubControlVolumeFace< freeFlowMomentumIndex > &scvf, const bool considerPreviousTimeStep=false) const
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:410
bool isCoupled(Dune::index_constant< i > domainI, Dune::index_constant< j > domainJ, const SubControlVolumeFace< i > &scvf) const
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:464
auto energyCouplingCondition(Dune::index_constant< poreNetworkIndex > domainI, Dune::index_constant< freeFlowMassIndex > domainJ, const FVElementGeometry< poreNetworkIndex > &fvGeometry, const typename FVElementGeometry< poreNetworkIndex >::SubControlVolume &scv, const ElementVolumeVariables< poreNetworkIndex > &elemVolVars) const
Returns the energy flux across the coupling boundary.
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:280
void init(std::shared_ptr< Problem< freeFlowMomentumIndex > > freeFlowMomentumProblem, std::shared_ptr< Problem< freeFlowMassIndex > > freeFlowMassProblem, std::shared_ptr< Problem< poreNetworkIndex > > poreNetworkProblem, GridVarsTuple &&gridVarsTuple, const SolutionVector &curSol)
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:195
static constexpr auto freeFlowMomentumIndex
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:187
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/freeflowporenetwork/couplingmanager.hh:400
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/freeflowporenetwork/couplingmanager.hh:435
auto massCouplingCondition(Dune::index_constant< poreNetworkIndex > domainI, Dune::index_constant< freeFlowMassIndex > domainJ, const FVElementGeometry< poreNetworkIndex > &fvGeometry, const typename FVElementGeometry< poreNetworkIndex >::SubControlVolume &scv, const ElementVolumeVariables< poreNetworkIndex > &elemVolVars) const
Returns the mass flux across the coupling boundary.
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.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 multidomain/boundary/freeflowporenetwork/couplingmanager.hh:500
static constexpr auto freeFlowMassIndex
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:188
typename ParentType::template SubCouplingManager< i, j > SubCouplingManager
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:185
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/freeflowporenetwork/couplingmanager.hh:374
const Problem< i > & problem(Dune::index_constant< i > domainI) const
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:456
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/freeflowporenetwork/couplingmanager.hh:389
NumEqVector< freeFlowMomentumIndex > momentumCouplingCondition(Dune::index_constant< freeFlowMomentumIndex > domainI, Dune::index_constant< poreNetworkIndex > domainJ, const FVElementGeometry< freeFlowMomentumIndex > &fvGeometry, const typename FVElementGeometry< freeFlowMomentumIndex >::SubControlVolumeFace &scvf, const ElementVolumeVariables< freeFlowMomentumIndex > &elemVolVars) const
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:323
Scalar coupledPoreInscribedRadius(const FVElementGeometry< freeFlowMomentumIndex > &fvGeometry, const typename FVElementGeometry< freeFlowMomentumIndex >::SubControlVolumeFace &scvf) const
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:339
auto faceVelocity(const Element< freeFlowMassIndex > &element, const SubControlVolumeFace< freeFlowMassIndex > &scvf) const
Returns the velocity at a given sub control volume face.
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:447
auto interfaceThroatVelocity(const FVElementGeometry< freeFlowMomentumIndex > &fvGeometry, const typename FVElementGeometry< freeFlowMomentumIndex >::SubControlVolumeFace &scvf) const
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:358
static constexpr auto poreNetworkIndex
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:189
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
Coupling mapper for staggered free-flow and pore-network models.
Definition boundary/freeflowporenetwork/couplingmapper.hh:42
Defines all properties used in Dumux.
Coupling conditions for the coupling of a pore-network model with a (Navier-)Stokes model (staggerd g...
FreeFlowPoreNetworkCouplingConditionsImplementation< MDTraits, CouplingManager, GetPropType< typename MDTraits::template SubDomain< 1 >::TypeTag, Properties::ModelTraits >::enableEnergyBalance(),(GetPropType< typename MDTraits::template SubDomain< 1 >::TypeTag, Properties::ModelTraits >::numFluidComponents() > 1) > FreeFlowPoreNetworkCouplingConditions
Coupling conditions for the coupling of a pore-network model with a (Navier-)Stokes model (staggerd g...
Definition freeflowporenetwork/couplingconditions.hh:40
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 manager for free-flow mass and pore-network models.
Coupling manager for free-flow momentum and pore-network models.
Freeflow coupling managers (Navier-Stokes mass-momentum coupling)
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:31
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
static constexpr auto freeFlowMassIndex
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:35
static constexpr auto freeFlowMomentumIndex
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:34
static constexpr auto freeFlowMomentumToPoreNetworkIndex
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:40
static constexpr auto noCouplingIdx
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:42
static constexpr auto poreNetworkIndex
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:36
static constexpr auto freeFlowMassToFreeFlowMomentumIndex
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:39
constexpr auto makeCouplingManagerMap()
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:44
static constexpr auto freeFlowMassToPoreNetworkIndex
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:41
Definition adapt.hh:17
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:108
Dumux::FreeFlowCouplingManager< FreeFlowTraits > FreeFlowCouplingManager
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:124
MultiDomainTraits< SubDomainTypeTag< freeFlowMomentumIndex >, SubDomainTypeTag< poreNetworkIndex > > FreeFlowMomentumPoreNetworkTraits
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:116
Dumux::FreeFlowMomentumPoreNetworkCouplingManager< FreeFlowMomentumPoreNetworkTraits > FreeFlowMomentumPoreNetworkCouplingManager
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:125
Dumux::FreeFlowMassPoreNetworkCouplingManager< FreeFlowMassPoreNetworkTraits > FreeFlowMassPoreNetworkCouplingManager
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:126
MultiDomainTraits< SubDomainTypeTag< freeFlowMomentumIndex >, SubDomainTypeTag< freeFlowMassIndex > > FreeFlowTraits
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:112
typename MDTraits::template SubDomain< id >::TypeTag SubDomainTypeTag
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:110
MultiDomainTraits< SubDomainTypeTag< freeFlowMassIndex >, SubDomainTypeTag< poreNetworkIndex > > FreeFlowMassPoreNetworkTraits
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:120
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:87
static constexpr auto globalToLocal(Dune::index_constant< i > domainI, Dune::index_constant< j > domainJ)
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:94
static constexpr auto managerMap()
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:88
static constexpr auto coupledDomains(Dune::index_constant< i > domainI)
Definition multidomain/boundary/freeflowporenetwork/couplingmanager.hh:100
Definition multidomain/traits.hh:134