tiffank1802 commited on
Commit
90adada
·
1 Parent(s): d7c9fdc

Add robot_souple_helpers.py dependency

Browse files
Files changed (1) hide show
  1. robot_souple_helpers.py +191 -0
robot_souple_helpers.py ADDED
@@ -0,0 +1,191 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import matplotlib.pyplot as plt
3
+
4
+ def Heaviside(t):
5
+ return np.heaviside(t - 1, 1)
6
+
7
+ def difHeaviside(t):
8
+ return np.zeros_like(t)
9
+
10
+ def intHeaviside(t):
11
+ return np.where(t >= 1, t, 0)
12
+
13
+ def generateNoiseTemporal(time, tlength, q, vseed):
14
+ rng = np.random.RandomState(vseed)
15
+ nstep = len(time)
16
+ seed = rng.randn(nstep)
17
+ time = np.array(time)
18
+ dt = time[:, np.newaxis] - time[np.newaxis, :]
19
+ Corr = np.exp(-dt**2 / tlength**2)
20
+ fpert = Corr @ seed
21
+ famp = np.sum(fpert**2) / nstep
22
+ fpert = fpert * np.sqrt(q / famp)
23
+ return fpert
24
+
25
+ def neb_beam_matrices(nx, dx, E, Ix, rho, S, cy):
26
+ npt = nx + 1
27
+ ndof = 2 * npt
28
+ doflist = np.arange(0, ndof - 3, 2)
29
+ on1 = np.ones(nx)
30
+ Ki = np.concatenate((doflist, doflist, doflist, doflist,
31
+ doflist + 1, doflist + 1, doflist + 1, doflist + 1,
32
+ doflist + 2, doflist + 2, doflist + 2, doflist + 2,
33
+ doflist + 3, doflist + 3, doflist + 3, doflist + 3))
34
+ Kj = np.concatenate((doflist, doflist + 1, doflist + 2, doflist + 3,
35
+ doflist, doflist + 1, doflist + 2, doflist + 3,
36
+ doflist, doflist + 1, doflist + 2, doflist + 3,
37
+ doflist, doflist + 1, doflist + 2, doflist + 3))
38
+ Kv = E * Ix / (dx**3) * np.concatenate((12 * on1, 6 * dx * on1, -12 * on1, 6 * dx * on1,
39
+ 6 * dx * on1, 4 * dx**2 * on1, -6 * dx * on1, 2 * dx**2 * on1,
40
+ -12 * on1, -6 * dx * on1, 12 * on1, -6 * dx * on1,
41
+ 6 * dx * on1, 2 * dx**2 * on1, -6 * dx * on1, 4 * dx**2 * on1))
42
+ Kfull = np.zeros((ndof, ndof))
43
+ for ii in range(len(Ki)):
44
+ Kfull[int(Ki[ii]), int(Kj[ii])] += Kv[ii]
45
+ Mv1 = rho * S * dx / 420 * np.concatenate((156 * on1, 22 * dx * on1, 54 * on1, -13 * dx * on1,
46
+ 22 * dx * on1, 4 * dx**2 * on1, 13 * dx * on1, -3 * dx**2 * on1,
47
+ 54 * on1, 13 * dx * on1, 156 * on1, -22 * dx * on1,
48
+ -13 * dx * on1, -3 * dx**2 * on1, -22 * dx * on1, 4 * dx**2 * on1))
49
+ Mfull = np.zeros((ndof, ndof))
50
+ for ii in range(len(Ki)):
51
+ Mfull[int(Ki[ii]), int(Kj[ii])] += Mv1[ii]
52
+ Cv = cy * dx / 420 * np.concatenate((156 * on1, 22 * dx * on1, 54 * on1, -13 * dx * on1,
53
+ 22 * dx * on1, 4 * dx**2 * on1, 13 * dx * on1, -3 * dx**2 * on1,
54
+ 54 * on1, 13 * dx * on1, 156 * on1, -22 * dx * on1,
55
+ -13 * dx * on1, -3 * dx**2 * on1, -22 * dx * on1, 4 * dx**2 * on1))
56
+ Cfull = np.zeros((ndof, ndof))
57
+ for ii in range(len(Ki)):
58
+ Cfull[int(Ki[ii]), int(Kj[ii])] += Cv[ii]
59
+ return Kfull, Cfull, Mfull
60
+
61
+ def newmark1stepMRHS(M, C, K, f, u0, v0, a0, dt, beta, gamma):
62
+ nrhs = u0.shape[1] if u0.ndim == 2 else 1
63
+ fatK = K + 1 / (beta * dt**2) * M + gamma / (beta * dt) * C
64
+ if nrhs > 1:
65
+ if f.shape[1] == 1:
66
+ f = np.tile(f, (1, nrhs))
67
+ b = f + C @ (gamma / (beta * dt) * u0 + (gamma / beta - 1) * v0 + dt / 2 * (gamma / beta - 2) * a0) + \
68
+ M @ (1 / (beta * dt**2) * u0 + 1 / (beta * dt) * v0 + (1 / (2 * beta) - 1) * a0)
69
+ u = np.zeros_like(b)
70
+ for jj in range(nrhs):
71
+ u[:, jj] = np.linalg.solve(fatK, b[:, jj])
72
+ else:
73
+ b = f + C @ (gamma / (beta * dt) * u0 + (gamma / beta - 1) * v0 + dt / 2 * (gamma / beta - 2) * a0) + \
74
+ M @ (1 / (beta * dt**2) * u0 + 1 / (beta * dt) * v0 + (1 / (2 * beta) - 1) * a0)
75
+ u = np.linalg.solve(fatK, b)
76
+ a = 1 / (beta * dt**2) * (u - u0 - dt * v0 - dt**2 / 2 * (1 - 2 * beta) * a0)
77
+ v = v0 + dt * ((1 - gamma) * a0 + gamma * a)
78
+ return u, v, a
79
+
80
+ def Bconstruct(M, C, K, nA, dt, beta, gamma):
81
+ nx = M.shape[0]
82
+ B = np.zeros((3 * nx, nx))
83
+ for j in range(nx):
84
+ u0 = np.zeros(nx)
85
+ v0 = np.zeros(nx)
86
+ a0 = np.zeros(nx)
87
+ eta = np.zeros(nx)
88
+ eta[j] = 1
89
+ u, v, a = newmark1stepMRHS(M, C, K, eta, u0, v0, a0, dt, beta, gamma)
90
+ B[:, j] = np.concatenate((u, v, a))
91
+ return B
92
+
93
+ def Fconstruct(M, C, K, dt, beta, gamma):
94
+ nx = M.shape[0]
95
+ M1 = np.eye(nx)
96
+ M2 = np.zeros((nx, nx))
97
+ u0 = np.hstack((M1, M2, M2))
98
+ v0 = np.hstack((M2, M1, M2))
99
+ a0 = np.hstack((M2, M2, M1))
100
+ f = np.zeros(nx)
101
+ u, v, a = newmark1stepMRHS(M, C, K, f, u0, v0, a0, dt, beta, gamma)
102
+ F = np.vstack((u, v, a))
103
+ return F
104
+
105
+ def Newmark(M, C, K, f, u0, v0, a0, dt, beta, gamma, fatK1=None):
106
+ ndof, ntime = f.shape
107
+ u = np.zeros((ndof, ntime))
108
+ v = np.zeros((ndof, ntime))
109
+ a = np.zeros((ndof, ntime))
110
+ up = u0.copy()
111
+ vp = v0.copy()
112
+ ap = a0.copy()
113
+ fatK = K + 1 / (beta * dt**2) * M + gamma / (beta * dt) * C
114
+ invert = fatK1 is not None
115
+ if not invert:
116
+ if 2 * ntime > ndof:
117
+ fatK1 = np.linalg.inv(fatK)
118
+ invert = True
119
+ u[:, 0] = u0
120
+ v[:, 0] = v0
121
+ a[:, 0] = a0
122
+ for i in range(1, ntime):
123
+ b = f[:, i] + C @ (gamma / (beta * dt) * up + (gamma / beta - 1) * vp + dt / 2 * (gamma / beta - 2) * ap) + \
124
+ M @ (1 / (beta * dt**2) * up + 1 / (beta * dt) * vp + (1 / (2 * beta) - 1) * ap)
125
+ if invert:
126
+ u[:, i] = fatK1 @ b
127
+ else:
128
+ u[:, i] = np.linalg.solve(fatK, b)
129
+ a[:, i] = 1 / (beta * dt**2) * (u[:, i] - up - dt * vp - dt**2 / 2 * (1 - 2 * beta) * ap)
130
+ v[:, i] = vp + dt * ((1 - gamma) * ap + gamma * a[:, i])
131
+ up = u[:, i]
132
+ vp = v[:, i]
133
+ ap = a[:, i]
134
+ return u, v, a
135
+
136
+ def forthodir(m, c, k, co, u0, v0, niter, nopt, stagEps, delta, beta, gamma, mu, picture=False, indices=None, action=None):
137
+ ndof = len(u0)
138
+ if indices is None:
139
+ indices = np.arange(ndof)
140
+ if action is None:
141
+ action = np.arange(ndof)
142
+ nact = len(action)
143
+ fop = np.zeros((ndof, niter))
144
+ ress = np.zeros(nopt)
145
+ Delta = np.zeros(nopt)
146
+ dirs = np.zeros((nact * niter, nopt))
147
+ Ads = np.zeros((nact * niter, nopt))
148
+ diff = np.zeros((ndof, niter))
149
+ dirdir = np.zeros((ndof, niter))
150
+ ai0 = np.linalg.solve(m, - (c @ v0 + k @ u0))
151
+ ui, vi, ai = Newmark(m, c, k, np.zeros((ndof, niter)), u0, v0, ai0, delta, beta, gamma)
152
+ diff[indices, :] = co[indices, :] - ui[indices, :]
153
+ laa0 = np.linalg.solve(m, diff[:, -1])
154
+ lau, lav, laa = Newmark(m, c, k, diff[:, ::-1], np.zeros(ndof), np.zeros(ndof), laa0, delta, beta, gamma)
155
+ laulau = lau[action, ::-1]
156
+ rhs = laulau.flatten()
157
+ resv = rhs.copy()
158
+ res0 = np.linalg.norm(resv)
159
+ if res0 < stagEps:
160
+ print('zero seems to be the optimal solution')
161
+ return fop, np.array([])
162
+ n_converged = 0
163
+ for iter_ in range(nopt):
164
+ dirr = resv.copy()
165
+ dirdir[action, :] = dirr.reshape((nact, niter))
166
+ ai0 = np.linalg.solve(m, dirdir[:, 0])
167
+ ui, vi, ai = Newmark(m, c, k, dirdir, np.zeros(ndof), np.zeros(ndof), ai0, delta, beta, gamma)
168
+ diff[indices, :] = -ui[indices, :]
169
+ laa0 = np.linalg.solve(m, diff[:, -1])
170
+ lau, lav, laa = Newmark(m, c, k, diff[:, ::-1], np.zeros(ndof), np.zeros(ndof), laa0, delta, beta, gamma)
171
+ laulau = lau[action, ::-1]
172
+ Ad = mu * dirr - laulau.flatten()
173
+ for j in range(iter_):
174
+ phiij = Ads[:, j] @ Ad
175
+ betaij = phiij / Delta[j]
176
+ dirr -= betaij * dirs[:, j]
177
+ Ad -= betaij * Ads[:, j]
178
+ dirs[:, iter_] = dirr
179
+ Ads[:, iter_] = Ad
180
+ Delta[iter_] = Ad @ Ad
181
+ gammai = Ad @ resv
182
+ alphai = gammai / Delta[iter_]
183
+ dirdir[action, :] = dirr.reshape((nact, niter))
184
+ fop += alphai * dirdir
185
+ resv -= alphai * Ad
186
+ ress[iter_] = np.linalg.norm(resv)
187
+ n_converged = iter_ + 1
188
+ if ress[iter_] / res0 < stagEps:
189
+ break
190
+ ress = ress[:n_converged]
191
+ return fop, ress