12#ifndef DUMUX_JACOBIAN_PATTERN_HH
13#define DUMUX_JACOBIAN_PATTERN_HH
16#include <dune/istl/matrixindexset.hh>
26template<
bool isImplicit,
class GridGeometry,
31 const auto numDofs = gridGeometry.numDofs();
32 Dune::MatrixIndexSet pattern;
33 pattern.resize(numDofs, numDofs);
38 for (
unsigned int globalI = 0; globalI < numDofs; ++globalI)
40 pattern.add(globalI, globalI);
41 for (
const auto& dataJ : gridGeometry.connectivityMap()[globalI])
42 pattern.add(dataJ.globalJ, globalI);
49 for (
unsigned int globalI = 0; globalI < numDofs; ++globalI)
50 pattern.add(globalI, globalI);
60template<
bool isImplicit,
class GridGeometry,
65 const auto numDofs = gridGeometry.numDofs();
66 Dune::MatrixIndexSet pattern(numDofs, numDofs);
68 const auto& connectivityMap = gridGeometry.connectivityMap();
70 auto fvGeometry =
localView(gridGeometry);
72 for (
const auto& element : elements(gridGeometry.gridView()))
74 if(gridGeometry.isCellCenter())
77 static constexpr auto cellCenterIdx = GridGeometry::cellCenterIdx();
78 const auto ccGlobalI = gridGeometry.elementMapper().index(element);
79 pattern.add(ccGlobalI, ccGlobalI);
80 for (
auto&& ccGlobalJ : connectivityMap(cellCenterIdx, cellCenterIdx, ccGlobalI))
81 pattern.add(ccGlobalI, ccGlobalJ);
85 static constexpr auto faceIdx = GridGeometry::faceIdx();
86 fvGeometry.bindElement(element);
89 for (
auto&& scvf : scvfs(fvGeometry))
91 const auto faceGlobalI = scvf.dofIndex();
92 pattern.add(faceGlobalI, faceGlobalI);
93 for (
auto&& faceGlobalJ : connectivityMap(faceIdx, faceIdx, scvf.index()))
94 pattern.add(faceGlobalI, faceGlobalJ);
106template<
class FEBasis>
109 const auto numDofs = feBasis.size();
111 Dune::MatrixIndexSet pattern;
112 pattern.resize(numDofs, numDofs);
116 for (
const auto& element : elements(feBasis.gridView()))
120 const auto& finiteElement =
localView.tree().finiteElement();
121 const auto numLocalDofs = finiteElement.localBasis().size();
122 for (std::size_t i = 0; i < numLocalDofs; i++)
125 for (std::size_t j = 0; j < numLocalDofs; j++)
128 pattern.add(dofIdxI, dofIdxJ);
142template<
bool isImplicit,
class GridGeometry,
151template<
bool isImplicit,
class GridGeometry,
156 const auto numDofs = gridGeometry.numDofs();
157 Dune::MatrixIndexSet pattern(numDofs, numDofs);
159 const auto& connectivityMap = gridGeometry.connectivityMap();
160 auto fvGeometry =
localView(gridGeometry);
163 for (
const auto& element : elements(gridGeometry.gridView()))
165 fvGeometry.bind(element);
166 for (
const auto& scv :
scvs(fvGeometry))
168 const auto globalI = scv.dofIndex();
169 pattern.add(globalI, globalI);
171 for (
const auto& scvIdxJ : connectivityMap[scv.index()])
173 const auto globalJ = fvGeometry.scv(scvIdxJ).dofIndex();
174 pattern.add(globalI, globalJ);
176 if (gridGeometry.isPeriodic())
178 if (gridGeometry.dofOnPeriodicBoundary(globalI) && globalI != globalJ)
180 const auto& periodicallyMappedDofs =
181 Dumux::Deprecated::rangeOfPeriodicallyMappedDofs(gridGeometry, globalI);
183 for (
const auto globalIP : periodicallyMappedDofs)
185 pattern.add(globalIP, globalI);
186 pattern.add(globalI, globalIP);
188 if (globalI > globalIP)
189 pattern.add(globalIP, globalJ);
204template<
bool isImplicit,
class GridGeometry,
205 typename std::enable_if_t<DiscretizationMethods::isCVFE<typename GridGeometry::DiscretizationMethod>,
int> = 0>
209 const auto numDofs = gridGeometry.numDofs();
210 Dune::MatrixIndexSet pattern(numDofs, numDofs);
213 if constexpr (isImplicit)
215 auto fvGeometry =
localView(gridGeometry);
216 for (
const auto& element : elements(gridGeometry.gridView()))
218 fvGeometry.bindElement(element);
219 for (
const auto& localDof :
localDofs(fvGeometry))
221 const auto globalI = localDof.dofIndex();
222 const auto globalIP = gridGeometry.isPeriodic() && gridGeometry.dofOnPeriodicBoundary(globalI)
223 ? std::ranges::min(Dumux::Deprecated::rangeOfPeriodicallyMappedDofs(gridGeometry,globalI))
225 for (
const auto& localDofJ :
localDofs(fvGeometry))
227 const auto globalJ = localDofJ.dofIndex();
228 pattern.add(globalI, globalJ);
230 if (globalI != globalJ && globalI != globalIP)
232 pattern.add(globalIP, globalI);
233 pattern.add(globalI, globalIP);
235 if (globalI > globalIP)
236 pattern.add(globalIP, globalJ);
246 for (
unsigned int globalI = 0; globalI < numDofs; ++globalI)
247 pattern.add(globalI, globalI);
Dune::MatrixIndexSet getJacobianPattern(const GridGeometry &gridGeometry)
Helper function to generate Jacobian pattern for cell-centered methods.
Definition jacobianpattern.hh:29
Dune::MatrixIndexSet getFEJacobianPattern(const FEBasis &feBasis)
Helper function to generate Jacobian pattern for finite element scheme.
Definition jacobianpattern.hh:107
GridCache::LocalView localView(const GridCache &gridCache)
Free function to get the local view of a grid cache object.
Definition localview.hh:26
The available discretization methods in Dumux.
constexpr CCMpfa ccmpfa
Definition method.hh:175
constexpr CCTpfa cctpfa
Definition method.hh:174
constexpr Staggered staggered
Definition method.hh:181
constexpr FEM fem
Definition method.hh:182
constexpr FCStaggered fcstaggered
Definition method.hh:183
std::ranges::range auto scvs(const FVElementGeometry &fvGeometry, const LocalDof &localDof)
Definition localdof.hh:82
auto localDofs(const FVElementGeometry &fvGeometry)
range over local dofs
Definition localdof.hh:50