RasmahRasmah

Eigenfrequency and Buckling Topology Optimization

Overview

Not every design goal is static stiffness. Two vibrational goals matter for lightweight structures:

  • Eigenfrequency maximization — push the lowest natural frequency up (away from excitation), so the structure avoids resonance.
  • Buckling resistance — push the critical buckling load factor up, so the structure does not collapse sideways under compression.

Both are eigenproblems: the state is (K − ω²M)φ = 0 (free vibration) or (K + λKσ)φ = 0 (buckling). Rasmah differentiates these with the modal adjoint and optimizes with MMA.

Maximizing the fundamental frequency

EigenfrequencyTopOpt maximizes the lowest eigenvalue of K φ = ω²M φ:

using Rasmah

m = tetrahedralize_box(1.0, 1.0, 1.0, 3, 3, 3)
bs = box_boundary_sets(m, 1.0, 1.0, 1.0)
fixed = dofs(m, bs[:zmin])

x, hist = solve(EigenfrequencyTopOpt(), m, Material(youngs_modulus=1e3, poisson_ratio=0.3, density=1.0);
                fixed = fixed, volfrac = 0.5, max_iter = 15)

println("normalized objective ", round(hist[1]; digits = 2), " → ", round(hist[end]; digits = 2))
println("(the objective is −ω₁²/ωref², so it *decreasing* means the frequency rises)")

vtk(m; field = x, fieldname = "density", edges = true)
normalized objective -1.0 → -0.46
(the objective is −ω₁²/ωref², so it *decreasing* means the frequency rises)

A decreasing objective means the fundamental frequency increased — the material is re-distributed to stiffen the dominant vibration mode.

Maximizing the buckling load

BucklingTopOpt maximizes the critical load factor of (K + λKσ)φ = 0, where Kσ is the geometric stiffness from the pre-buckling stress:

xb, histb = solve(BucklingTopOpt(), m, Material(youngs_modulus=1e3, poisson_ratio=0.3, density=1.0);
                  fixed = fixed, loads = bs[:zmax] => [0.0, 0.0, -1.0],
                  volfrac = 0.5, max_iter = 15)

println("normalized buckling objective ", round(histb[1]; digits = 2), " → ", round(histb[end]; digits = 2))

vtk(m; field = xb, fieldname = "density", edges = true)
normalized buckling objective -1.0 → -2.49

Next steps