"""This module contains functions for computing the stiffness operators."""
import scipy.sparse as sps
import pygeon as pg
# ---------------------------------- Aliases ---------------------------------- #
[docs]
def cell_stiff(
mdg: pg.MixedDimensionalGrid, discr: pg.Discretization | None = None, **kwargs
) -> sps.csc_array:
"""
Compute the stiffness matrix for the piecewise constants on a (MD-)grid.
Args:
mdg (pg.MixedDimensionalGrid): The mixed-dimensional grid.
discr (pp discretization object): The discretization object.
Returns:
sps.csc_array, num_cells x num_cells
"""
return stiff_matrix(mdg, 0, discr, **kwargs)
[docs]
def face_stiff(
mdg: pg.MixedDimensionalGrid, discr: pg.Discretization | None = None, **kwargs
) -> sps.csc_array:
"""
Compute the stiffness matrix for discretization defined on the faces of a (MD-)grid.
Args:
mdg (pg.MixedDimensionalGrid).
discr (pp.RT0 or pp.MVEM).
Returns:
sps.csc_array, num_faces x num_faces
"""
return stiff_matrix(mdg, 1, discr, **kwargs)
[docs]
def ridge_stiff(
mdg: pg.MixedDimensionalGrid,
discr: pg.Discretization | None = None,
**kwargs,
) -> sps.csc_array:
"""
Compute the stiffness matrix for discretization defined on the ridges of a
(MD-)grid.
Args:
mdg (pp.MixedDimensionalGrid).
discr (pp discretization object).
Returns:
sps.csc_array, num_ridges x num_ridges
"""
return stiff_matrix(mdg, 2, discr, **kwargs)
[docs]
def peak_stiff(
mdg: pg.MixedDimensionalGrid, discr: pg.Discretization | None = None, **kwargs
) -> sps.csc_array:
"""
Compute the stiffness matrix for discretization defined on the peaks of a (MD-)grid.
Args:
mdg (pp.MixedDimensionalGrid).
discr (pp discretization object).
Returns:
sps.csc_array, num_peaks x num_peaks
"""
return stiff_matrix(mdg, 3, discr, **kwargs)
# ---------------------------------- General ---------------------------------- #
[docs]
def stiff_matrix(
mdg: pg.MixedDimensionalGrid,
n_minus_k: int,
discr: pg.Discretization | None,
**kwargs,
) -> sps.csc_array:
"""
Compute the stiffness matrix on a mixed-dimensional grid.
Args:
mdg (pp.MixedDimensionalGrid).
n_minus_k (int): The difference between the dimension and the order of
the differential.
discr (pg discretization object).
data (dict): The data object associated to the grid.
local_matrix (function): Function that generates the local mass matrix on a
grid.
Returns:
sps.csc_array, num_dofs x num_dofs
"""
if n_minus_k == 0:
return sps.csc_array((mdg.num_subdomain_cells(), mdg.num_subdomain_cells()))
diff = pg.numerics.differentials.exterior_derivative(mdg, n_minus_k)
mass_plus_1 = pg.numerics.innerproducts.mass_matrix(
mdg, n_minus_k - 1, discr, **kwargs
)
return (diff.T @ mass_plus_1 @ diff).tocsc()