24#ifndef DUMUX_CCTPFA_FACETCOUPLING_MANAGER_HH
25#define DUMUX_CCTPFA_FACETCOUPLING_MANAGER_HH
51template<
class MDTraits,
class CouplingMapper, std::
size_t bulkDomainId, std::
size_t lowDimDomainId>
58 using BulkIdType =
typename MDTraits::template SubDomain<bulkDomainId>::Index;
59 using LowDimIdType =
typename MDTraits::template SubDomain<lowDimDomainId>::Index;
60 static constexpr auto bulkId = BulkIdType();
61 static constexpr auto lowDimId = LowDimIdType();
64 template<std::
size_t id>
using SubDomainTypeTag =
typename MDTraits::template SubDomain<id>::TypeTag;
73 template<std::
size_t id>
using FVElementGeometry =
typename GridGeometry<id>::LocalView;
74 template<std::
size_t id>
using SubControlVolume =
typename GridGeometry<id>::SubControlVolume;
75 template<std::
size_t id>
using SubControlVolumeFace =
typename GridGeometry<id>::SubControlVolumeFace;
76 template<std::
size_t id>
using GridView =
typename GridGeometry<id>::GridView;
77 template<std::
size_t id>
using Element =
typename GridView<id>::template Codim<0>::Entity;
81 template<std::
size_t id>
using GridVolumeVariables =
typename GridVariables<id>::GridVolumeVariables;
82 template<std::
size_t id>
using ElementVolumeVariables =
typename GridVolumeVariables<id>::LocalView;
83 template<std::
size_t id>
using VolumeVariables =
typename ElementVolumeVariables<id>::VolumeVariables;
84 template<std::
size_t id>
using GridFluxVariablesCache =
typename GridVariables<id>::GridFluxVariablesCache;
85 template<std::
size_t id>
using ElementFluxVariablesCache =
typename GridFluxVariablesCache<id>::LocalView;
89 "Grid flux variables caching currently not supported in the bulk domain of cc-facet coupling models");
91 "Grid volume variables caching currently not supported in the lower-dimensional domain of cc-facet coupling models");
93 "Grid volume variables caching currently not supported in the bulk domain of cc-facet coupling models");
96 static constexpr int bulkDim = GridView<bulkDomainId>::dimension;
97 static constexpr int lowDimDim = GridView<lowDimDomainId>::dimension;
98 static constexpr auto bulkGridId = CouplingMapper::template gridId<bulkDim>();
99 static constexpr auto lowDimGridId = CouplingMapper::template gridId<lowDimDim>();
109 struct BulkCouplingContext
112 GridIndexType< bulkId > elementIdx;
113 std::vector< FVElementGeometry<lowDimId> > lowDimFvGeometries;
114 std::vector< VolumeVariables<lowDimId> > lowDimVolVars;
118 lowDimFvGeometries.clear();
119 lowDimVolVars.clear();
135 struct LowDimCouplingContext
138 GridIndexType< lowDimId > elementIdx;
139 std::unique_ptr< FVElementGeometry<bulkId> > bulkFvGeometry;
140 std::unique_ptr< ElementVolumeVariables<bulkId> > bulkElemVolVars;
141 std::unique_ptr< ElementFluxVariablesCache<bulkId> > bulkElemFluxVarsCache;
142 std::unique_ptr< LocalResidual<bulkId> > bulkLocalResidual;
146 bulkFvGeometry.reset(
nullptr);
147 bulkElemVolVars.reset(
nullptr);
148 bulkElemFluxVarsCache.reset(
nullptr);
156 template<std::
size_t i, std::
size_t j = (i == bulkId) ? lowDimId : bulkId>
157 using CouplingStencilType =
typename CouplingMapper::template Stencil< CouplingMapper::template gridId<GridView<j>::dimension>() >;
170 void init(std::shared_ptr< Problem<bulkId> > bulkProblem,
171 std::shared_ptr< Problem<lowDimId> > lowDimProblem,
172 std::shared_ptr< CouplingMapper > couplingMapper,
175 couplingMapperPtr_ = couplingMapper;
185 bulkElemIsCoupled_.assign(bulkProblem->gridGeometry().gridView().size(0),
false);
186 bulkScvfIsCoupled_.assign(bulkProblem->gridGeometry().numScvf(),
false);
188 const auto& bulkMap = couplingMapperPtr_->couplingMap(bulkGridId, lowDimGridId);
189 for (
const auto& entry : bulkMap)
191 bulkElemIsCoupled_[entry.first] =
true;
192 for (
const auto& couplingEntry : entry.second.dofToCouplingScvfMap)
193 for (
const auto& scvfIdx : couplingEntry.second)
194 bulkScvfIsCoupled_[scvfIdx] =
true;
202 const Element<bulkId>& element,
203 LowDimIdType domainJ)
const
205 const auto eIdx = this->
problem(bulkId).gridGeometry().elementMapper().index(element);
207 if (bulkElemIsCoupled_[eIdx])
209 const auto& map = couplingMapperPtr_->couplingMap(bulkGridId, lowDimGridId);
210 auto it = map.find(eIdx);
211 assert(it != map.end());
212 return it->second.couplingStencil;
222 const Element<lowDimId>& element,
223 BulkIdType domainJ)
const
225 const auto eIdx = this->
problem(lowDimId).gridGeometry().elementMapper().index(element);
227 const auto& map = couplingMapperPtr_->couplingMap(lowDimGridId, bulkGridId);
228 auto it = map.find(eIdx);
229 if (it != map.end())
return it->second.couplingStencil;
237 const SubControlVolumeFace<bulkId>& scvf)
const
238 {
return bulkScvfIsCoupled_[scvf.index()]; }
245 const SubControlVolumeFace<bulkId>& scvf)
const
252 const SubControlVolumeFace<bulkId>& scvf)
const
254 assert(bulkContext_.isSet);
257 const auto& map = couplingMapperPtr_->couplingMap(bulkGridId, lowDimGridId);
258 const auto& s = map.find(bulkContext_.elementIdx)->second.couplingElementStencil;
259 const auto& idxInContext = std::distance( s.begin(), std::find(s.begin(), s.end(), lowDimElemIdx) );
261 assert(std::find(s.begin(), s.end(), lowDimElemIdx) != s.end());
262 return bulkContext_.lowDimVolVars[idxInContext];
269 const SubControlVolumeFace<bulkId>& scvf)
const
272 return this->
problem(lowDimId).gridGeometry().element(lowDimElemIdx);
279 const SubControlVolumeFace<bulkId>& scvf)
const
281 assert(bulkScvfIsCoupled_[scvf.index()]);
283 const auto& map = couplingMapperPtr_->couplingMap(bulkGridId, lowDimGridId);
284 const auto& couplingData = map.at(scvf.insideScvIdx());
287 auto it = std::find_if( couplingData.elementToScvfMap.begin(),
288 couplingData.elementToScvfMap.end(),
289 [&scvf] (
auto& dataPair)
291 const auto& scvfs = dataPair.second;
292 return std::find(scvfs.begin(), scvfs.end(), scvf.index()) != scvfs.end();
295 assert(it != couplingData.elementToScvfMap.end());
304 template<
class BulkLocalAssembler >
305 typename LocalResidual<bulkId>::ElementResidualVector
307 const BulkLocalAssembler& bulkLocalAssembler,
309 GridIndexType<lowDimId> dofIdxGlobalJ)
311 const auto& map = couplingMapperPtr_->couplingMap(bulkGridId, lowDimGridId);
313 assert(bulkContext_.isSet);
314 assert(bulkElemIsCoupled_[bulkContext_.elementIdx]);
315 assert(map.find(bulkContext_.elementIdx) != map.end());
316 assert(bulkContext_.elementIdx == this->problem(bulkId).gridGeometry().elementMapper().index(bulkLocalAssembler.element()));
318 typename LocalResidual<bulkId>::ElementResidualVector res(1);
321 bulkLocalAssembler.fvGeometry(),
322 bulkLocalAssembler.curElemVolVars(),
323 bulkLocalAssembler.elemFluxVarsCache(),
324 bulkLocalAssembler.localResidual(),
325 map.find(bulkContext_.elementIdx)->second.dofToCouplingScvfMap.at(dofIdxGlobalJ));
339 template<
class LowDimLocalAssembler >
340 typename LocalResidual<lowDimId>::ElementResidualVector
342 const LowDimLocalAssembler& lowDimLocalAssembler,
344 GridIndexType<bulkId> dofIdxGlobalJ)
352 template<
class LowDimLocalAssembler >
353 typename LocalResidual<lowDimId>::ElementResidualVector
357 assert(lowDimContext_.isSet);
358 assert(this->
problem(lowDimId).gridGeometry().elementMapper().index(lowDimLocalAssembler.element()) == lowDimContext_.elementIdx);
363 lowDimLocalAssembler.fvGeometry(),
364 lowDimLocalAssembler.curElemVolVars(),
365 *scvs(lowDimLocalAssembler.fvGeometry()).begin());
368 typename LocalResidual<lowDimId>::ElementResidualVector res(lowDimLocalAssembler.fvGeometry().numScv());
370 for (
const auto& scv : scvs(lowDimLocalAssembler.fvGeometry()))
371 res[scv.localDofIndex()] -= source;
380 const FVElementGeometry<lowDimId>& fvGeometry,
381 const ElementVolumeVariables<lowDimId>& elemVolVars,
382 const SubControlVolume<lowDimId>& scv)
385 assert(this->
problem(lowDimId).gridGeometry().elementMapper().index(element) == lowDimContext_.elementIdx);
387 NumEqVector<lowDimId> sources(0.0);
389 const auto& map = couplingMapperPtr_->couplingMap(lowDimGridId, bulkGridId);
390 auto it = map.find(lowDimContext_.elementIdx);
394 assert(lowDimContext_.isSet);
395 for (
const auto& embedment : it->second.embedments)
397 *lowDimContext_.bulkFvGeometry,
398 *lowDimContext_.bulkElemVolVars,
399 *lowDimContext_.bulkElemFluxVarsCache,
400 *lowDimContext_.bulkLocalResidual,
405 sources /= fvGeometry.numScv();
415 template<
class Assembler >
419 bulkContext_.reset();
422 const auto bulkElemIdx = this->
problem(bulkId).gridGeometry().elementMapper().index(element);
423 bulkContext_.elementIdx = bulkElemIdx;
426 if (bulkElemIsCoupled_[bulkElemIdx])
428 const auto& map = couplingMapperPtr_->couplingMap(bulkGridId, lowDimGridId);
430 auto it = map.find(bulkElemIdx); assert(it != map.end());
431 const auto& elementStencil = it->second.couplingElementStencil;
432 bulkContext_.lowDimFvGeometries.reserve(elementStencil.size());
433 bulkContext_.lowDimVolVars.reserve(elementStencil.size());
435 const auto& ldGridGeometry = this->
problem(lowDimId).gridGeometry();
437 for (
const auto lowDimElemIdx : elementStencil)
439 const auto& ldSol = Assembler::isImplicit() ? this->
curSol(lowDimId) : assembler.prevSol()[lowDimId];
440 const auto& ldProblem = this->
problem(lowDimId);
442 const auto elemJ = ldGridGeometry.element(lowDimElemIdx);
443 fvGeom.bindElement(elemJ);
445 VolumeVariables<lowDimId> volVars;
450 const auto elemGeom = elemJ.geometry();
458 fvGeom.scv(lowDimElemIdx) );
460 bulkContext_.isSet =
true;
461 bulkContext_.lowDimFvGeometries.emplace_back( std::move(fvGeom) );
462 bulkContext_.lowDimVolVars.emplace_back( std::move(volVars) );
476 template<
class Assembler >
480 bulkContext_.reset();
481 lowDimContext_.reset();
484 const auto lowDimElemIdx = this->
problem(lowDimId).gridGeometry().elementMapper().index(element);
485 lowDimContext_.elementIdx = lowDimElemIdx;
487 const auto& map = couplingMapperPtr_->couplingMap(lowDimGridId, bulkGridId);
488 auto it = map.find(lowDimElemIdx);
494 const auto& bulkGridGeom = this->
problem(bulkId).gridGeometry();
495 const auto bulkElem = bulkGridGeom.element(it->second.embedments[0].first);
499 const auto& bulkSol = Assembler::isImplicit() ? this->
curSol(bulkId) : assembler.prevSol()[bulkId];
502 auto bulkFvGeom =
localView(bulkGridGeom).bind(bulkElem);
503 auto bulkElemVolVars = Assembler::isImplicit() ?
localView(assembler.gridVariables(bulkId).curGridVolVars()).bind(bulkElem, bulkFvGeom, bulkSol)
504 :
localView(assembler.gridVariables(bulkId).prevGridVolVars()).bind(bulkElem, bulkFvGeom, bulkSol);
505 auto bulkElemFluxVarsCache =
localView(assembler.gridVariables(bulkId).gridFluxVarsCache()).bind(bulkElem, bulkFvGeom, bulkElemVolVars);
507 lowDimContext_.isSet =
true;
508 lowDimContext_.bulkFvGeometry = std::make_unique< FVElementGeometry<bulkId> >( std::move(bulkFvGeom) );
509 lowDimContext_.bulkElemVolVars = std::make_unique< ElementVolumeVariables<bulkId> >( std::move(bulkElemVolVars) );
510 lowDimContext_.bulkElemFluxVarsCache = std::make_unique< ElementFluxVariablesCache<bulkId> >( std::move(bulkElemFluxVarsCache) );
511 lowDimContext_.bulkLocalResidual = std::make_unique< LocalResidual<bulkId> >(assembler.localResidual(bulkId));
519 template<
class BulkLocalAssembler >
521 const BulkLocalAssembler& bulkLocalAssembler,
522 LowDimIdType domainJ,
523 GridIndexType<lowDimId> dofIdxGlobalJ,
524 const PrimaryVariables<lowDimId>& priVarsJ,
533 if (!BulkLocalAssembler::isImplicit())
537 if (bulkContext_.isSet)
539 const auto& map = couplingMapperPtr_->couplingMap(bulkGridId, lowDimGridId);
540 const auto& couplingElemStencil = map.find(bulkContext_.elementIdx)->second.couplingElementStencil;
541 const auto& ldSol = this->
curSol(lowDimId);
542 const auto& ldProblem = this->
problem(lowDimId);
543 const auto& ldGridGeometry = this->
problem(lowDimId).gridGeometry();
546 const auto couplingElements = [&] ()
550 std::vector< Element<lowDimId> > lowDimElems;
551 std::for_each( couplingElemStencil.begin(), couplingElemStencil.end(),
552 [&] (
auto lowDimElemIdx)
554 auto element = ldGridGeometry.element(lowDimElemIdx);
555 for (int i = 0; i < element.geometry().corners(); ++i)
557 const auto dofIdx = ldGridGeometry.vertexMapper().subIndex(element, i, lowDimDim);
558 if (dofIdxGlobalJ == dofIdx) { lowDimElems.emplace_back( std::move(element) ); break; }
565 return std::vector<Element<lowDimId>>( {ldGridGeometry.element(dofIdxGlobalJ)} );
569 for (
const auto& element : couplingElements)
572 const auto eIdxGlobal = ldGridGeometry.elementMapper().index(element);
573 auto it = std::find(couplingElemStencil.begin(), couplingElemStencil.end(), eIdxGlobal);
574 const auto idxInContext = std::distance(couplingElemStencil.begin(), it);
575 assert(it != couplingElemStencil.end());
577 auto& volVars = bulkContext_.lowDimVolVars[idxInContext];
578 const auto& fvGeom = bulkContext_.lowDimFvGeometries[idxInContext];
582 const auto elemGeom = element.geometry();
590 fvGeom.scv(eIdxGlobal) );
599 template<
class BulkLocalAssembler >
601 const BulkLocalAssembler& bulkLocalAssembler,
603 GridIndexType<bulkId> dofIdxGlobalJ,
604 const PrimaryVariables<bulkId>& priVarsJ,
616 template<
class LowDimLocalAssembler >
618 const LowDimLocalAssembler& lowDimLocalAssembler,
620 GridIndexType<bulkId> dofIdxGlobalJ,
621 const PrimaryVariables<bulkId>& priVarsJ,
630 if (!LowDimLocalAssembler::isImplicit())
634 if (lowDimContext_.isSet)
636 assert(lowDimContext_.elementIdx == this->problem(lowDimId).gridGeometry().elementMapper().index(lowDimLocalAssembler.element()));
639 const auto& bulkGridGeom = this->
problem(bulkId).gridGeometry();
640 const auto elementJ = bulkGridGeom.element(dofIdxGlobalJ);
643 const auto& scv = lowDimContext_.bulkFvGeometry->scv(dofIdxGlobalJ);
645 (*lowDimContext_.bulkElemVolVars)[dofIdxGlobalJ].update(elemSol, this->
problem(bulkId), elementJ, scv);
648 if (dofIdxGlobalJ == bulkContext_.elementIdx)
649 lowDimContext_.bulkElemFluxVarsCache->update( elementJ, *lowDimContext_.bulkFvGeometry, *lowDimContext_.bulkElemVolVars);
651 lowDimContext_.bulkElemFluxVarsCache->update( this->
problem(bulkId).gridGeometry().element(bulkContext_.elementIdx),
652 *lowDimContext_.bulkFvGeometry,
653 *lowDimContext_.bulkElemVolVars );
663 template<
class LowDimLocalAssembler >
665 const LowDimLocalAssembler& lowDimLocalAssembler,
666 LowDimIdType domainJ,
667 GridIndexType<lowDimId> dofIdxGlobalJ,
668 const PrimaryVariables<lowDimId>& priVarsJ,
677 if (!LowDimLocalAssembler::isImplicit())
681 if (lowDimContext_.isSet)
683 const auto& ldSol = this->
curSol(lowDimId);
684 const auto& ldProblem = this->
problem(lowDimId);
685 const auto& ldGridGeometry = this->
problem(lowDimId).gridGeometry();
687 assert(bulkContext_.isSet);
688 assert(lowDimContext_.elementIdx == ldGridGeometry.elementMapper().index(lowDimLocalAssembler.element()));
691 const auto& bulkMap = couplingMapperPtr_->couplingMap(bulkGridId, lowDimGridId);
692 const auto& couplingElementStencil = bulkMap.find(bulkContext_.elementIdx)->second.couplingElementStencil;
693 auto it = std::find(couplingElementStencil.begin(), couplingElementStencil.end(), lowDimContext_.elementIdx);
694 assert(it != couplingElementStencil.end());
695 const auto idxInContext = std::distance(couplingElementStencil.begin(), it);
697 auto& volVars = bulkContext_.lowDimVolVars[idxInContext];
698 const auto& fvGeom = bulkContext_.lowDimFvGeometries[idxInContext];
699 const auto& element = lowDimLocalAssembler.element();
703 const auto elemGeom = element.geometry();
711 fvGeom.scv(lowDimContext_.elementIdx) );
714 const auto contextElem = this->
problem(bulkId).gridGeometry().element(bulkContext_.elementIdx);
715 lowDimContext_.bulkElemFluxVarsCache->update(contextElem, *lowDimContext_.bulkFvGeometry, *lowDimContext_.bulkElemVolVars);
720 using ParentType::updateCoupledVariables;
726 template<
class BulkLocalAssembler,
class UpdatableFluxVarCache >
728 const BulkLocalAssembler& bulkLocalAssembler,
729 ElementVolumeVariables<bulkId>& elemVolVars,
730 UpdatableFluxVarCache& fluxVarsCache)
733 if (BulkLocalAssembler::isImplicit())
734 fluxVarsCache.update(bulkLocalAssembler.element(),
735 bulkLocalAssembler.fvGeometry(),
736 bulkLocalAssembler.curElemVolVars());
743 template<
class BulkLocalAssembler,
class UpdatableFluxVarCache >
745 const BulkLocalAssembler& bulkLocalAssembler,
746 GridVolumeVariables<bulkId>& gridVolVars,
747 UpdatableFluxVarCache& fluxVarsCache)
750 if (BulkLocalAssembler::isImplicit())
752 const auto elemVolVars =
localView(gridVolVars).bind(bulkLocalAssembler.element(), bulkLocalAssembler.fvGeometry(), this->curSol(bulkId));
753 fluxVarsCache.update(bulkLocalAssembler.element(), bulkLocalAssembler.fvGeometry(), elemVolVars);
758 template<std::
size_t id, std::enable_if_t<(
id == bulkId ||
id == lowDimId),
int> = 0>
759 const typename CouplingMapper::template Stencil<id>&
761 {
return std::get<(id == bulkId ? 0 : 1)>(emptyStencilTuple_); }
773 template<
class BulkScvfIndices>
775 const FVElementGeometry<bulkId>& fvGeometry,
776 const ElementVolumeVariables<bulkId>& elemVolVars,
777 const ElementFluxVariablesCache<bulkId>& elemFluxVarsCache,
778 const LocalResidual<bulkId>& localResidual,
779 const BulkScvfIndices& scvfIndices)
const
782 NumEqVector<bulkId> coupledFluxes(0.0);
783 for (
const auto& scvfIdx : scvfIndices)
784 coupledFluxes += localResidual.evalFlux(this->
problem(bulkId),
789 fvGeometry.scvf(scvfIdx));
790 return coupledFluxes;
794 std::shared_ptr<CouplingMapper> couplingMapperPtr_;
798 std::vector<bool> bulkElemIsCoupled_;
799 std::vector<bool> bulkScvfIsCoupled_;
802 using BulkStencil =
typename CouplingMapper::template Stencil<bulkId>;
803 using LowDimStencil =
typename CouplingMapper::template Stencil<lowDimId>;
804 std::tuple<BulkStencil, LowDimStencil> emptyStencilTuple_;
807 BulkCouplingContext bulkContext_;
808 LowDimCouplingContext lowDimContext_;
A helper to deduce a vector with the same size as numbers of equations.
Defines the index types used for grid and local indices.
The available discretization methods in Dumux.
Element solution classes and factory functions.
GridCache::LocalView localView(const GridCache &gridCache)
Free function to get the local view of a grid cache object.
Definition localview.hh:38
auto elementSolution(const Element &element, const SolutionVector &sol, const GridGeometry &gg) -> std::enable_if_t< GridGeometry::discMethod==DiscretizationMethods::box, BoxElementSolution< typename GridGeometry::LocalView, std::decay_t< decltype(std::declval< SolutionVector >()[0])> > >
Make an element solution for box schemes.
Definition box/elementsolution.hh:118
typename NumEqVectorTraits< PrimaryVariables >::type NumEqVector
A vector with the same size as numbers of equations This is the default implementation and has to be ...
Definition numeqvector.hh:46
void updateCouplingContext(Dune::index_constant< i > domainI, const LocalAssemblerI &localAssemblerI, Dune::index_constant< j > domainJ, std::size_t dofIdxGlobalJ, const PrimaryVariables< j > &priVarsJ, int pvIdxJ)
Definition multidomain/couplingmanager.hh:194
void makeInterpolatedVolVars(VolumeVariables &volVars, const Problem &problem, const SolutionVector &sol, const FVGeometry &fvGeometry, const typename FVGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const typename FVGeometry::GridGeometry::GridView::template Codim< 0 >::Entity::Geometry &elemGeom, const typename FVGeometry::GridGeometry::GridView::template Codim< 0 >::Entity::Geometry::GlobalCoordinate &pos)
Free function that allows the creation of a volume variables object interpolated to a given position ...
Definition multidomain/facet/couplingmanager.hh:52
constexpr auto getPropValue()
get the value data member of a property
Definition propertysystem.hh:154
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property
Definition propertysystem.hh:150
constexpr Box box
Definition method.hh:139
Struture to define the index types used for grid and local indices.
Definition indextraits.hh:38
A vector of primary variables.
Definition common/properties.hh:49
Property to specify the type of a problem which has to be solved.
Definition common/properties.hh:57
Definition common/properties.hh:74
Definition common/properties.hh:102
If disabled, the volume variables are not stored (reduces memory, but is slower).
Definition common/properties.hh:111
specifies if data on flux vars should be saved (faster, but more memory consuming)
Definition common/properties.hh:121
The grid variables object managing variable data on the grid (volvars/fluxvars cache).
Definition common/properties.hh:123
void setSubProblem(std::shared_ptr< SubProblem > problem, Dune::index_constant< i > domainIdx)
Definition multidomain/couplingmanager.hh:311
const Problem< i > & problem(Dune::index_constant< i > domainIdx) const
Definition multidomain/couplingmanager.hh:320
SubSolutionVector< i > & curSol(Dune::index_constant< i > domainIdx)
Definition multidomain/couplingmanager.hh:349
void updateSolution(const SolutionVector &curSol)
Definition multidomain/couplingmanager.hh:230
CouplingManager()
Definition multidomain/couplingmanager.hh:93
void bindCouplingContext(LowDimIdType, const Element< lowDimId > &element, const Assembler &assembler)
For the assembly of the element residual of a bulk domain element we need to prepare the local views ...
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:477
const CouplingStencilType< bulkId > & couplingStencil(BulkIdType domainI, const Element< bulkId > &element, LowDimIdType domainJ) const
The coupling stencil of a given bulk domain element.
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:201
typename CouplingMapper::template Stencil< CouplingMapper::template gridId< GridView< j >::dimension >() > CouplingStencilType
types used for coupling stencils
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:157
const CouplingStencilType< lowDimId > & couplingStencil(LowDimIdType domainI, const Element< lowDimId > &element, BulkIdType domainJ) const
The coupling stencil of the lower-dimensional domain with the bulk domain.
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:221
BulkCouplingContext & bulkCouplingContext()
Return references to the bulk coupling contexts.
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:769
bool isCoupled(const Element< bulkId > &element, const SubControlVolumeFace< bulkId > &scvf) const
returns true if a bulk scvf flux depends on data in the facet domain.
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:236
NumEqVector< bulkId > evalBulkFluxes(const Element< bulkId > &elementI, const FVElementGeometry< bulkId > &fvGeometry, const ElementVolumeVariables< bulkId > &elemVolVars, const ElementFluxVariablesCache< bulkId > &elemFluxVarsCache, const LocalResidual< bulkId > &localResidual, const BulkScvfIndices &scvfIndices) const
evaluates the bulk-facet exchange fluxes for a given facet element
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:774
void updateCoupledVariables(BulkIdType domainI, const BulkLocalAssembler &bulkLocalAssembler, ElementVolumeVariables< bulkId > &elemVolVars, UpdatableFluxVarCache &fluxVarsCache)
Update the transmissibilities in the bulk domain after the coupling context changed.
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:727
LocalResidual< bulkId >::ElementResidualVector evalCouplingResidual(BulkIdType, const BulkLocalAssembler &bulkLocalAssembler, LowDimIdType, GridIndexType< lowDimId > dofIdxGlobalJ)
Evaluates the coupling element residual of a bulk domain element with respect to a dof in the lower-d...
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:306
const VolumeVariables< lowDimId > & getLowDimVolVars(const Element< bulkId > &element, const SubControlVolumeFace< bulkId > &scvf) const
returns the vol vars of a lower-dimensional element coinciding with a bulk scvf.
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:251
LowDimCouplingContext & lowDimCouplingContext()
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:770
typename MDTraits::SolutionVector SolutionVector
the type of the solution vector
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:160
void init(std::shared_ptr< Problem< bulkId > > bulkProblem, std::shared_ptr< Problem< lowDimId > > lowDimProblem, std::shared_ptr< CouplingMapper > couplingMapper, const SolutionVector &curSol)
Initialize the coupling manager.
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:170
const Element< lowDimId > getLowDimElement(const Element< bulkId > &element, const SubControlVolumeFace< bulkId > &scvf) const
returns the lower-dimensional element coinciding with a bulk scvf.
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:268
LocalResidual< lowDimId >::ElementResidualVector evalCouplingResidual(LowDimIdType, const LowDimLocalAssembler &lowDimLocalAssembler, BulkIdType)
Evaluates the coupling element residual of a lower-dimensional domain element with respect to a dof i...
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:354
void updateCoupledVariables(BulkIdType domainI, const BulkLocalAssembler &bulkLocalAssembler, GridVolumeVariables< bulkId > &gridVolVars, UpdatableFluxVarCache &fluxVarsCache)
Update the transmissibilities in the bulk domain after the coupling context changed.
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:744
const LowDimCouplingContext & lowDimCouplingContext() const
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:766
void updateCouplingContext(BulkIdType domainI, const BulkLocalAssembler &bulkLocalAssembler, LowDimIdType domainJ, GridIndexType< lowDimId > dofIdxGlobalJ, const PrimaryVariables< lowDimId > &priVarsJ, unsigned int pvIdxJ)
After deflecting the solution of the lower-dimensional domain, we have to update the element volume v...
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:520
bool isOnInteriorBoundary(const Element< bulkId > &element, const SubControlVolumeFace< bulkId > &scvf) const
returns true if a bulk scvf coincides with a facet element.
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:244
void updateCouplingContext(LowDimIdType domainI, const LowDimLocalAssembler &lowDimLocalAssembler, LowDimIdType domainJ, GridIndexType< lowDimId > dofIdxGlobalJ, const PrimaryVariables< lowDimId > &priVarsJ, unsigned int pvIdxJ)
After deflecting the solution of the lower-dimensional domain has been deflected during the assembly ...
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:664
void updateCouplingContext(LowDimIdType domainI, const LowDimLocalAssembler &lowDimLocalAssembler, BulkIdType domainJ, GridIndexType< bulkId > dofIdxGlobalJ, const PrimaryVariables< bulkId > &priVarsJ, unsigned int pvIdxJ)
After deflecting the solution of the bulk domain, we have to update the element volume variables and ...
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:617
const GridIndexType< lowDimId > getLowDimElementIndex(const Element< bulkId > &element, const SubControlVolumeFace< bulkId > &scvf) const
returns the index of the lower-dimensional element coinciding with a bulk scvf.
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:278
const BulkCouplingContext & bulkCouplingContext() const
Return const references to the bulk coupling contexts.
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:765
const CouplingMapper::template Stencil< id > & getEmptyStencil(Dune::index_constant< id >) const
Empty stencil to be returned for elements that aren't coupled.
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:760
NumEqVector< lowDimId > evalSourcesFromBulk(const Element< lowDimId > &element, const FVElementGeometry< lowDimId > &fvGeometry, const ElementVolumeVariables< lowDimId > &elemVolVars, const SubControlVolume< lowDimId > &scv)
Computes the sources in a lower-dimensional element stemming from the bulk domain.
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:379
LocalResidual< lowDimId >::ElementResidualVector evalCouplingResidual(LowDimIdType, const LowDimLocalAssembler &lowDimLocalAssembler, BulkIdType, GridIndexType< bulkId > dofIdxGlobalJ)
Evaluates the coupling element residual of a lower-dimensional domain element with respect to a dof i...
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:341
void bindCouplingContext(BulkIdType, const Element< bulkId > &element, const Assembler &assembler)
For the assembly of the element residual of a bulk domain element we need to prepare all variables of...
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:416
void updateCouplingContext(BulkIdType domainI, const BulkLocalAssembler &bulkLocalAssembler, BulkIdType domainJ, GridIndexType< bulkId > dofIdxGlobalJ, const PrimaryVariables< bulkId > &priVarsJ, unsigned int pvIdxJ)
Update the coupling context for a derivative bulk -> bulk. Here, we simply have to update the solutio...
Definition multidomain/facet/cellcentered/tpfa/couplingmanager.hh:600
Implementation for the coupling manager between two domains of dimension d and (d-1) for models consi...
Definition multidomain/facet/couplingmanager.hh:95
The interface of the coupling manager for multi domain problems.
Implementation for the coupling manager between two domains of dimension d and (d-1) for models consi...
Declares all properties used in Dumux.