download
raw
3.93 kB
import numpy as np
from scipy.sparse import csr_matrix
from scipy.sparse.linalg import spsolve
def neb_beam_matrices(nx, dx, E, Ix, rho, S, cy):
"""
Compute the FE matrices for Navier-Euler-Bernoulli beams
"""
npt = nx + 1
ndof = 2 * npt
doflist = np.arange(0, 2*nx, 2)
on1 = np.ones(nx)
Ki = np.concatenate([
doflist, doflist, doflist, doflist,
doflist+1, doflist+1, doflist+1, doflist+1,
doflist+2, doflist+2, doflist+2, doflist+2,
doflist+3, doflist+3, doflist+3, doflist+3
])
Kj = np.concatenate([
doflist, doflist+1, doflist+2, doflist+3,
doflist, doflist+1, doflist+2, doflist+3,
doflist, doflist+1, doflist+2, doflist+3,
doflist, doflist+1, doflist+2, doflist+3
])
Kv = E*Ix/(dx**3) * np.concatenate([
12*on1, 6*dx*on1, -12*on1, 6*dx*on1,
6*dx*on1, 4*dx**2*on1, -6*dx*on1, 2*dx**2*on1,
-12*on1, -6*dx*on1, 12*on1, -6*dx*on1,
6*dx*on1, 2*dx**2*on1, -6*dx*on1, 4*dx**2*on1
])
Kfull = csr_matrix((Kv, (Ki, Kj)), shape=(ndof, ndof))
Mv1 = rho*S*dx/420 * np.concatenate([
156*on1, 22*dx*on1, 54*on1, -13*dx*on1,
22*dx*on1, 4*dx**2*on1, 13*dx*on1, -3*dx**2*on1,
54*on1, 13*dx*on1, 156*on1, -22*dx*on1,
-13*dx*on1, -3*dx**2*on1, -22*dx*on1, 4*dx**2*on1
])
Mfull = csr_matrix((Mv1, (Ki, Kj)), shape=(ndof, ndof))
Cv = cy*dx/420 * np.concatenate([
156*on1, 22*dx*on1, 54*on1, -13*dx*on1,
22*dx*on1, 4*dx**2*on1, 13*dx*on1, -3*dx**2*on1,
54*on1, 13*dx*on1, 156*on1, -22*dx*on1,
-13*dx*on1, -3*dx**2*on1, -22*dx*on1, 4*dx**2*on1
])
Cfull = csr_matrix((Cv, (Ki, Kj)), shape=(ndof, ndof))
return Kfull, Cfull, Mfull
def newmark1step_mrhs(M, C, K, f, u0, v0, a0, dt, beta, gamma):
"""
Computes one step of the Newmark algorithm
"""
fatK = K + 1/(beta*dt**2)*M + gamma/(beta*dt)*C
b = f + C * (gamma/(beta*dt)*u0 + (gamma/beta - 1)*v0 + dt/2*(gamma/beta - 1)*a0) + M * (1/(beta*dt**2)*u0 + 1/(beta*dt)*v0 + (1/(2*beta) - 1)*a0)
u = spsolve(fatK, b)
a = 1/(beta*dt**2) * (u - u0 - dt*v0 - (dt**2/2)*(1-2*beta)*a0)
v = v0 + dt * ((1 - gamma)*a0 + gamma*a)
return u, v, a
def Newmark2N(M, C, K, f, u0, v0, dt, beta, gamma):
"""
Solves the dynamic system with Newmark approach
"""
ndof, ntime = f.shape
u = np.zeros((ndof, ntime))
v = np.zeros((ndof, ntime))
a = np.zeros((ndof, ntime))
up = u0
vp = v0
ap = spsolve(M, f[:, 0] - C @ vp - K @ up)
fatK = K + 1/(beta*dt**2)*M + gamma/(beta*dt)*C
fatK_inv = np.linalg.inv(fatK.toarray()) # Assuming small, or use sparse inv
u[:, 0] = u0
v[:, 0] = v0
a[:, 0] = ap
for i in range(1, ntime):
b = f[:, i] + C @ (gamma/(beta*dt)*up + (gamma/beta - 1)*vp + dt/2*(gamma/beta - 2)*ap) + M @ (1/(beta*dt**2)*up + 1/(beta*dt)*vp + (1/(2*beta) - 1)*ap)
u[:, i] = fatK_inv @ b
a[:, i] = 1/(beta*dt**2) * (u[:, i] - up - dt*vp - (dt**2/2)*(1-2*beta)*ap)
v[:, i] = vp + dt * ((1 - gamma)*ap + gamma*a[:, i])
up, vp, ap = u[:, i], v[:, i], a[:, i]
return u, v, a
def Bconstruct(M, C, K, nA, dt, beta, gamma):
nx = M.shape[0]
B = np.zeros((3*nx, nx))
for j in range(nx):
u0 = np.zeros(nx)
v0 = np.zeros(nx)
a0 = np.zeros(nx)
eta = np.zeros(nx)
eta[j] = 1
u, v, a = newmark1step_mrhs(M, C, K, eta, u0, v0, a0, dt, beta, gamma)
B[:, j] = np.concatenate([u, v, a])
return B
def Fconstruct(M, C, K, dt, beta, gamma):
nx = M.shape[0]
M1 = np.eye(nx)
M2 = np.zeros((nx, nx))
u0 = np.block([M1, M2, M2])
v0 = np.block([M2, M1, M2])
a0 = np.block([M2, M2, M1])
f = np.zeros(nx)
u, v, a = newmark1step_mrhs(M, C, K, f, u0, v0, a0, dt, beta, gamma)
F = np.concatenate([u, v, a])
return F

Xet Storage Details

Size:
3.93 kB
·
Xet hash:
ccfeb14bc2e03e8b73f92fe28dc7968176c84010388f322df418636ef21a1580

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.