Source code for firedrake.slate.static_condensation.sc_base

import abc

from firedrake.preconditioners import PCBase
from firedrake.petsc import PETSc


[docs] class SCBase(PCBase): """A general-purpose base class for static condensation interfaces. """
[docs] @abc.abstractmethod def forward_elimination(self, pc, x): """Perform the forward elimination of fields and provide the reduced right-hand side for the condensed system. :arg pc: a Preconditioner instance. :arg x: a PETSc vector containing the incoming right-hand side. """ raise NotImplementedError("Forward elimination not implemented")
[docs] @abc.abstractmethod def backward_substitution(self, pc, y): """Perform the backwards recovery of eliminated fields. :arg pc: a Preconditioner instance. :arg y: a PETSc vector for placing the resulting fields. """ raise NotImplementedError("Backward substitution not implemented")
[docs] @abc.abstractmethod def sc_solve(self, pc): """Solve the condensed linear system for the condensed field. :arg pc: a Preconditioner instance. """ raise NotImplementedError("Solve not implemented")
[docs] def apply(self, pc, x, y): """Applies the static condensation preconditioner. :arg pc: a Preconditioner instance. :arg x: A PETSc vector containing the incoming right-hand side. :arg y: A PETSc vector for the result. """ with PETSc.Log.Event("SCForwardElim"): self.forward_elimination(pc, x) with PETSc.Log.Event("SCSolve"): self.sc_solve(pc) with PETSc.Log.Event("SCBackSub"): self.backward_substitution(pc, y)
[docs] def applyTranspose(self, pc, x, y): """Apply the transpose of the preconditioner.""" raise NotImplementedError("Transpose application is not implemented.")