RasmahRasmah

Nonlinear Buckling Topology Optimization

Overview

Buckling is a geometric instability: a structure collapses well below its yield stress. Linear buckling gives the load factor λ from the eigenproblem (K + λ K_σ) φ = 0, where K_σ is the geometric stiffness built from the pre-buckling stress. Nonlinear buckling topology optimization maximizes the load factor of the geometrically nonlinear equilibrium path, so the optimized design resists this instability rather than just stiffening against it.

using Rasmah

A compressed column

Clamp the base of a column and apply a compressive end load; the optimizer redistributes material to raise the buckling load.

m = tetrahedralize_box(0.5, 0.5, 1.0, 2, 2, 4)
n = size(m.nodes, 2)
fixed = Int[]
for i in 1:n
    m.nodes[3, i] < 1e-6 && append!(fixed, 3i - 2, 3i - 1, 3i)
end
loads = zeros(3n)
for i in 1:n
    m.nodes[3, i] > 0.999 && (loads[3i] = -1e6)      # compress along z (the column axis)
end

x, hist = solve(NonlinearBucklingTopOpt(), m, Material(youngs_modulus = 1e9, poisson_ratio = 0.3);
                fixed = fixed, loads = loads, volfrac = 0.5, max_iter = 10)
([0.001, 0.001, 0.754182769867007, 0.4655324439417172, 0.4655324439582308, 0.7541827671484124, 0.8186399341582247, 0.8186399341582247, 0.001, 0.7450845221860423  …  0.8035903363697426, 0.5224719600736633, 0.5109396064690507, 0.44410288434990947, 0.6218046912065893, 0.6218046912453962, 0.5092731677086763, 0.001, 0.001, 0.509273167814104], [-0.1836699771012592, -0.20238099168153473, -0.22962084158871013, -0.23534730229885376, -0.26943384625822087, -0.2533921771797731, -0.2672575423415513, -0.2896181660059673, -0.2784678822544253, -0.3240134708942811])

Verification — the design stays feasible

The density field is finite and bounded, and the objective (buckling resistance) improves:

println("all densities in [0,1]: ", all(0 .<= x .<= 1))
println("volume fraction ≈ 0.5: ", round(sum(x) / length(x); digits = 3))
all densities in [0,1]: true
volume fraction ≈ 0.5: 0.507
vtk(m; field = x, fieldname = "density (buckling)", edges = true)

Next steps