Skip to content

Commit ae2d997

Browse files
committed
spring energy for ceil
1 parent 891987b commit ae2d997

2 files changed

Lines changed: 41 additions & 3 deletions

File tree

mov_dirichlet/SpringEnergy.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import numpy as np
2+
3+
k = 10
4+
5+
def val(x, m, DBC, DBC_target):
6+
sum = 0.0
7+
for i in range(0, len(DBC)):
8+
diff = x[DBC[i]] - DBC_target[i]
9+
sum += 0.5 * k * m[DBC[i]] * diff.dot(diff)
10+
return sum
11+
12+
def grad(x, m, DBC, DBC_target):
13+
g = np.array([[0.0, 0.0]] * len(x))
14+
for i in range(0, len(DBC)):
15+
g[DBC[i]] = k * m[DBC[i]] * (x[DBC[i]] - DBC_target[i])
16+
return g
17+
18+
def hess(x, m, DBC, DBC_target):
19+
IJV = [[0] * 0, [0] * 0, np.array([0.0] * 0)]
20+
for i in range(0, len(DBC)):
21+
for d in range(0, 2):
22+
IJV[0].append(DBC[i] * 2 + d)
23+
IJV[1].append(DBC[i] * 2 + d)
24+
IJV[2] = np.append(IJV[2], k * m[DBC[i]])
25+
return IJV

mov_dirichlet/time_integrator.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import GravityEnergy
1212
import BarrierEnergy
1313
import FrictionEnergy
14+
import SpringEnergy
1415

1516
def step_forward(x, e, v, m, l2, k, n, o, contact_area, mu, is_DBC, h, tol):
1617
x_tilde = x + v * h # implicit Euler predictive position
@@ -40,22 +41,34 @@ def step_forward(x, e, v, m, l2, k, n, o, contact_area, mu, is_DBC, h, tol):
4041
return [x, v]
4142

4243
def IP_val(x, e, x_tilde, m, l2, k, n, o, contact_area, v, mu_lambda, h):
43-
return InertiaEnergy.val(x, x_tilde, m) + h * h * (MassSpringEnergy.val(x, e, l2, k) + GravityEnergy.val(x, m) + BarrierEnergy.val(x, n, o, contact_area) + FrictionEnergy.val(v, mu_lambda, h, n)) # implicit Euler
44+
return InertiaEnergy.val(x, x_tilde, m) + h * h * ( # implicit Euler
45+
MassSpringEnergy.val(x, e, l2, k) +
46+
GravityEnergy.val(x, m) +
47+
BarrierEnergy.val(x, n, o, contact_area) +
48+
FrictionEnergy.val(v, mu_lambda, h, n)
49+
) + SpringEnergy.val(x, m, [len(x) - 1], [np.array([0.0, 0.6])])
4450

4551
def IP_grad(x, e, x_tilde, m, l2, k, n, o, contact_area, v, mu_lambda, h):
46-
return InertiaEnergy.grad(x, x_tilde, m) + h * h * (MassSpringEnergy.grad(x, e, l2, k) + GravityEnergy.grad(x, m) + BarrierEnergy.grad(x, n, o, contact_area) + FrictionEnergy.grad(v, mu_lambda, h, n)) # implicit Euler
52+
return InertiaEnergy.grad(x, x_tilde, m) + h * h * ( # implicit Euler
53+
MassSpringEnergy.grad(x, e, l2, k) +
54+
GravityEnergy.grad(x, m) +
55+
BarrierEnergy.grad(x, n, o, contact_area) +
56+
FrictionEnergy.grad(v, mu_lambda, h, n)
57+
) + SpringEnergy.grad(x, m, [len(x) - 1], [np.array([0.0, 0.6])])
4758

4859
def IP_hess(x, e, x_tilde, m, l2, k, n, o, contact_area, v, mu_lambda, h):
4960
IJV_In = InertiaEnergy.hess(x, x_tilde, m)
5061
IJV_MS = MassSpringEnergy.hess(x, e, l2, k)
5162
IJV_B = BarrierEnergy.hess(x, n, o, contact_area)
5263
IJV_F = FrictionEnergy.hess(v, mu_lambda, h, n)
64+
IJV_S = SpringEnergy.hess(x, m, [len(x) - 1], [np.array([0.0, 0.6])])
5365
IJV_MS[2] *= h * h # implicit Euler
5466
IJV_B[2] *= h * h # implicit Euler
5567
IJV_F[2] *= h * h # implicit Euler
5668
IJV_In_MS = np.append(IJV_In, IJV_MS, axis=1)
5769
IJV_In_MS_B = np.append(IJV_In_MS, IJV_B, axis=1)
58-
IJV = np.append(IJV_In_MS_B, IJV_F, axis=1)
70+
IJV_In_MS_B_F = np.append(IJV_In_MS_B, IJV_F, axis=1)
71+
IJV = np.append(IJV_In_MS_B_F, IJV_S, axis=1)
5972
H = sparse.coo_matrix((IJV[2], (IJV[0], IJV[1])), shape=(len(x) * 2, len(x) * 2)).tocsr()
6073
return H
6174

0 commit comments

Comments
 (0)