RasmahRasmah

Homogenization and Metamaterial Design

Overview

Homogenization computes the effective elasticity of a periodic microstructure — the large-scale stiffness a material with a repeating unit cell behaves as. The inverse problem, metamaterial design, is far more powerful: choose the unit-cell layout so the effective material has a prescribed property, including extreme ones like a negative Poisson’s ratio (auxetic: pulling it makes it fatter) or near-zero stiffness in a direction.

The effective elasticity is obtained from six cell problems solved on the periodic unit cell (each a unit-strain loading with periodic boundary conditions). For a homogeneous cell, homogenization returns the material’s own C.

Forward homogenization

using Rasmah, LinearAlgebra

m = tetrahedralize_box(1.0, 1.0, 1.0, 2, 2, 2)
E, ν = 1e3, 0.3
C = Matrix(elasticity_matrix(E, ν))

CH = homogenize(m, fill(1.0, size(m.elements, 2)), C)

println("homogenized C₁₁ = ", round(CH[1, 1]; digits = 3), " (material C₁₁ = ", round(C[1, 1]; digits = 3), ")")
println("match a homogeneous cell: ", maximum(abs, Matrix(CH) .- C) < 1e-4)
homogenized C₁₁ = 1346.154 (material C₁₁ = 1346.154)
match a homogeneous cell: true

For a uniform cell the effective stiffness equals the material stiffness — the homogenization is exact for a homogeneous medium.

Prescribed stiffness

prescribed_stiffness_topopt designs a cell whose effective C_H matches a target C* (e.g. a softer material at 40% the modulus):

Cstar = 0.4^3 .* C
res = prescribed_stiffness_topopt(m, C, Cstar, fill(0.5, size(m.elements, 2)); volfrac = 0.5, maxiter = 40)

println("‖C_H − C*‖ = ", round(norm(Matrix(res.CH) .- Cstar); digits = 5))

vtk(m; field = res.ρ, fieldname = "cell density", edges = true)
‖C_H − C*‖ = 0.0002

Auxetic (negative Poisson’s ratio)

auxetic_topopt minimizes the transverse coupling C_H[1,2], driving the effective Poisson’s ratio down:

resa = auxetic_topopt(m, C, fill(0.5, size(m.elements, 2)); volfrac = 0.5, maxiter = 40)

println("effective Poisson's ratio ν = ", round(effective_poisson(resa.CH); digits = 3))
println("(a uniform cell has ν = ", round(ν; digits = 3), ")")

vtk(m; field = resa.ρ, fieldname = "cell density", edges = true)
effective Poisson's ratio ν = 0.0
(a uniform cell has ν = 0.3)

Next steps