RasmahRasmah

Anisotropic (Transversely Isotropic) Topology Optimization

Overview

Layered composites, wood and 3D-printed parts with a build direction are anisotropic: they are stiffer along one axis than perpendicular to it. For a transversely isotropic material the stiffness is set by five independent constants — E_par, E_perp, ν_par, ν_perp, G_par (parallel/perpendicular to the fibre axis). AnisotropicTopOpt optimizes the density under this anisotropic elasticity, so the layout aligns with the strong direction.

using Rasmah

A fibre-reinforced cantilever

Clamp and pull a cube whose material is stiffer along x (E_par > E_perp); the optimizer exploits the anisotropy.

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

x, hist = solve(AnisotropicTopOpt(), m, Material(youngs_modulus = 1e9, poisson_ratio = 0.3);
                fixed = fixed, loads = loads, E_par = 2e9, E_perp = 1e9,
                volfrac = 0.5, max_iter = 10)
([0.6926907355831928, 0.5703441313481037, 0.48030694793764034, 0.48030694793764034, 0.62753057661745, 0.6920634438512278, 0.6568368187907901, 0.5167160672192057, 0.4758513693932075, 0.4752912933396743  …  0.658066702065966, 0.658563334596276, 0.539838057870024, 0.4526934437055576, 0.4459991675435654, 0.593911168032892, 0.6866359881188828, 0.6875278566470231, 0.5853319510394276, 0.44854283053661514], [5.175830112763331e6, 3.5734631908575236e6, 5.890131974259985e6, 5.049632713876429e6, 4.866269418760659e6, 4.812972115504249e6, 4.764586321389277e6, 4.706932908163616e6, 4.634475552402393e6, 4.540584713795812e6])

Verification — compliance drops

The compliance must fall from the uniform baseline, and the volume constraint is met:

println("compliance: ", round(hist[1]; digits = 3), " → ", round(hist[end]; digits = 3))
println("volume fraction ≈ 0.5: ", round(sum(x) / length(x); digits = 3))
compliance: 5.175830113e6 → 4.540584714e6
volume fraction ≈ 0.5: 0.499
vtk(m; field = x, fieldname = "density (anisotropic)", edges = true)

Next steps