In [1]:
from math import sqrt
import matplotlib.pyplot as plt
import torch
from torchfem import Truss
torch.set_default_dtype(torch.double)
Sample truss¶
In [2]:
n1 = torch.linspace(0.0, 4.0, 5)
n2 = torch.linspace(0.0, 1.0, 2)
n1, n2 = torch.stack(torch.meshgrid(n1, n2, indexing="xy"))
nodes = torch.stack([n1.ravel(), n2.ravel()], dim=1)
elements = torch.tensor(
[
[0, 1],
[1, 2],
[2, 3],
[3, 4],
[5, 6],
[6, 7],
[7, 8],
[8, 9],
[1, 5],
[0, 6],
[2, 6],
[1, 7],
[3, 7],
[2, 8],
[4, 8],
[3, 9],
[1, 6],
[2, 7],
[3, 8],
[4, 9],
]
)
truss_sample = Truss(nodes, elements)
# Boundary conditions
truss_sample.forces[4, 1] = -0.1
truss_sample.constraints[0, 0] = True
truss_sample.constraints[0, 1] = True
truss_sample.constraints[5, 0] = True
# Bar properties
truss_sample.areas[:] = 10.0
truss_sample.moduli[:] = 1.0
Three bar truss¶
In [3]:
nodes = torch.tensor([[1.0, 0.0], [0.0, 0.0], [0.0, 1.0]])
elements = torch.tensor([[0, 1], [0, 2], [1, 2]])
three_bar_truss = Truss(nodes, elements)
# Boundary conditions
three_bar_truss.forces[0, 1] = -0.2
three_bar_truss.constraints[1, 0] = True
three_bar_truss.constraints[1, 1] = True
three_bar_truss.constraints[2, 0] = True
# Bar properties
three_bar_truss.areas[:] = 1.0
three_bar_truss.moduli[:] = 10.0
The optimization¶
In [4]:
def newton(grad, mu_init, max_iter=10, tol=0.0001):
# Newton's method to find root of grad (few iterations, if succesfull)
mu = torch.tensor([mu_init], requires_grad=True)
i = 0
while torch.abs(grad(mu)) > tol:
if i > max_iter:
raise Exception(f"Newton solver did not converge in {max_iter} iterations.")
gradgrad = torch.autograd.grad(grad(mu).sum(), mu)[0]
mu.data -= grad(mu) / gradgrad
mu.data = torch.max(mu.data, torch.tensor([0.0]))
i += 1
return mu.data
def bisection(grad, a, b, max_iter=50, tol=1e-10):
# Bisection method always finds a root, even with highly non-linear grad
i = 0
while (b - a) > tol:
c = (a + b) / 2.0
if i > max_iter:
raise Exception(f"Bisection did not converge in {max_iter} iterations.")
if grad(a) * grad(c) > 0:
a = c
else:
b = c
i += 1
return c
def compute_lengths(truss):
start_nodes = truss.nodes[truss.elements[:, 0]]
end_nodes = truss.nodes[truss.elements[:, 1]]
dx = end_nodes - start_nodes
return torch.linalg.norm(dx, dim=-1)
def optimize(truss, a_0, a_min, a_max, V_0, iter=10, s=0.7, p=1.0):
k0 = truss.k() / truss.areas[:, None, None]
a = [a_0]
L = []
l = compute_lengths(truss)
# Check if there is a feasible solution before starting iteration
if torch.inner(a_min, l) > V_0:
raise Exception("x_min is not compatible with V_0.")
# Iterate solutions
for k in range(iter):
# Solve the truss problem at point a_k
truss.areas = a[k]
u_k, f_k = truss.solve()
# Get strain energy of all truss elements for the given displacement
disp = u_k[truss.elements].reshape(-1, 4)
w_k = 0.5 * torch.einsum("...i,...ij,...j", disp, k0, disp)
# Compute lower asymptote
if k <= 1:
L.append(a[k] - s * (a_max - a_min))
else:
L_k = torch.zeros_like(L[k - 1])
osci = (a[k] - a[k - 1]) * (a[k - 1] - a[k - 2]) < 0.0
L_k[osci] = a[k][osci] - s * (a[k - 1][osci] - L[k - 1][osci])
L_k[~osci] = a[k][~osci] - 1 / sqrt(s) * (a[k - 1][~osci] - L[k - 1][~osci])
L.append(L_k)
# Compute lower move limit in this step
a_min_k = torch.max(a_min, 0.9 * L[k] + 0.1 * a[k])
# Analytical solution
def x_star(mu):
a_hat = L[k] + torch.sqrt((2 * w_k * (L[k] - a[k]) ** 2) / (mu * l))
return torch.clamp(a_hat, a_min_k, a_max)
# Analytical gradient
def grad(mu):
return torch.dot(x_star(mu), l) - V_0
# Solve dual problem
# mu_star = newton(grad, 1.0)
mu_star = bisection(grad, 1e-10, 100.0)
# Evaluation
compliance = torch.inner(f_k.ravel(), u_k.ravel())
print(f"Iteration k={k} - Compliance: {compliance:.5f}")
# Compute current optimal point with dual solution
a.append(x_star(mu_star))
return a
Example 28 - Optimization of the three bar truss¶
In [5]:
# Limits on design variables
a_0 = torch.tensor([0.5, 0.2, 0.3])
a_min = 0.1 * torch.ones_like(a_0)
a_max = 1.0 * torch.ones_like(a_0)
# Compute volume restriction
l = compute_lengths(three_bar_truss)
V0 = 0.5 * torch.inner(a_max, l)
a_opt = optimize(three_bar_truss, a_0, a_min, a_max, V0)
u, f = three_bar_truss.solve()
sigma = three_bar_truss.compute_stress(u)
plt.figure(figsize=(3, 3))
three_bar_truss.plot(u=u, sigma=sigma, show_thickness=True)
plt.savefig(
"../figures/three_bar_truss_size_optimized.svg",
transparent=True,
bbox_inches="tight",
)
plt.show()
plt.rcParams["text.usetex"] = True
l = compute_lengths(three_bar_truss)
plt.figure(figsize=(3, 3))
plt.plot(range(len(a_opt)), torch.stack(a_opt))
plt.axhline(0.25 * V0, color="gray")
plt.axhline(0.3535 * V0, color="gray")
plt.legend(["$a_1$", "$a_2$", "$a_3$"])
plt.xlabel("Iteration")
plt.ylabel("Design variables")
plt.xlim([0, len(a_opt)])
plt.grid()
plt.savefig(
"../figures/three_bar_truss_variables.svg", transparent=True, bbox_inches="tight"
)
plt.show()
Iteration k=0 - Compliance: 0.07790 Iteration k=1 - Compliance: 0.04519 Iteration k=2 - Compliance: 0.03783 Iteration k=3 - Compliance: 0.03750 Iteration k=4 - Compliance: 0.03749 Iteration k=5 - Compliance: 0.03749 Iteration k=6 - Compliance: 0.03749 Iteration k=7 - Compliance: 0.03749 Iteration k=8 - Compliance: 0.03749 Iteration k=9 - Compliance: 0.03749
Example 29 - Optimization of the sample truss¶
In [6]:
a_0 = 5.0 * torch.ones((len(truss_sample.elements)))
a_min = 1.0 * torch.ones_like(a_0)
a_max = 20.0 * torch.ones_like(a_0)
# Compute volume restriction
l = compute_lengths(truss_sample)
V0 = 0.5 * torch.inner(a_max, l)
a_opt = optimize(truss_sample, a_0, a_min, a_max, V0, iter=30)
u, f = truss_sample.solve()
sigma = truss_sample.compute_stress(u)
truss_sample.plot(u=u, sigma=sigma, show_thickness=True, node_labels=True)
plt.savefig(
"../figures/truss_sample_size_optimized.svg", transparent=True, bbox_inches="tight"
)
plt.show()
# plt.rcParams["text.usetex"] = True
plt.plot(range(len(a_opt)), torch.stack(a_opt))
plt.xlabel("Iteration")
plt.ylabel("Design variables")
plt.xlim([0, len(a_opt)])
plt.grid()
# plt.savefig("../figures/truss_sample_variables.svg", transparent=True)
plt.show()
Iteration k=0 - Compliance: 0.10004 Iteration k=1 - Compliance: 0.03018 Iteration k=2 - Compliance: 0.03039 Iteration k=3 - Compliance: 0.02945 Iteration k=4 - Compliance: 0.02928 Iteration k=5 - Compliance: 0.02899 Iteration k=6 - Compliance: 0.02892 Iteration k=7 - Compliance: 0.02888 Iteration k=8 - Compliance: 0.02884 Iteration k=9 - Compliance: 0.02882 Iteration k=10 - Compliance: 0.02882 Iteration k=11 - Compliance: 0.02882 Iteration k=12 - Compliance: 0.02882 Iteration k=13 - Compliance: 0.02882 Iteration k=14 - Compliance: 0.02882 Iteration k=15 - Compliance: 0.02882 Iteration k=16 - Compliance: 0.02882 Iteration k=17 - Compliance: 0.02882 Iteration k=18 - Compliance: 0.02882 Iteration k=19 - Compliance: 0.02882 Iteration k=20 - Compliance: 0.02882 Iteration k=21 - Compliance: 0.02882 Iteration k=22 - Compliance: 0.02882 Iteration k=23 - Compliance: 0.02882 Iteration k=24 - Compliance: 0.02882 Iteration k=25 - Compliance: 0.02882 Iteration k=26 - Compliance: 0.02882 Iteration k=27 - Compliance: 0.02882 Iteration k=28 - Compliance: 0.02882 Iteration k=29 - Compliance: 0.02882
Example 30 - Large truss optimization¶
In [7]:
A = 9
B = 5
n1 = torch.linspace(0.0, A - 1.0, A)
n2 = torch.linspace(0.0, B - 1.0, B)
n1, n2 = torch.stack(torch.meshgrid(n1, n2, indexing="xy"))
nodes = torch.stack([n1.ravel(), n2.ravel()], dim=1)
elements = []
for i in range(A - 1):
for j in range(B):
elements.append([i + j * A, i + 1 + j * A])
for i in range(A - 1):
for j in range(B - 1):
elements.append([i + 1 + j * A, i + 1 + A + j * A])
for i in range(A - 1):
for j in range(B - 1):
elements.append([i + j * A, i + 1 + A + j * A])
elements.append([i + 1 + j * A, i + A + j * A])
elements = torch.tensor(elements)
large_truss = Truss(nodes, elements)
# Boundary conditions
large_truss.forces[A - 1, 1] = -0.1
large_truss.constraints[0, 0] = True
large_truss.constraints[0, 1] = True
for i in range(B):
large_truss.constraints[i * A, 0] = True
large_truss.constraints[i * A, 1] = True
# Bar properties
large_truss.areas[:] = 10.0
large_truss.moduli[:] = 100.0
large_truss.plot()
plt.savefig("../figures/large_truss.svg", transparent=True, bbox_inches="tight")
Optimization¶
In [8]:
a_0 = 10.0 * torch.ones((len(elements)))
a_min = 1.0 * torch.ones_like(a_0)
a_max = 80.0 * torch.ones_like(a_0)
l = compute_lengths(large_truss)
V0 = 0.1 * torch.inner(a_max, l)
a_opt = optimize(large_truss, a_0, a_min, a_max, V0, iter=250, s=0.9)
u, f = large_truss.solve()
sigma = large_truss.compute_stress(u)
large_truss.plot(u=u, sigma=sigma, show_thickness=True, node_labels=True)
plt.savefig(
"../figures/large_truss_size_optimized.svg", transparent=True, bbox_inches="tight"
)
plt.show()
plt.plot(range(len(a_opt)), torch.stack(a_opt))
plt.xlabel("Iteration")
plt.ylabel("Design variables")
plt.xlim([0, len(a_opt)])
plt.grid()
plt.show()
Iteration k=0 - Compliance: 0.00018 Iteration k=1 - Compliance: 0.00030 Iteration k=2 - Compliance: 0.00037 Iteration k=3 - Compliance: 0.00121 Iteration k=4 - Compliance: 0.00042 Iteration k=5 - Compliance: 0.00035 Iteration k=6 - Compliance: 0.00120 Iteration k=7 - Compliance: 0.00036 Iteration k=8 - Compliance: 0.00049 Iteration k=9 - Compliance: 0.00093 Iteration k=10 - Compliance: 0.00041 Iteration k=11 - Compliance: 0.00039 Iteration k=12 - Compliance: 0.00046 Iteration k=13 - Compliance: 0.00047 Iteration k=14 - Compliance: 0.00031 Iteration k=15 - Compliance: 0.00058 Iteration k=16 - Compliance: 0.00042 Iteration k=17 - Compliance: 0.00041 Iteration k=18 - Compliance: 0.00035 Iteration k=19 - Compliance: 0.00032 Iteration k=20 - Compliance: 0.00035 Iteration k=21 - Compliance: 0.00038 Iteration k=22 - Compliance: 0.00034 Iteration k=23 - Compliance: 0.00031 Iteration k=24 - Compliance: 0.00031 Iteration k=25 - Compliance: 0.00033 Iteration k=26 - Compliance: 0.00030 Iteration k=27 - Compliance: 0.00030 Iteration k=28 - Compliance: 0.00028 Iteration k=29 - Compliance: 0.00027 Iteration k=30 - Compliance: 0.00030 Iteration k=31 - Compliance: 0.00028 Iteration k=32 - Compliance: 0.00024 Iteration k=33 - Compliance: 0.00025 Iteration k=34 - Compliance: 0.00024 Iteration k=35 - Compliance: 0.00019 Iteration k=36 - Compliance: 0.00022 Iteration k=37 - Compliance: 0.00024 Iteration k=38 - Compliance: 0.00023 Iteration k=39 - Compliance: 0.00019 Iteration k=40 - Compliance: 0.00020 Iteration k=41 - Compliance: 0.00018 Iteration k=42 - Compliance: 0.00019 Iteration k=43 - Compliance: 0.00018 Iteration k=44 - Compliance: 0.00017 Iteration k=45 - Compliance: 0.00016 Iteration k=46 - Compliance: 0.00017 Iteration k=47 - Compliance: 0.00016 Iteration k=48 - Compliance: 0.00016 Iteration k=49 - Compliance: 0.00016 Iteration k=50 - Compliance: 0.00015 Iteration k=51 - Compliance: 0.00013 Iteration k=52 - Compliance: 0.00014 Iteration k=53 - Compliance: 0.00013 Iteration k=54 - Compliance: 0.00013 Iteration k=55 - Compliance: 0.00012 Iteration k=56 - Compliance: 0.00013 Iteration k=57 - Compliance: 0.00012 Iteration k=58 - Compliance: 0.00012 Iteration k=59 - Compliance: 0.00012 Iteration k=60 - Compliance: 0.00011 Iteration k=61 - Compliance: 0.00011 Iteration k=62 - Compliance: 0.00011 Iteration k=63 - Compliance: 0.00011 Iteration k=64 - Compliance: 0.00010 Iteration k=65 - Compliance: 0.00010 Iteration k=66 - Compliance: 0.00010 Iteration k=67 - Compliance: 0.00010 Iteration k=68 - Compliance: 0.00010 Iteration k=69 - Compliance: 0.00010 Iteration k=70 - Compliance: 0.00009 Iteration k=71 - Compliance: 0.00009 Iteration k=72 - Compliance: 0.00009 Iteration k=73 - Compliance: 0.00009 Iteration k=74 - Compliance: 0.00009 Iteration k=75 - Compliance: 0.00009 Iteration k=76 - Compliance: 0.00009 Iteration k=77 - Compliance: 0.00009 Iteration k=78 - Compliance: 0.00009 Iteration k=79 - Compliance: 0.00009 Iteration k=80 - Compliance: 0.00009 Iteration k=81 - Compliance: 0.00009 Iteration k=82 - Compliance: 0.00009 Iteration k=83 - Compliance: 0.00009 Iteration k=84 - Compliance: 0.00009 Iteration k=85 - Compliance: 0.00009 Iteration k=86 - Compliance: 0.00009 Iteration k=87 - Compliance: 0.00009 Iteration k=88 - Compliance: 0.00009 Iteration k=89 - Compliance: 0.00009 Iteration k=90 - Compliance: 0.00008 Iteration k=91 - Compliance: 0.00009 Iteration k=92 - Compliance: 0.00008 Iteration k=93 - Compliance: 0.00008 Iteration k=94 - Compliance: 0.00008 Iteration k=95 - Compliance: 0.00008 Iteration k=96 - Compliance: 0.00008 Iteration k=97 - Compliance: 0.00008 Iteration k=98 - Compliance: 0.00008 Iteration k=99 - Compliance: 0.00008 Iteration k=100 - Compliance: 0.00008 Iteration k=101 - Compliance: 0.00008 Iteration k=102 - Compliance: 0.00008 Iteration k=103 - Compliance: 0.00008 Iteration k=104 - Compliance: 0.00008 Iteration k=105 - Compliance: 0.00008 Iteration k=106 - Compliance: 0.00008 Iteration k=107 - Compliance: 0.00008 Iteration k=108 - Compliance: 0.00008 Iteration k=109 - Compliance: 0.00008 Iteration k=110 - Compliance: 0.00008 Iteration k=111 - Compliance: 0.00008 Iteration k=112 - Compliance: 0.00008 Iteration k=113 - Compliance: 0.00008 Iteration k=114 - Compliance: 0.00008 Iteration k=115 - Compliance: 0.00008 Iteration k=116 - Compliance: 0.00008 Iteration k=117 - Compliance: 0.00008 Iteration k=118 - Compliance: 0.00008 Iteration k=119 - Compliance: 0.00008 Iteration k=120 - Compliance: 0.00008 Iteration k=121 - Compliance: 0.00008 Iteration k=122 - Compliance: 0.00008 Iteration k=123 - Compliance: 0.00008 Iteration k=124 - Compliance: 0.00008 Iteration k=125 - Compliance: 0.00008 Iteration k=126 - Compliance: 0.00008 Iteration k=127 - Compliance: 0.00008 Iteration k=128 - Compliance: 0.00008 Iteration k=129 - Compliance: 0.00008 Iteration k=130 - Compliance: 0.00008 Iteration k=131 - Compliance: 0.00008 Iteration k=132 - Compliance: 0.00008 Iteration k=133 - Compliance: 0.00008 Iteration k=134 - Compliance: 0.00008 Iteration k=135 - Compliance: 0.00008 Iteration k=136 - Compliance: 0.00008 Iteration k=137 - Compliance: 0.00008 Iteration k=138 - Compliance: 0.00008 Iteration k=139 - Compliance: 0.00008 Iteration k=140 - Compliance: 0.00008 Iteration k=141 - Compliance: 0.00008 Iteration k=142 - Compliance: 0.00008 Iteration k=143 - Compliance: 0.00008 Iteration k=144 - Compliance: 0.00008 Iteration k=145 - Compliance: 0.00008 Iteration k=146 - Compliance: 0.00008 Iteration k=147 - Compliance: 0.00008 Iteration k=148 - Compliance: 0.00008 Iteration k=149 - Compliance: 0.00008 Iteration k=150 - Compliance: 0.00008 Iteration k=151 - Compliance: 0.00008 Iteration k=152 - Compliance: 0.00008 Iteration k=153 - Compliance: 0.00008 Iteration k=154 - Compliance: 0.00008 Iteration k=155 - Compliance: 0.00008 Iteration k=156 - Compliance: 0.00008 Iteration k=157 - Compliance: 0.00008 Iteration k=158 - Compliance: 0.00008 Iteration k=159 - Compliance: 0.00008 Iteration k=160 - Compliance: 0.00008 Iteration k=161 - Compliance: 0.00008 Iteration k=162 - Compliance: 0.00008 Iteration k=163 - Compliance: 0.00008 Iteration k=164 - Compliance: 0.00008 Iteration k=165 - Compliance: 0.00008 Iteration k=166 - Compliance: 0.00008 Iteration k=167 - Compliance: 0.00008 Iteration k=168 - Compliance: 0.00008 Iteration k=169 - Compliance: 0.00008 Iteration k=170 - Compliance: 0.00008 Iteration k=171 - Compliance: 0.00008 Iteration k=172 - Compliance: 0.00008 Iteration k=173 - Compliance: 0.00008 Iteration k=174 - Compliance: 0.00008 Iteration k=175 - Compliance: 0.00008 Iteration k=176 - Compliance: 0.00008 Iteration k=177 - Compliance: 0.00008 Iteration k=178 - Compliance: 0.00009 Iteration k=179 - Compliance: 0.00009 Iteration k=180 - Compliance: 0.00008 Iteration k=181 - Compliance: 0.00008 Iteration k=182 - Compliance: 0.00008 Iteration k=183 - Compliance: 0.00008 Iteration k=184 - Compliance: 0.00008 Iteration k=185 - Compliance: 0.00008 Iteration k=186 - Compliance: 0.00008 Iteration k=187 - Compliance: 0.00008 Iteration k=188 - Compliance: 0.00008 Iteration k=189 - Compliance: 0.00008 Iteration k=190 - Compliance: 0.00008 Iteration k=191 - Compliance: 0.00008 Iteration k=192 - Compliance: 0.00008 Iteration k=193 - Compliance: 0.00008 Iteration k=194 - Compliance: 0.00008 Iteration k=195 - Compliance: 0.00008 Iteration k=196 - Compliance: 0.00008 Iteration k=197 - Compliance: 0.00008 Iteration k=198 - Compliance: 0.00008 Iteration k=199 - Compliance: 0.00008 Iteration k=200 - Compliance: 0.00008 Iteration k=201 - Compliance: 0.00008 Iteration k=202 - Compliance: 0.00008 Iteration k=203 - Compliance: 0.00008 Iteration k=204 - Compliance: 0.00008 Iteration k=205 - Compliance: 0.00008 Iteration k=206 - Compliance: 0.00008 Iteration k=207 - Compliance: 0.00008 Iteration k=208 - Compliance: 0.00008 Iteration k=209 - Compliance: 0.00008 Iteration k=210 - Compliance: 0.00008 Iteration k=211 - Compliance: 0.00008 Iteration k=212 - Compliance: 0.00008 Iteration k=213 - Compliance: 0.00008 Iteration k=214 - Compliance: 0.00008 Iteration k=215 - Compliance: 0.00008 Iteration k=216 - Compliance: 0.00008 Iteration k=217 - Compliance: 0.00008 Iteration k=218 - Compliance: 0.00008 Iteration k=219 - Compliance: 0.00008 Iteration k=220 - Compliance: 0.00008 Iteration k=221 - Compliance: 0.00008 Iteration k=222 - Compliance: 0.00008 Iteration k=223 - Compliance: 0.00008 Iteration k=224 - Compliance: 0.00008 Iteration k=225 - Compliance: 0.00008 Iteration k=226 - Compliance: 0.00008 Iteration k=227 - Compliance: 0.00008 Iteration k=228 - Compliance: 0.00008 Iteration k=229 - Compliance: 0.00008 Iteration k=230 - Compliance: 0.00008 Iteration k=231 - Compliance: 0.00008 Iteration k=232 - Compliance: 0.00008 Iteration k=233 - Compliance: 0.00008 Iteration k=234 - Compliance: 0.00008 Iteration k=235 - Compliance: 0.00008 Iteration k=236 - Compliance: 0.00008 Iteration k=237 - Compliance: 0.00008 Iteration k=238 - Compliance: 0.00008 Iteration k=239 - Compliance: 0.00008 Iteration k=240 - Compliance: 0.00008 Iteration k=241 - Compliance: 0.00008 Iteration k=242 - Compliance: 0.00008 Iteration k=243 - Compliance: 0.00008 Iteration k=244 - Compliance: 0.00008 Iteration k=245 - Compliance: 0.00008 Iteration k=246 - Compliance: 0.00008 Iteration k=247 - Compliance: 0.00008 Iteration k=248 - Compliance: 0.00008 Iteration k=249 - Compliance: 0.00008
Figure 5.4 - Bridge¶
In [9]:
# Dimensions
A = 17
B = 2
# Nodes
n1 = torch.linspace(0.0, 5.0, A)
n2 = torch.linspace(0.0, 0.5, B)
n1, n2 = torch.stack(torch.meshgrid(n1, n2, indexing="xy"))
nodes = torch.stack([n1.ravel(), n2.ravel()], dim=1)
# Elements
elements = []
for i in range(A - 1):
for j in range(B):
elements.append([i + j * A, i + 1 + j * A])
for i in range(A):
for j in range(B - 1):
elements.append([i + j * A, i + A + j * A])
for i in range(A - 1):
for j in range(B - 1):
elements.append([i + j * A, i + 1 + A + j * A])
elements.append([i + 1 + j * A, i + A + j * A])
elements = torch.tensor(elements)
bridge = Truss(nodes.clone(), elements)
# Forces at bottom edge
bridge.forces[1 : A - 1, 1] = -0.1
# Constraints by the supports
bridge.constraints[0, 0] = True
bridge.constraints[0, 1] = True
bridge.constraints[A - 1, 1] = True
# Areas
bridge.areas[:] = 1.0
bridge.moduli[:] = 500.0
# Truss
bridge.plot(node_labels=False)
In [10]:
a_0 = 10.0 * torch.ones((len(elements)))
a_min = 1.0 * torch.ones_like(a_0)
a_max = 80.0 * torch.ones_like(a_0)
l = compute_lengths(bridge)
V0 = 0.1 * torch.inner(a_max, l)
a_opt = optimize(bridge, a_0, a_min, a_max, V0, iter=250, s=0.9)
bridge.plot(show_thickness=True, node_labels=False)
plt.savefig(
"../figures/bridge_size_optimized.svg", transparent=True, bbox_inches="tight"
)
plt.show()
Iteration k=0 - Compliance: 0.00453 Iteration k=1 - Compliance: 0.00708 Iteration k=2 - Compliance: 0.03957 Iteration k=3 - Compliance: 0.00572 Iteration k=4 - Compliance: 0.03565 Iteration k=5 - Compliance: 0.01128 Iteration k=6 - Compliance: 0.01516 Iteration k=7 - Compliance: 0.02055 Iteration k=8 - Compliance: 0.01574 Iteration k=9 - Compliance: 0.01347 Iteration k=10 - Compliance: 0.01018 Iteration k=11 - Compliance: 0.02114 Iteration k=12 - Compliance: 0.01706 Iteration k=13 - Compliance: 0.01118 Iteration k=14 - Compliance: 0.00921 Iteration k=15 - Compliance: 0.01644 Iteration k=16 - Compliance: 0.02157 Iteration k=17 - Compliance: 0.00634 Iteration k=18 - Compliance: 0.00760 Iteration k=19 - Compliance: 0.00673 Iteration k=20 - Compliance: 0.01893 Iteration k=21 - Compliance: 0.01405 Iteration k=22 - Compliance: 0.00828 Iteration k=23 - Compliance: 0.01210 Iteration k=24 - Compliance: 0.01183 Iteration k=25 - Compliance: 0.00624 Iteration k=26 - Compliance: 0.01245 Iteration k=27 - Compliance: 0.00704 Iteration k=28 - Compliance: 0.01209 Iteration k=29 - Compliance: 0.00628 Iteration k=30 - Compliance: 0.00626 Iteration k=31 - Compliance: 0.00595 Iteration k=32 - Compliance: 0.00635 Iteration k=33 - Compliance: 0.00575 Iteration k=34 - Compliance: 0.00619 Iteration k=35 - Compliance: 0.00622 Iteration k=36 - Compliance: 0.00812 Iteration k=37 - Compliance: 0.00577 Iteration k=38 - Compliance: 0.00582 Iteration k=39 - Compliance: 0.00568 Iteration k=40 - Compliance: 0.00558 Iteration k=41 - Compliance: 0.00567 Iteration k=42 - Compliance: 0.00528 Iteration k=43 - Compliance: 0.00587 Iteration k=44 - Compliance: 0.00503 Iteration k=45 - Compliance: 0.00534 Iteration k=46 - Compliance: 0.00438 Iteration k=47 - Compliance: 0.00500 Iteration k=48 - Compliance: 0.00380 Iteration k=49 - Compliance: 0.00477 Iteration k=50 - Compliance: 0.00424 Iteration k=51 - Compliance: 0.00448 Iteration k=52 - Compliance: 0.00437 Iteration k=53 - Compliance: 0.00465 Iteration k=54 - Compliance: 0.00438 Iteration k=55 - Compliance: 0.00439 Iteration k=56 - Compliance: 0.00420 Iteration k=57 - Compliance: 0.00393 Iteration k=58 - Compliance: 0.00447 Iteration k=59 - Compliance: 0.00402 Iteration k=60 - Compliance: 0.00403 Iteration k=61 - Compliance: 0.00374 Iteration k=62 - Compliance: 0.00378 Iteration k=63 - Compliance: 0.00369 Iteration k=64 - Compliance: 0.00375 Iteration k=65 - Compliance: 0.00366 Iteration k=66 - Compliance: 0.00369 Iteration k=67 - Compliance: 0.00354 Iteration k=68 - Compliance: 0.00356 Iteration k=69 - Compliance: 0.00361 Iteration k=70 - Compliance: 0.00351 Iteration k=71 - Compliance: 0.00341 Iteration k=72 - Compliance: 0.00354 Iteration k=73 - Compliance: 0.00337 Iteration k=74 - Compliance: 0.00336 Iteration k=75 - Compliance: 0.00349 Iteration k=76 - Compliance: 0.00328 Iteration k=77 - Compliance: 0.00328 Iteration k=78 - Compliance: 0.00329 Iteration k=79 - Compliance: 0.00317 Iteration k=80 - Compliance: 0.00314 Iteration k=81 - Compliance: 0.00314 Iteration k=82 - Compliance: 0.00296 Iteration k=83 - Compliance: 0.00306 Iteration k=84 - Compliance: 0.00295 Iteration k=85 - Compliance: 0.00298 Iteration k=86 - Compliance: 0.00281 Iteration k=87 - Compliance: 0.00284 Iteration k=88 - Compliance: 0.00280 Iteration k=89 - Compliance: 0.00284 Iteration k=90 - Compliance: 0.00275 Iteration k=91 - Compliance: 0.00284 Iteration k=92 - Compliance: 0.00277 Iteration k=93 - Compliance: 0.00275 Iteration k=94 - Compliance: 0.00276 Iteration k=95 - Compliance: 0.00275 Iteration k=96 - Compliance: 0.00275 Iteration k=97 - Compliance: 0.00274 Iteration k=98 - Compliance: 0.00276 Iteration k=99 - Compliance: 0.00273 Iteration k=100 - Compliance: 0.00277 Iteration k=101 - Compliance: 0.00272 Iteration k=102 - Compliance: 0.00278 Iteration k=103 - Compliance: 0.00271 Iteration k=104 - Compliance: 0.00278 Iteration k=105 - Compliance: 0.00272 Iteration k=106 - Compliance: 0.00278 Iteration k=107 - Compliance: 0.00272 Iteration k=108 - Compliance: 0.00278 Iteration k=109 - Compliance: 0.00272 Iteration k=110 - Compliance: 0.00277 Iteration k=111 - Compliance: 0.00271 Iteration k=112 - Compliance: 0.00275 Iteration k=113 - Compliance: 0.00270 Iteration k=114 - Compliance: 0.00273 Iteration k=115 - Compliance: 0.00268 Iteration k=116 - Compliance: 0.00270 Iteration k=117 - Compliance: 0.00265 Iteration k=118 - Compliance: 0.00267 Iteration k=119 - Compliance: 0.00263 Iteration k=120 - Compliance: 0.00264 Iteration k=121 - Compliance: 0.00261 Iteration k=122 - Compliance: 0.00263 Iteration k=123 - Compliance: 0.00260 Iteration k=124 - Compliance: 0.00261 Iteration k=125 - Compliance: 0.00258 Iteration k=126 - Compliance: 0.00259 Iteration k=127 - Compliance: 0.00256 Iteration k=128 - Compliance: 0.00256 Iteration k=129 - Compliance: 0.00254 Iteration k=130 - Compliance: 0.00254 Iteration k=131 - Compliance: 0.00252 Iteration k=132 - Compliance: 0.00251 Iteration k=133 - Compliance: 0.00249 Iteration k=134 - Compliance: 0.00247 Iteration k=135 - Compliance: 0.00244 Iteration k=136 - Compliance: 0.00243 Iteration k=137 - Compliance: 0.00240 Iteration k=138 - Compliance: 0.00237 Iteration k=139 - Compliance: 0.00238 Iteration k=140 - Compliance: 0.00235 Iteration k=141 - Compliance: 0.00233 Iteration k=142 - Compliance: 0.00231 Iteration k=143 - Compliance: 0.00230 Iteration k=144 - Compliance: 0.00228 Iteration k=145 - Compliance: 0.00226 Iteration k=146 - Compliance: 0.00226 Iteration k=147 - Compliance: 0.00225 Iteration k=148 - Compliance: 0.00226 Iteration k=149 - Compliance: 0.00224 Iteration k=150 - Compliance: 0.00224 Iteration k=151 - Compliance: 0.00224 Iteration k=152 - Compliance: 0.00224 Iteration k=153 - Compliance: 0.00224 Iteration k=154 - Compliance: 0.00224 Iteration k=155 - Compliance: 0.00223 Iteration k=156 - Compliance: 0.00223 Iteration k=157 - Compliance: 0.00223 Iteration k=158 - Compliance: 0.00223 Iteration k=159 - Compliance: 0.00223 Iteration k=160 - Compliance: 0.00223 Iteration k=161 - Compliance: 0.00223 Iteration k=162 - Compliance: 0.00223 Iteration k=163 - Compliance: 0.00223 Iteration k=164 - Compliance: 0.00223 Iteration k=165 - Compliance: 0.00223 Iteration k=166 - Compliance: 0.00223 Iteration k=167 - Compliance: 0.00223 Iteration k=168 - Compliance: 0.00223 Iteration k=169 - Compliance: 0.00223 Iteration k=170 - Compliance: 0.00223 Iteration k=171 - Compliance: 0.00223 Iteration k=172 - Compliance: 0.00223 Iteration k=173 - Compliance: 0.00223 Iteration k=174 - Compliance: 0.00223 Iteration k=175 - Compliance: 0.00223 Iteration k=176 - Compliance: 0.00222 Iteration k=177 - Compliance: 0.00222 Iteration k=178 - Compliance: 0.00222 Iteration k=179 - Compliance: 0.00222 Iteration k=180 - Compliance: 0.00222 Iteration k=181 - Compliance: 0.00222 Iteration k=182 - Compliance: 0.00222 Iteration k=183 - Compliance: 0.00222 Iteration k=184 - Compliance: 0.00222 Iteration k=185 - Compliance: 0.00222 Iteration k=186 - Compliance: 0.00222 Iteration k=187 - Compliance: 0.00222 Iteration k=188 - Compliance: 0.00222 Iteration k=189 - Compliance: 0.00222 Iteration k=190 - Compliance: 0.00222 Iteration k=191 - Compliance: 0.00222 Iteration k=192 - Compliance: 0.00222 Iteration k=193 - Compliance: 0.00222 Iteration k=194 - Compliance: 0.00222 Iteration k=195 - Compliance: 0.00222 Iteration k=196 - Compliance: 0.00222 Iteration k=197 - Compliance: 0.00222 Iteration k=198 - Compliance: 0.00222 Iteration k=199 - Compliance: 0.00222 Iteration k=200 - Compliance: 0.00222 Iteration k=201 - Compliance: 0.00222 Iteration k=202 - Compliance: 0.00222 Iteration k=203 - Compliance: 0.00222 Iteration k=204 - Compliance: 0.00222 Iteration k=205 - Compliance: 0.00222 Iteration k=206 - Compliance: 0.00222 Iteration k=207 - Compliance: 0.00222 Iteration k=208 - Compliance: 0.00222 Iteration k=209 - Compliance: 0.00222 Iteration k=210 - Compliance: 0.00222 Iteration k=211 - Compliance: 0.00222 Iteration k=212 - Compliance: 0.00222 Iteration k=213 - Compliance: 0.00222 Iteration k=214 - Compliance: 0.00222 Iteration k=215 - Compliance: 0.00222 Iteration k=216 - Compliance: 0.00222 Iteration k=217 - Compliance: 0.00222 Iteration k=218 - Compliance: 0.00222 Iteration k=219 - Compliance: 0.00222 Iteration k=220 - Compliance: 0.00222 Iteration k=221 - Compliance: 0.00222 Iteration k=222 - Compliance: 0.00222 Iteration k=223 - Compliance: 0.00222 Iteration k=224 - Compliance: 0.00222 Iteration k=225 - Compliance: 0.00222 Iteration k=226 - Compliance: 0.00222 Iteration k=227 - Compliance: 0.00222 Iteration k=228 - Compliance: 0.00222 Iteration k=229 - Compliance: 0.00222 Iteration k=230 - Compliance: 0.00222 Iteration k=231 - Compliance: 0.00222 Iteration k=232 - Compliance: 0.00222 Iteration k=233 - Compliance: 0.00222 Iteration k=234 - Compliance: 0.00222 Iteration k=235 - Compliance: 0.00222 Iteration k=236 - Compliance: 0.00222 Iteration k=237 - Compliance: 0.00222 Iteration k=238 - Compliance: 0.00222 Iteration k=239 - Compliance: 0.00222 Iteration k=240 - Compliance: 0.00222 Iteration k=241 - Compliance: 0.00222 Iteration k=242 - Compliance: 0.00222 Iteration k=243 - Compliance: 0.00222 Iteration k=244 - Compliance: 0.00222 Iteration k=245 - Compliance: 0.00222 Iteration k=246 - Compliance: 0.00222 Iteration k=247 - Compliance: 0.00222 Iteration k=248 - Compliance: 0.00222 Iteration k=249 - Compliance: 0.00222