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 RasmahVoids 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
- Moving morphable components (MMC) — the explicit-bar complement.
- Level-set topology optimization — an implicit boundary.
