In [1]:
from math import sqrt

import matplotlib.pyplot as plt
import torch
from torchfem import Truss
from torchfem.materials import IsotropicElasticity1D

torch.set_default_dtype(torch.float64)

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],
    ]
)

material = IsotropicElasticity1D(E=1.0)

truss_sample = Truss(nodes, elements, material)

# 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

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]])
material = IsotropicElasticity1D(E=10.0)

three_bar_truss = Truss(nodes, elements, material)
three_bar_truss.areas[:] = 1.0

# 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

The optimization¶

In [4]:
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):
    k0 = truss.k0() / 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).abs()

        # 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 = 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, sigma, _, _ = three_bar_truss.solve()

fig, ax = plt.subplots(figsize=(3, 3))
three_bar_truss.plot(u=u, element_property=sigma, show_thickness=True, ax=ax)
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
No description has been provided for this image
No description has been provided for this image

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, sigma, _, _ = truss_sample.solve()
truss_sample.plot(u=u, element_property=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
No description has been provided for this image
No description has been provided for this image

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)

material = IsotropicElasticity1D(E=100.0)

large_truss = Truss(nodes, elements, material)

# 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.plot()
plt.savefig("../figures/large_truss.svg", transparent=True, bbox_inches="tight")
No description has been provided for this image

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, sigma, _, _ = large_truss.solve()
large_truss.plot(u=u, element_property=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.00019
Iteration k=44 - Compliance: 0.00017
Iteration k=45 - Compliance: 0.00015
Iteration k=46 - Compliance: 0.00016
Iteration k=47 - Compliance: 0.00016
Iteration k=48 - Compliance: 0.00017
Iteration k=49 - Compliance: 0.00015
Iteration k=50 - Compliance: 0.00014
Iteration k=51 - Compliance: 0.00014
Iteration k=52 - Compliance: 0.00014
Iteration k=53 - Compliance: 0.00014
Iteration k=54 - Compliance: 0.00014
Iteration k=55 - Compliance: 0.00012
Iteration k=56 - Compliance: 0.00013
Iteration k=57 - Compliance: 0.00013
Iteration k=58 - Compliance: 0.00012
Iteration k=59 - Compliance: 0.00011
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.00009
Iteration k=69 - Compliance: 0.00009
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.00008
Iteration k=89 - Compliance: 0.00008
Iteration k=90 - Compliance: 0.00008
Iteration k=91 - Compliance: 0.00008
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.00009
Iteration k=114 - Compliance: 0.00008
Iteration k=115 - Compliance: 0.00009
Iteration k=116 - Compliance: 0.00008
Iteration k=117 - Compliance: 0.00009
Iteration k=118 - Compliance: 0.00008
Iteration k=119 - Compliance: 0.00009
Iteration k=120 - Compliance: 0.00008
Iteration k=121 - Compliance: 0.00009
Iteration k=122 - Compliance: 0.00008
Iteration k=123 - Compliance: 0.00009
Iteration k=124 - Compliance: 0.00008
Iteration k=125 - Compliance: 0.00009
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.00008
Iteration k=179 - Compliance: 0.00008
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
No description has been provided for this image
No description has been provided for this image

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)

material = IsotropicElasticity1D(E=500.0)

bridge = Truss(nodes.clone(), elements, material)

# 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


bridge.plot(node_labels=False)
No description has been provided for this image
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.00223
Iteration k=183 - Compliance: 0.00223
Iteration k=184 - Compliance: 0.00224
Iteration k=185 - Compliance: 0.00227
Iteration k=186 - Compliance: 0.00231
Iteration k=187 - Compliance: 0.00236
Iteration k=188 - Compliance: 0.00240
Iteration k=189 - Compliance: 0.00244
Iteration k=190 - Compliance: 0.00247
Iteration k=191 - Compliance: 0.00250
Iteration k=192 - Compliance: 0.00250
Iteration k=193 - Compliance: 0.00251
Iteration k=194 - Compliance: 0.00250
Iteration k=195 - Compliance: 0.00250
Iteration k=196 - Compliance: 0.00247
Iteration k=197 - Compliance: 0.00246
Iteration k=198 - Compliance: 0.00242
Iteration k=199 - Compliance: 0.00240
Iteration k=200 - Compliance: 0.00236
Iteration k=201 - Compliance: 0.00235
Iteration k=202 - Compliance: 0.00232
Iteration k=203 - Compliance: 0.00231
Iteration k=204 - Compliance: 0.00229
Iteration k=205 - Compliance: 0.00229
Iteration k=206 - Compliance: 0.00227
Iteration k=207 - Compliance: 0.00227
Iteration k=208 - Compliance: 0.00226
Iteration k=209 - Compliance: 0.00226
Iteration k=210 - Compliance: 0.00225
Iteration k=211 - Compliance: 0.00225
Iteration k=212 - Compliance: 0.00224
Iteration k=213 - Compliance: 0.00224
Iteration k=214 - Compliance: 0.00224
Iteration k=215 - Compliance: 0.00224
Iteration k=216 - Compliance: 0.00223
Iteration k=217 - Compliance: 0.00223
Iteration k=218 - Compliance: 0.00223
Iteration k=219 - Compliance: 0.00223
Iteration k=220 - Compliance: 0.00223
Iteration k=221 - Compliance: 0.00223
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
No description has been provided for this image