Skip to content

liblaf.apple.func.elastic.arap ¤

As-Rigid-As-Possible.

\[ \Psi = \frac{\mu}{2} \|F - R\|_F^2 = \frac{\mu}{2} (I_2 - 2 I_1 + 3) \]

Functions:

arap_energy_density ¤

arap_energy_density(F: mat33, mu: float) -> float
Source code in src/liblaf/apple/func/elastic/arap.py
16
17
18
19
20
21
@no_type_check
@wp.func
def arap_energy_density(F: mat33, mu: float) -> float:
    R, S = utils.polar_rv(F)
    Psi = 0.5 * mu * utils.frobenius_norm_square(F - R)
    return Psi

arap_energy_density_hess_diag ¤

arap_energy_density_hess_diag(
    F: mat33, mu: float, dh_dX: mat43
) -> mat43
Source code in src/liblaf/apple/func/elastic/arap.py
32
33
34
35
36
37
38
39
40
41
@no_type_check
@wp.func
def arap_energy_density_hess_diag(F: mat33, mu: float, dh_dX: mat43) -> mat43:
    U, sigma, V = utils.svd_rv(F)
    lambdas = strain.lambdas(sigma=sigma)  # vec3
    Q0, Q1, Q2 = strain.Qs(U=U, V=V)  # mat33, mat33, mat33
    h4_diag = strain.h4_diag(dh_dX=dh_dX, lambdas=lambdas, Q0=Q0, Q1=Q1, Q2=Q2)  # mat43
    h5_diag = strain.h5_diag(dh_dX=dh_dX)  # mat43
    h = -2.0 * h4_diag + h5_diag  # mat43
    return 0.5 * mu * h

arap_energy_density_hess_quad ¤

arap_energy_density_hess_quad(
    F: mat33, p: mat43, mu: float, dh_dX: mat43
) -> float
Source code in src/liblaf/apple/func/elastic/arap.py
44
45
46
47
48
49
50
51
52
53
@no_type_check
@wp.func
def arap_energy_density_hess_quad(F: mat33, p: mat43, mu: float, dh_dX: mat43) -> float:
    U, sigma, V = utils.svd_rv(F)
    lambdas = strain.lambdas(sigma=sigma)  # vec3
    Q0, Q1, Q2 = strain.Qs(U=U, V=V)  # mat33, mat33, mat33
    h4_quad = strain.h4_quad(p=p, dh_dX=dh_dX, lambdas=lambdas, Q0=Q0, Q1=Q1, Q2=Q2)
    h5_quad = strain.h5_quad(p=p, dh_dX=dh_dX)  # float
    h = -2.0 * h4_quad + h5_quad  # float
    return 0.5 * mu * h

arap_first_piola_kirchhoff_stress ¤

arap_first_piola_kirchhoff_stress(
    F: mat33, mu: float
) -> mat33
Source code in src/liblaf/apple/func/elastic/arap.py
24
25
26
27
28
29
@no_type_check
@wp.func
def arap_first_piola_kirchhoff_stress(F: mat33, mu: float) -> mat33:
    R, S = utils.polar_rv(F)
    PK1 = mu * (F - R)
    return PK1