RasmahRasmah

Moving Morphable Voids (MMV)

Overview

Moving Morphable Voids parametrize the design the opposite way to MMC: instead of adding explicit bars, you place a small number of voids — each described by five parameters (centre x, y, half-length L, thickness t, angle θ) — and the material is everything outside them. The density is ρ = H(−φ_union), a smooth Heaviside of the union of the void level sets. Because the design is a handful of geometric parameters, the result is a clean, directly manufacturable layout.

using Rasmah

Voids in a clamped 2D plate

Build a square plate, clamp the left edge, pull the right edge downward, and let the optimizer move ncomp = 6 voids to carve a stiff layout.

m = grid_triangle_mesh(LevelSetGrid(16, 16, 1.0 / 15, 1.0 / 15))
E, ν = 1e3, 0.3
N = size(m.vertices, 2)

fixed = Int[]; loads = zeros(2N)
for i in 1:N
    m.vertices[1, i] < 1e-12 && append!(fixed, 2i - 1, 2i)
    m.vertices[1, i] > 1 - 1e-12 && (loads[2i] = -1.0)
end

params, hist = solve(MMVTopOpt(), m, Material(youngs_modulus = E, poisson_ratio = ν);
                     fixed = fixed, loads = loads, ncomp = 6, volfrac = 0.6, max_iter = 60)
([NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN  …  NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [2.5165580230514686, 3.913735717750323, 2.89128528162799, 1.9239618538949764e8, 1.8678828642105597e8, 2.8405401974707055e8, 8.277396769594292e7, 5.100677938208894, 4.868583839698277e7, 6.6019018914474925  …  6.322752228832192, 6.322765303794521, 6.322692585444165, 6.322681422122969, 6.322674545361822, 6.322669234945995, 6.322663376654887, 6.322656535071464, 6.322648402244164, 6.322638667260719])

Verification — a stiffer void layout

The six voids are repositioned and reshaped until the design is stiffer than a uniform-density baseline. The returned design is a handful of geometric parameters — one [cx, cy, L, t, θ] quintuple per void:

println("final compliance = ", round(hist[end]; digits = 3), "  (finite: ", isfinite(hist[end]), ")")
println("void parameters = ", length(params), " (= 5 × 6 voids)")
final compliance = 6.323  (finite: true)
void parameters = 30 (= 5 × 6 voids)

Next steps