Open-Source Topology Optimization: TopOpt.jl Tutorial on Windows WSL

 

Open-Source Topology Optimization: TopOpt.jl Tutorial on Windows WSL

1. Fundamentals: What is Topology Optimization?

Topology optimization solves a fundamental question: Given a maximum volume of material, where should it be placed to maximize structural stiffness under a specific load?

The most common mathematical framework used is the Solid Isotropic Material with Penalization (SIMP) method. It divides your CAD design space into a grid of tiny finite element voxels. The optimization algorithm assigns a pseudo-density variable ($\rho$) to each voxel, ranging continuously between 0 (void/air) and 1 (solid material).

The objective function typically minimizes Structural Compliance (which is equivalent to maximizing stiffness):

$$\min_{\rho} \quad c(\rho) = U^T K(\rho) U$$
$$\text{subject to} \quad V(\rho) \le V_{target}$$

Where $U$ is the displacement vector, $K$ is the global stiffness matrix parameterized by voxel densities, and $V$ is the final material volume limit. The algorithm uses gradient-based optimization to iteratively strip away low-stress voxels, leaving behind a organic, biomimetic skeletal structure.

2. Setting Up Your Environment on WSL

Because heavy scientific computing suites and linear algebra solvers run natively and more efficiently on Linux, we will run our pipeline inside Windows Subsystem for Linux (WSL).

Step 1: Launch and Update WSL

Open your Windows Terminal (PowerShell or Command Prompt) and boot into your Linux distribution (Ubuntu is recommended):

Bash
wsl --install -d Ubuntu
wsl
sudo apt update && sudo apt upgrade -y

Step 2: Install Julia on WSL

Download and extract the latest stable version of Julia using the official binaries:

Bash
cd ~
wget https://julialang-s3.julialang.org/bin/linux/x64/1.10/julia-1.10.2-linux-x86_64.tar.gz
tar -xvzf julia-1.10.2-linux-x86_64.tar.gz
sudo ln -s ~/julia-1.10.2/bin/julia /usr/local/bin/julia

Verify the installation by typing julia into your terminal. You should see the Julia interactive REPL.

3. Step-by-Step Optimization with TopOpt.jl

With Julia running smoothly on WSL, we can initialize our optimization project.

Step 1: Install TopOpt.jl and Core Packages

Launch the Julia REPL by typing julia. Enter the package manager mode by pressing ] on your keyboard, then run:

Julia
(@v1.10) pkg> add TopOpt, LinearAlgebra, Makie, GLMakie

Note: We add GLMakie to handle the real-time 3D rendering of our structural optimization loops directly from Linux.

Step 2: Define the Optimization Script

Create a new file in your workspace named run_topopt.jl. We will set up a classic 2D/3D cantilever beam problem—fixed firmly on the left wall with a concentrated downward force applied to the bottom right corner.

Julia
using TopOpt
using LinearAlgebra
using GLMakie

# 1. Define the Problem Dimensions (Voxel Grid size)
# A 30x10x10 rectangular solid design space
E = 1.0   # Young's Modulus of base material
ν = 0.3   # Poisson's ratio
sizes = (30, 10, 10)
spatial_dimension = 3

# 2. Configure the Finite Element Analysis (FEA) Mesh
problem = Cantilever(Val(spatial_dimension), sizes, E, ν)

# 3. Define Optimization Parameters
volume_fraction = 0.4  # Retain only 40% of the original volume
penalization_power = 3.0 # Standard SIMP penalization parameter (p=3)
filter_radius = 1.5    # Prevents numerical checkerboard patterns

# 4. Assemble the SIMP Model
solver = FEASolver(problem)
model = SIMPModel(solver, penalization_power, filter_radius)

Step 3: Define the Objective and Execute the Optimization Loop

We append our volume target and compliance criteria, then pass the model to the Method of Moving Asymptotes (MMA) optimizer, which is standard for structural synthesis.

Julia
# Setup compliance minimization objective
objective_function = Compliance(model)
volume_constraint = VolumeConstraint(model, volume_fraction)

# Define the mathematical optimizer wrapper
options = OptimizationOptions(maxiter=100, tol=1e-4)
optimization_problem = TopOptProblem(objective_function, volume_constraint)

println("Beginning Topology Optimization Loop...")
result = optimize(optimization_problem, options)

Step 4: Visualize and Export the Result

Once the solver reaches convergence, we can view our generated structure before converting it back into our CAD environment.

Julia
# Render the optimized density field
densities = result.minimizer
visualize(problem, densities)

4. Bringing It Back to CAD (STL Export)

TopOpt.jl outputs an array of fractional voxel densities. To bring this back into Fusion 360, SolidWorks, or Blender:

  1. Use Julia's internal thresholding tools to discard any voxel with a density below 0.5.

  2. Convert the remaining solid voxel cluster into a 3D mesh via a marching cubes algorithm.

  3. Save the mesh using standard mesh export formats to process the organic shape back into a clean CAD surface.

Julia
# Optional: Save optimized densities to a standard VTK file for ParaView processing
using WriteVTK
vtk_grid("optimized_bracket", problem.mesh) do vtk
    vtk["Densities"] = densities
end

Open the generated VTK file in ParaView inside WSL, apply a "Threshold" filter to isolate solid material, and export the resulting surface geometry directly as an .STL file.

Conclusion: The Power of Open-Source Synthesis

By combining the lightweight computational flexibility of WSL with the high-performance execution of TopOpt.jl, you can bypass costly commercial licensing restrictions and design components optimized for real-world mechanical demands. Whether you're cutting mass from a custom drone arm or refining a robotic frame, generative hardware design ensures your system remains structurally resilient without carrying an ounce of dead weight.

References & Resources:

What kind of structure are you planning to optimize? Are you trying to reduce the weight of an aerospace component or a custom robotic actuator link? Let's talk engineering in the comments section below!

Comments

Popular Posts