Source code for irksome.bcs
from .backend import get_backend
import ufl
from irksome.tools import get_sub
[docs]
def BCStageData(bc, gcur, u0, stages, i, backend="firedrake"):
backend_cls = get_backend(backend)
if bc._original_arg == 0:
gcur = 0
V = backend_cls.get_function_space(u0)
Vbig = stages.function_space()
Vbigi = backend_cls.stage2spaces4bc(bc, V, Vbig, i)
return bc.reconstruct(V=Vbigi, g=gcur)
[docs]
def EmbeddedBCData(bc, butcher_tableau, t, dt, u0, stages, backend="firedrake"):
backend_cls = get_backend(backend)
Vbc = backend_cls.bc2space(bc, backend_cls.get_function_space(u0))
gorig = bc._original_arg
if gorig == 0:
g = gorig
else:
V = backend_cls.get_function_space(u0)
field = 0 if len(V) == 1 else bc.function_space_index()
comp = (bc.function_space().component,)
ws = stages.subfunctions[field::len(V)]
btilde = butcher_tableau.btilde
num_stages = butcher_tableau.num_stages
g = ufl.replace(ufl.as_ufl(gorig), {t: t + dt}) - gorig
g -= sum(get_sub(ws[j], comp) * (btilde[j] * dt) for j in range(num_stages))
return bc.reconstruct(V=Vbc, g=g)
[docs]
def BoundsConstrainedDirichletBC(V, g, sub_domain, bounds, solver_parameters=None, backend="firedrake"):
"""A DirichletBC with bounds-constrained data."""
backend_class = get_backend(backend)
return backend_class.create_bounds_constrained_bc(V, g, sub_domain, bounds, solver_parameters=solver_parameters)