25#ifndef DUMUX_POROMECHANICS_COUPLING_MANAGER_HH
26#define DUMUX_POROMECHANICS_COUPLING_MANAGER_HH
51template<
class MDTraits,
52 std::size_t PMFlowId = 0,
53 std::size_t PoroMechId = PMFlowId+1 >
59 template<std::
size_t id>
using SubDomainTypeTag =
typename MDTraits::template SubDomain<id>::TypeTag;
66 template<std::
size_t id>
using PrimaryVariables =
typename GridVariables<id>::PrimaryVariables;
67 template<std::
size_t id>
using GridVolumeVariables =
typename GridVariables<id>::GridVolumeVariables;
68 template<std::
size_t id>
using ElementVolumeVariables =
typename GridVolumeVariables<id>::LocalView;
69 template<std::
size_t id>
using VolumeVariables =
typename GridVolumeVariables<id>::VolumeVariables;
70 template<std::
size_t id>
using GridGeometry =
typename GridVariables<id>::GridGeometry;
71 template<std::
size_t id>
using FVElementGeometry =
typename GridGeometry<id>::LocalView;
72 template<std::
size_t id>
using GridView =
typename GridGeometry<id>::GridView;
73 template<std::
size_t id>
using GridIndexType =
typename GridView<id>::IndexSet::IndexType;
74 template<std::
size_t id>
using Element =
typename GridView<id>::template Codim<0>::Entity;
75 template<std::
size_t id>
using GlobalPosition =
typename Element<id>::Geometry::GlobalCoordinate;
78 static_assert(std::is_same< GridView<PMFlowId>, GridView<PoroMechId> >::value,
79 "The grid types of the two sub-problems have to be equal!");
83 "Poro-mechanical problem must be discretized with the box scheme for this coupling manager!");
87 "Porous medium flow problem must be discretized with a cell-centered scheme for this coupling manager!");
91 "Poromechanics framework does not yet work for enabled grid volume variables caching");
94 template<std::
size_t id>
95 using CouplingIndexType =
typename std::conditional<
id == PMFlowId,
96 GridIndexType<PoroMechId>,
97 GridIndexType<PMFlowId> >::type;
104 struct PoroMechanicsCouplingContext
107 Element<PMFlowId> pmFlowElement;
108 std::unique_ptr< FVElementGeometry<PMFlowId> > pmFlowFvGeometry;
109 std::unique_ptr< ElementVolumeVariables<PMFlowId> > pmFlowElemVolVars;
115 static constexpr auto pmFlowId = Dune::index_constant<PMFlowId>();
116 static constexpr auto poroMechId = Dune::index_constant<PoroMechId>();
123 template<std::
size_t i, std::
size_t j = (i == PMFlowId) ? PoroMechId : PMFlowId>
125 std::vector< CouplingIndexType<i> >,
126 std::array< CouplingIndexType<i>, 1> >::type;
138 void init(std::shared_ptr< Problem<PMFlowId> > pmFlowProblem,
139 std::shared_ptr< Problem<PoroMechId> > poroMechanicalProblem,
149 initializeCouplingMap_();
156 const Element<PMFlowId>& element,
157 Dune::index_constant<PoroMechId> poroMechDomainId)
const
159 return pmFlowCouplingMap_[ this->
problem(
pmFlowId).gridGeometry().elementMapper().index(element) ];
166 const Element<PoroMechId>& element,
167 Dune::index_constant<PMFlowId> pmFlowDomainId)
const
169 const auto eIdx = this->
problem(
pmFlowId).gridGeometry().elementMapper().index(element);
180 template<
class Assembler >
182 const Element<PoroMechId>& element,
183 const Assembler& assembler)
186 poroMechCouplingContext_.pmFlowFvGeometry.reset(
nullptr);
187 poroMechCouplingContext_.pmFlowElemVolVars.reset(
nullptr);
192 auto elemVolVars =
localView( assembler.gridVariables(Dune::index_constant<PMFlowId>()).curGridVolVars() );
194 fvGeometry.bindElement(element);
195 elemVolVars.bindElement(element, fvGeometry, this->
curSol()[Dune::index_constant<PMFlowId>()]);
197 poroMechCouplingContext_.pmFlowElement = element;
198 poroMechCouplingContext_.pmFlowFvGeometry = std::make_unique< FVElementGeometry<PMFlowId> >(fvGeometry);
199 poroMechCouplingContext_.pmFlowElemVolVars = std::make_unique< ElementVolumeVariables<PMFlowId> >(elemVolVars);
207 template<
class PoroMechLocalAssembler >
209 const PoroMechLocalAssembler& poroMechLocalAssembler,
210 Dune::index_constant<PMFlowId> pmFlowDomainId,
211 GridIndexType<PMFlowId> dofIdxGlobalJ,
212 const PrimaryVariables<PMFlowId>& priVarsJ,
219 const auto& element = poroMechCouplingContext_.pmFlowElement;
220 const auto& fvGeometry = *poroMechCouplingContext_.pmFlowFvGeometry;
221 poroMechCouplingContext_.pmFlowElemVolVars->bindElement(element, fvGeometry, this->
curSol()[pmFlowDomainId]);
230 template<
class PoroMechLocalAssembler >
232 const PoroMechLocalAssembler& poroMechLocalAssembler,
233 Dune::index_constant<PoroMechId> poroMechDomainIdJ,
234 GridIndexType<PoroMechId> dofIdxGlobalJ,
235 const PrimaryVariables<PoroMechId>& priVarsJ,
242 (*poroMechCouplingContext_.pmFlowElemVolVars).bindElement(poroMechCouplingContext_.pmFlowElement,
243 *poroMechCouplingContext_.pmFlowFvGeometry,
244 this->curSol()[Dune::index_constant<PMFlowId>()]);
251 template< std::
size_t j,
class PMFlowLocalAssembler >
253 const PMFlowLocalAssembler& pmFlowLocalAssembler,
254 Dune::index_constant<j> domainIdJ,
255 GridIndexType<j> dofIdxGlobalJ,
256 const PrimaryVariables<j>& priVarsJ,
271 template<
class PMFlowLocalAssembler,
class UpdatableFluxVarCache >
273 const PMFlowLocalAssembler& pmFlowLocalAssembler,
274 ElementVolumeVariables<PMFlowId>& elemVolVars,
275 UpdatableFluxVarCache& elemFluxVarsCache)
278 elemVolVars.bind(pmFlowLocalAssembler.element(),
279 pmFlowLocalAssembler.fvGeometry(),
280 this->curSol()[pmFlowDomainId]);
283 elemFluxVarsCache.update(pmFlowLocalAssembler.element(),
284 pmFlowLocalAssembler.fvGeometry(),
293 template<
class PoroMechLocalAssembler,
class UpdatableFluxVarCache >
295 const PoroMechLocalAssembler& poroMechLocalAssembler,
296 ElementVolumeVariables<PoroMechId>& elemVolVars,
297 UpdatableFluxVarCache& elemFluxVarsCache)
299 elemVolVars.bind(poroMechLocalAssembler.element(),
300 poroMechLocalAssembler.fvGeometry(),
301 this->curSol()[poroMechDomainId]);
310 template<
class PMFlowLocalAssembler >
311 typename LocalResidual<PMFlowId>::ElementResidualVector
313 const PMFlowLocalAssembler& pmFlowLocalAssembler,
314 Dune::index_constant<PoroMechId> poroMechDomainId,
315 GridIndexType<PoroMechId> dofIdxGlobalJ)
317 auto res = pmFlowLocalAssembler.localResidual().evalFluxAndSource(pmFlowLocalAssembler.element(),
318 pmFlowLocalAssembler.fvGeometry(),
319 pmFlowLocalAssembler.curElemVolVars(),
320 pmFlowLocalAssembler.elemFluxVarsCache(),
321 pmFlowLocalAssembler.elemBcTypes());
324 if (!pmFlowLocalAssembler.localResidual().isStationary())
325 res += pmFlowLocalAssembler.localResidual().evalStorage(pmFlowLocalAssembler.element(),
326 pmFlowLocalAssembler.fvGeometry(),
327 pmFlowLocalAssembler.prevElemVolVars(),
328 pmFlowLocalAssembler.curElemVolVars());
339 template<
class PoroMechLocalAssembler >
340 typename LocalResidual<PoroMechId>::ElementResidualVector
342 const PoroMechLocalAssembler& poroMechLocalAssembler,
343 Dune::index_constant<PMFlowId> pmFlowDomainId,
344 GridIndexType<PMFlowId> dofIdxGlobalJ)
346 return poroMechLocalAssembler.localResidual().evalFluxAndSource(poroMechLocalAssembler.element(),
347 poroMechLocalAssembler.fvGeometry(),
348 poroMechLocalAssembler.curElemVolVars(),
349 poroMechLocalAssembler.elemFluxVarsCache(),
350 poroMechLocalAssembler.elemBcTypes());
354 [[deprecated(
"Obtain the volume variables directly calling getPMFlowVolVars(element). Will be removed after 3.1!")]]
356 {
return poroMechCouplingContext_; }
360 const VolumeVariables<PMFlowId>&
getPMFlowVolVars(
const Element<PoroMechId>& element)
const
363 const auto eIdx = this->
problem(
poroMechId).gridGeometry().elementMapper().index(element);
364 return (*poroMechCouplingContext_.pmFlowElemVolVars)[eIdx];
380 void initializeCouplingMap_()
388 if (pmFlowGridGeom.gridView().size(0) != poroMechGridGeom.gridView().size(0))
389 DUNE_THROW(Dune::InvalidStateException,
"The two sub-problems are assumed to operate on the same mesh!");
391 pmFlowCouplingMap_.resize(pmFlowGridGeom.gridView().size(0));
392 static constexpr int dim = GridView<PMFlowId>::dimension;
393 for (
const auto& element : elements(pmFlowGridGeom.gridView()))
395 const auto eIdx = pmFlowGridGeom.elementMapper().index(element);
398 for (
int i = 0; i < element.geometry().corners(); ++i)
399 pmFlowCouplingMap_[eIdx].push_back( poroMechGridGeom.vertexMapper().subIndex(element, i , dim) );
404 const auto& inverseConnectivity = pmFlowGridGeom.connectivityMap()[eIdx];
405 for (
const auto& dataJ : inverseConnectivity)
406 for (
int i = 0; i < element.geometry().corners(); ++i)
407 pmFlowCouplingMap_[dataJ.globalJ].push_back( poroMechGridGeom.vertexMapper().subIndex(element, i , dim) );
411 for (
auto& stencil : pmFlowCouplingMap_)
413 std::sort(stencil.begin(), stencil.end());
414 stencil.erase(std::unique(stencil.begin(), stencil.end()), stencil.end());
419 std::vector< CouplingStencilType<PMFlowId> > pmFlowCouplingMap_;
422 PoroMechanicsCouplingContext poroMechCouplingContext_;
Element solution classes and factory functions.
free functions for the evaluation of primary variable gradients inside elements.
GridCache::LocalView localView(const GridCache &gridCache)
Free function to get the local view of a grid cache object.
Definition: localview.hh:38
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)
updates all data and variables that are necessary to evaluate the residual of the element of domain i...
Definition: multidomain/couplingmanager.hh:152
make the local view function available whenever we use the grid geometry
Definition: adapt.hh:29
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property (equivalent to old macro GET_PROP_TYPE(....
Definition: propertysystem.hh:149
Property to specify the type of scalar values.
Definition: common/properties.hh:53
Property to specify the type of a problem which has to be solved.
Definition: common/properties.hh:69
Definition: common/properties.hh:91
If disabled, the volume variables are not stored (reduces memory, but is slower)
Definition: common/properties.hh:178
The grid variables object managing variable data on the grid (volvars/fluxvars cache)
Definition: common/properties.hh:190
Definition: geomechanics/poroelastic/couplingmanager.hh:55
void bindCouplingContext(Dune::index_constant< PoroMechId > poroMechDomainId, const Element< PoroMechId > &element, const Assembler &assembler)
For the assembly of the element residual of an element of the poro-mechanics domain,...
Definition: geomechanics/poroelastic/couplingmanager.hh:181
typename std::conditional< i==PMFlowId, std::vector< CouplingIndexType< i > >, std::array< CouplingIndexType< i >, 1 > >::type CouplingStencilType
The types used for coupling stencils. An element of the poro-mechanical domain always only couples to...
Definition: geomechanics/poroelastic/couplingmanager.hh:126
void updateCoupledVariables(Dune::index_constant< PoroMechId > poroMechDomainId, const PoroMechLocalAssembler &poroMechLocalAssembler, ElementVolumeVariables< PoroMechId > &elemVolVars, UpdatableFluxVarCache &elemFluxVarsCache)
Update the poro-mechanics volume variables after the coupling context has been updated....
Definition: geomechanics/poroelastic/couplingmanager.hh:294
void updateCoupledVariables(Dune::index_constant< PMFlowId > pmFlowDomainId, const PMFlowLocalAssembler &pmFlowLocalAssembler, ElementVolumeVariables< PMFlowId > &elemVolVars, UpdatableFluxVarCache &elemFluxVarsCache)
Update the porous medium flow domain volume variables and flux variables cache after the coupling con...
Definition: geomechanics/poroelastic/couplingmanager.hh:272
const VolumeVariables< PMFlowId > & getPMFlowVolVars(const Element< PoroMechId > &element) const
Return the porous medium flow variables an element/scv of the poromech domain couples to.
Definition: geomechanics/poroelastic/couplingmanager.hh:360
void updateCouplingContext(Dune::index_constant< PMFlowId > pmFlowDomainId, const PMFlowLocalAssembler &pmFlowLocalAssembler, Dune::index_constant< j > domainIdJ, GridIndexType< j > dofIdxGlobalJ, const PrimaryVariables< j > &priVarsJ, unsigned int pvIdxJ)
We need this overload to avoid ambiguity. However, for the porous medium flow domain weonly have to u...
Definition: geomechanics/poroelastic/couplingmanager.hh:252
static constexpr auto pmFlowId
Definition: geomechanics/poroelastic/couplingmanager.hh:115
void updateCouplingContext(Dune::index_constant< PoroMechId > poroMechDomainIdI, const PoroMechLocalAssembler &poroMechLocalAssembler, Dune::index_constant< PoroMechId > poroMechDomainIdJ, GridIndexType< PoroMechId > dofIdxGlobalJ, const PrimaryVariables< PoroMechId > &priVarsJ, unsigned int pvIdxJ)
After deflection of the solution in the poromechanics domain during element residual assembly in that...
Definition: geomechanics/poroelastic/couplingmanager.hh:231
void updateCouplingContext(Dune::index_constant< PoroMechId > poroMechDomainId, const PoroMechLocalAssembler &poroMechLocalAssembler, Dune::index_constant< PMFlowId > pmFlowDomainId, GridIndexType< PMFlowId > dofIdxGlobalJ, const PrimaryVariables< PMFlowId > &priVarsJ, unsigned int pvIdxJ)
After deflection of the solution in the porous medium flow domain during element residual assembly in...
Definition: geomechanics/poroelastic/couplingmanager.hh:208
LocalResidual< PMFlowId >::ElementResidualVector evalCouplingResidual(Dune::index_constant< PMFlowId > pmFlowDomainId, const PMFlowLocalAssembler &pmFlowLocalAssembler, Dune::index_constant< PoroMechId > poroMechDomainId, GridIndexType< PoroMechId > dofIdxGlobalJ)
Evaluates the coupling element residual of the porous medium flow domain with respect to the poro-mec...
Definition: geomechanics/poroelastic/couplingmanager.hh:312
const PoroMechanicsCouplingContext & poroMechanicsCouplingContext() const
Return the coupling context (used in mechanical sub-problem to compute effective pressure)
Definition: geomechanics/poroelastic/couplingmanager.hh:355
void init(std::shared_ptr< Problem< PMFlowId > > pmFlowProblem, std::shared_ptr< Problem< PoroMechId > > poroMechanicalProblem, const SolutionVector &curSol)
Initialize the coupling manager.
Definition: geomechanics/poroelastic/couplingmanager.hh:138
const SolutionVector & curSol() const
the solution vector of the coupled problem
Definition: geomechanics/poroelastic/couplingmanager.hh:371
const CouplingStencilType< PoroMechId > couplingStencil(Dune::index_constant< PoroMechId > poroMechDomainId, const Element< PoroMechId > &element, Dune::index_constant< PMFlowId > pmFlowDomainId) const
Return the coupling element stencil for a given poro-mechanical domain element.
Definition: geomechanics/poroelastic/couplingmanager.hh:165
typename MDTraits::SolutionVector SolutionVector
the type of the solution vector
Definition: geomechanics/poroelastic/couplingmanager.hh:129
LocalResidual< PoroMechId >::ElementResidualVector evalCouplingResidual(Dune::index_constant< PoroMechId > poroMechDomainId, const PoroMechLocalAssembler &poroMechLocalAssembler, Dune::index_constant< PMFlowId > pmFlowDomainId, GridIndexType< PMFlowId > dofIdxGlobalJ)
Evaluates the coupling element residual of the poromechanical domain with respect to the porous mediu...
Definition: geomechanics/poroelastic/couplingmanager.hh:341
static constexpr auto poroMechId
Definition: geomechanics/poroelastic/couplingmanager.hh:116
const CouplingStencilType< PMFlowId > & couplingStencil(Dune::index_constant< PMFlowId > pmFlowDomainId, const Element< PMFlowId > &element, Dune::index_constant< PoroMechId > poroMechDomainId) const
Return the coupling stencil for a given porous medium flow domain element.
Definition: geomechanics/poroelastic/couplingmanager.hh:155
Definition: multidomain/couplingmanager.hh:46
void updateCoupledVariables(Dune::index_constant< i > domainI, const LocalAssemblerI &localAssemblerI, UpdatableElementVolVars &elemVolVars, UpdatableFluxVarCache &elemFluxVarsCache)
update variables of domain i that depend on variables in domain j after the coupling context has been...
Definition: multidomain/couplingmanager.hh:177
void setSubProblem(std::shared_ptr< SubProblem > problem, Dune::index_constant< i > domainIdx)
set a pointer to one of the sub problems
Definition: multidomain/couplingmanager.hh:256
const Problem< i > & problem(Dune::index_constant< i > domainIdx) const
Return a reference to the sub problem.
Definition: multidomain/couplingmanager.hh:264
void bindCouplingContext(Dune::index_constant< i > domainI, const Element< i > &elementI, const Assembler &assembler)
prepares all data and variables that are necessary to evaluate the residual of the element of domain ...
Definition: multidomain/couplingmanager.hh:126
SolutionVector & curSol()
the solution vector of the coupled problem
Definition: multidomain/couplingmanager.hh:278
void updateSolution(const SolutionVector &curSol)
Updates the entire solution vector, e.g. before assembly or after grid adaption.
Definition: multidomain/couplingmanager.hh:186
Declares all properties used in Dumux.
The interface of the coupling manager for multi domain problems.