14#ifndef DUMUX_DUAL_NETWORK_EXTENDEDSOURCESTENCIL_HH
15#define DUMUX_DUAL_NETWORK_EXTENDEDSOURCESTENCIL_HH
19#include <dune/common/indices.hh>
34template<
class CouplingManager>
37 using MDTraits =
typename CouplingManager::MultiDomainTraits;
38 using Scalar =
typename MDTraits::Scalar;
40 template<std::
size_t id>
using SubDomainTypeTag =
typename MDTraits::template SubDomain<id>::TypeTag;
42 template<std::
size_t id>
using GridView =
typename GridGeometry<id>::GridView;
43 template<std::
size_t id>
using Element =
typename GridView<id>::template Codim<0>::Entity;
45 static constexpr auto solidDomainIdx = CouplingManager::solidDomainIdx;
46 static constexpr auto voidDomainIdx = CouplingManager::voidDomainIdx;
48 template<std::
size_t id>
49 static constexpr bool isBox()
58 template<std::
size_t id,
class JacobianPattern>
62 for (
const auto& element : elements(couplingManager.gridView(domainI)))
64 const auto& dofs = extendedSourceStencil_(couplingManager, domainI, element);
65 if constexpr (isBox<domainI>())
67 for (
int i = 0; i < element.subEntities(GridView<domainI>::dimension); ++i)
68 for (
const auto globalJ : dofs)
69 pattern.add(couplingManager.
problem(domainI).gridGeometry().vertexMapper().subIndex(element, i, GridView<domainI>::dimension), globalJ);
73 const auto globalI = couplingManager.
problem(domainI).gridGeometry().elementMapper().index(element);
74 for (
const auto globalJ : dofs)
75 pattern.add(globalI, globalJ);
87 template<std::
size_t i,
class LocalAssemblerI,
class SolutionVector,
class JacobianMatrixDiagBlock,
class Gr
idVariables>
89 Dune::index_constant<i> domainI,
90 const LocalAssemblerI& localAssemblerI,
91 const SolutionVector& curSol,
92 JacobianMatrixDiagBlock& A,
93 GridVariables& gridVariables)
const
96 const auto& curSolI = curSol;
97 constexpr auto numEq = std::decay_t<
decltype(curSolI[0])>::size();
98 const auto& elementI = localAssemblerI.element();
101 if (extendedSourceStencil_(couplingManager, domainI, elementI).empty())
105 const auto origResidual = localAssemblerI.evalLocalSourceResidual(elementI);
108 for (
const auto dofIndex : extendedSourceStencil_(couplingManager, domainI, elementI))
111 auto partialDerivs = origResidual;
112 const auto origPriVars = curSolI[dofIndex];
115 for (
int pvIdx = 0; pvIdx < numEq; pvIdx++)
120 auto evalResiduals = [&](Scalar priVar)
123 auto priVars = origPriVars;
124 priVars[pvIdx] = priVar;
126 return localAssemblerI.evalLocalSourceResidual(elementI);
130 static const int numDiffMethod = getParam<int>(
"Assembly.NumericDifferenceMethod");
132 partialDerivs, origResidual, numDiffMethod);
135 for (
const auto& scvJ : scvs(localAssemblerI.fvGeometry()))
137 for (
int eqIdx = 0; eqIdx < numEq; eqIdx++)
144 A[scvJ.dofIndex()][dofIndex][eqIdx][pvIdx] += partialDerivs[scvJ.indexInElement()][eqIdx];
149 couplingManager.
updateCouplingContext(domainI, localAssemblerI, domainI, dofIndex, origPriVars, pvIdx);
155 void clear() { sourceStencils_.clear(); }
159 {
return sourceStencils_; }
163 template<std::
size_t id>
164 const auto& extendedSourceStencil_(
const CouplingManager& couplingManager, Dune::index_constant<id> domainId,
const Element<id>& element)
const
166 if constexpr (domainId == voidDomainIdx)
168 const auto voidElementIdx = couplingManager.
problem(voidDomainIdx).gridGeometry().elementMapper().index(element);
169 if (sourceStencils_.count(voidElementIdx))
170 return sourceStencils_.at(voidElementIdx);
173 return couplingManager.emptyStencil(domainId);
177 std::unordered_map<std::size_t, std::vector<std::size_t>> sourceStencils_;
The interface of the coupling manager for multi domain problems.
Definition: multidomain/couplingmanager.hh:37
const Problem< i > & problem(Dune::index_constant< i > domainIdx) const
Return a reference to the sub problem.
Definition: multidomain/couplingmanager.hh:298
static void partialDerivative(const Function &function, Scalar x0, FunctionEvalType &derivative, const FunctionEvalType &fx0, const int numericDifferenceMethod=1)
Computes the derivative of a function with respect to a function parameter.
Definition: numericdifferentiation.hh:50
A class managing an extended source stencil.
Definition: dualnetwork/extendedsourcestencil.hh:36
void evalAdditionalDomainDerivatives(CouplingManager &couplingManager, Dune::index_constant< i > domainI, const LocalAssemblerI &localAssemblerI, const SolutionVector &curSol, JacobianMatrixDiagBlock &A, GridVariables &gridVariables) const
evaluate additional derivatives of the element residual of a domain with respect to dofs in the same ...
Definition: dualnetwork/extendedsourcestencil.hh:88
void extendJacobianPattern(const CouplingManager &couplingManager, Dune::index_constant< id > domainI, JacobianPattern &pattern) const
extend the jacobian pattern of the diagonal block of domain i by those entries that are not already i...
Definition: dualnetwork/extendedsourcestencil.hh:59
auto & stencil()
return a reference to the stencil
Definition: dualnetwork/extendedsourcestencil.hh:158
void clear()
clear the internal data
Definition: dualnetwork/extendedsourcestencil.hh:155
Defines all properties used in Dumux.
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:172
typename GetProp< TypeTag, Property >::type GetPropType
get the type alias defined in the property
Definition: propertysystem.hh:296
The available discretization methods in Dumux.
constexpr Box box
Definition: method.hh:147
Definition: discretization/porenetwork/fvelementgeometry.hh:24
A class for numeric differentiation.
The infrastructure to retrieve run-time parameters from Dune::ParameterTrees.