Skip to content

liblaf.apple.sim.dirichlet ¤

Modules:

Classes:

  • Dirichlet

    Dirichlet(dofs: liblaf.apple.sim.dofs.dofs.DOFs | None = None, values: jaxtyping.Shaped[Array, 'dirichlet'] = None)

Dirichlet ¤

Bases: PyTree

Dirichlet(dofs: liblaf.apple.sim.dofs.dofs.DOFs | None = None, values: jaxtyping.Shaped[Array, 'dirichlet'] = None)

Parameters:

  • dofs (DOFs | None, default: None ) –
  • values (Shaped[Array, dirichlet], default: None ) –

Methods:

Attributes:

__dataclass_fields__ class-attribute ¤

__dataclass_fields__: dict[str, Field[Any]]

dofs class-attribute instance-attribute ¤

dofs: DOFs | None = field(default=None)

size property ¤

size: int

values class-attribute instance-attribute ¤

values: Shaped[Array, ' dirichlet'] = array(default=None)

apply ¤

apply(x: ArrayLike) -> Array
Source code in src/liblaf/apple/sim/dirichlet/dirichlet.py
59
60
61
62
def apply(self, x: ArrayLike, /) -> Array:
    if self.dofs is None:
        return jnp.asarray(x)
    return self.dofs.set(x, self.values)

from_mask classmethod ¤

from_mask(mask: ArrayLike, values: ArrayLike) -> Self
Source code in src/liblaf/apple/sim/dirichlet/dirichlet.py
15
16
17
18
19
20
21
22
23
24
25
26
@classmethod
def from_mask(cls, mask: ArrayLike, values: ArrayLike) -> Self:
    mask = jnp.asarray(mask)
    if not mask.any():
        return cls()
    values = jnp.asarray(values)
    values = jnp.broadcast_to(values, mask.shape)
    mask = mask.ravel()
    values = values.ravel()
    dofs: DOFs = DOFs.from_mask(mask)
    values = values[mask]
    return cls(dofs=dofs, values=values)

mask ¤

mask(x: ArrayLike) -> Bool[Array, ' DOF']
Source code in src/liblaf/apple/sim/dirichlet/dirichlet.py
64
65
66
67
def mask(self, x: ArrayLike, /) -> Bool[Array, " DOF"]:
    if self.dofs is None:
        return jnp.asarray(x)
    return self.dofs.set(x, True)  # noqa: FBT003

remap ¤

remap(
    global_index: Integer[ArrayLike, " N"]
    | Integer[Index, " N"],
) -> Self
Source code in src/liblaf/apple/sim/dirichlet/dirichlet.py
52
53
54
55
56
57
def remap(
    self, global_index: Integer[ArrayLike, " N"] | Integer[struct.Index, " N"]
) -> Self:
    if self.dofs is None:
        return self
    return self.replace(dofs=self.dofs.remap(global_index))

replace ¤

replace(**changes: Any) -> Self
Source code in src/liblaf/apple/struct/tree/_pytree.py
19
20
def replace(self, **changes: Any) -> Self:
    return dataclasses.replace(self, **changes)

tree_at ¤

tree_at(
    where: Callable[[Self], Node | Sequence[Node]],
    replace: Any | Sequence[Any] = MISSING,
    replace_fn: Callable[[Node], Any] = MISSING,
    is_leaf: Callable[[Any], bool] | None = None,
) -> Self
Source code in src/liblaf/apple/struct/tree/_pytree.py
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
def tree_at(
    self,
    where: Callable[[Self], Node | Sequence[Node]],
    replace: Any | Sequence[Any] | MISSING = MISSING,
    replace_fn: Callable[[Node], Any] | MISSING = MISSING,
    is_leaf: Callable[[Any], bool] | None = None,
) -> Self:
    kwargs: dict[str, Any] = {}
    if replace is not MISSING:
        kwargs["replace"] = replace
    if replace_fn is not MISSING:
        kwargs["replace_fn"] = replace_fn
    if is_leaf is not None:
        kwargs["is_leaf"] = is_leaf
    return eqx.tree_at(where, self, **kwargs)

union classmethod deprecated ¤

union(*dirichlet: Self) -> Self
Deprecated

Manually create Dirichlet conditions instead.

...

Note

Dirichlet conditions can only be merged if they are defined on the same DOFs. To avoid unexpected behavior, we do not implement this method.

Source code in src/liblaf/apple/sim/dirichlet/dirichlet.py
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
@classmethod
@deprecated("Manually create Dirichlet conditions instead.")
def union(cls, *dirichlet: Self) -> Self:
    """...

    Note:
        Dirichlet conditions can only be merged if they are defined on the same DOFs. To avoid unexpected behavior, we do not implement this method.
    """
    raise NotImplementedError
    dirichlet: list[Self] = [d for d in dirichlet if d.dofs is not None]
    if not dirichlet:
        return cls()
    dofs: DOFs = DOFs.union1d(*(d.dofs for d in dirichlet))
    values: Shaped[Array, " dirichlet"] = jnp.concat(
        [jnp.asarray(d.values).ravel() for d in dirichlet]
    )
    return cls(dofs=dofs, values=values)

zero ¤

zero(x: ArrayLike) -> Array
Source code in src/liblaf/apple/sim/dirichlet/dirichlet.py
69
70
71
72
def zero(self, x: ArrayLike, /) -> Array:
    if self.dofs is None:
        return jnp.asarray(x)
    return self.dofs.set(x, 0.0)