|
11 | 11 | import GravityEnergy |
12 | 12 | import BarrierEnergy |
13 | 13 | import FrictionEnergy |
| 14 | +import SpringEnergy |
14 | 15 |
|
15 | 16 | def step_forward(x, e, v, m, l2, k, n, o, contact_area, mu, is_DBC, h, tol): |
16 | 17 | 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): |
40 | 41 | return [x, v] |
41 | 42 |
|
42 | 43 | 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])]) |
44 | 50 |
|
45 | 51 | 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])]) |
47 | 58 |
|
48 | 59 | def IP_hess(x, e, x_tilde, m, l2, k, n, o, contact_area, v, mu_lambda, h): |
49 | 60 | IJV_In = InertiaEnergy.hess(x, x_tilde, m) |
50 | 61 | IJV_MS = MassSpringEnergy.hess(x, e, l2, k) |
51 | 62 | IJV_B = BarrierEnergy.hess(x, n, o, contact_area) |
52 | 63 | 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])]) |
53 | 65 | IJV_MS[2] *= h * h # implicit Euler |
54 | 66 | IJV_B[2] *= h * h # implicit Euler |
55 | 67 | IJV_F[2] *= h * h # implicit Euler |
56 | 68 | IJV_In_MS = np.append(IJV_In, IJV_MS, axis=1) |
57 | 69 | 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) |
59 | 72 | H = sparse.coo_matrix((IJV[2], (IJV[0], IJV[1])), shape=(len(x) * 2, len(x) * 2)).tocsr() |
60 | 73 | return H |
61 | 74 |
|
|
0 commit comments