Performance-Based Form Optimization Using Galapagos + infrared.city
This workflow shows how to combine infrared.city’s wind simulation with Grasshopper’s Galapagos solver to optimize an urban form. We use a simple tower-and-podium massing, vary key parameters, and automatically search for layouts that minimize:
- high-risk wind acceleration zones (> 8 m/s)
- low-wind stagnation areas (< 3 m/s)
All geometry manipulations preserve the total built volume, ensuring every candidate solution remains realistic and comparable.
You can download the ready-to-use Grasshopper file filling the form and start exploring alongside the blogpost.
Starting a project: If you’re unfamiliar with the basics, check out the Running Your First Simulation Guide which walks through the setup and launch of environmental simulations step by step.
Using the Grasshopper plugin: To get comfortable with the connector workflow, see Getting started with Connectors: infrared.city in Grasshopper where the process of linking simulations directly in Grasshopper is introduced.
What You Will Learn
By following this workflow, you will:
- Build a single-objective wind optimization using Galapagos
- Understand how to choose wind direction and speed from a wind rose
- Compute a fitness value using mesh results from infrared.city
- Configure genomes (design variables) that respect a volume constraint
- Automatically generate optimized tower–podium massings
- Use evolutionary search to minimize both wind hazards and stagnation
Step-by-step workflow
Sign in and sync your workspace
Open the Tools panel and log into your infrared.city account.
Click Refresh so Grasshopper can load your list of active projects.
This links your Grasshopper session with your infrared.city workspace and makes all your existing projects available inside the definition.
Load the target project
From the Projects dropdown, choose the target project and pass it into the Load Project component.
This imports the project data, its saved settings, and previously configured analyses—so everything you need is available directly in the Grasshopper canvas.
Connect your building geometry
Once the project loads, the connector adds two components to the canvas automatically:
- Buildings → the editable site geometry stored in your project
- Analyses → the analysis configurations already assigned to it, if you haven’t created any in the web app yet, you can define them here in Grasshopper as well.
Add or update analyses for wind simulation
Use Update Project to send your geometry and analysis settings back to the project.
Make sure your project includes the analyses needed for this workflow:
- Wind Speed
You can prepare or edit these analyses either in the web app or directly through the Grasshopper components if you prefer to keep everything parametric.
If you want to include a new massing option—such as your custom tower–podium geometry—merge it with the existing context before connecting it to Update Project.
Right-click the Update and Simulate One components and enable Auto Update to keep the workflow synced automatically.
Choosing Wind Parameters
Wind performance depends heavily on which direction and what speed you simulate.
Option A — Extreme Wind Scenario (High-Risk Analysis)
Use this when your goal is to test the worst-case wind conditions and design for safety:
- You can view the wind rose directly in the Climate Dashboard section of the web app.
- Check the wind speed map to determine which wind events are the strongest.
- Find the corresponding direction (example: around 290°).
- Check the speed frequency heatmap and pick the strongest recurring speed (e.g., 13 m/s).
- Input these values into the Wind Speed component.
- Based on the wind rose and the corresponding speed distribution, the extreme condition appears in February with a wind speed of around 13.40 m/s, coming predominantly from the 285–290° sector.
This answers:
“How does my building behave when the wind is severe?”
Option B — Typical Conditions (Most Frequent Scenario)
Use this when optimizing for everyday pedestrian comfort:
- Identify the dominant direction (largest % frequency).
- Check the typical speed band associated with that direction.
- Use these as your simulation direction and speed.
- Based on the annual wind rose, the highest occurrence frequency is at 185°, with typical wind speeds around 3.3 m/s. If a second, higher-speed frequent scenario is needed, it appears at 335°, where winds reach approximately 7.9 m/s.
This answers:
“What is the comfort level under the most common local wind?”
Genomes (Design Variables You Optimize)
This optimization keeps the overall building volume constant. Any change in geometry automatically updates linked parameters based on a formula maintaining total volume.
Your genomes are:
1. Podium Width
- Expands or contracts the base footprint
- Affects local wind deflection and downwash
2. Podium Height
- Dynamically linked to width through a volume formula
- Higher podium → smaller footprint
- Lower podium → larger footprint
3. Tower Position (X/Y Movement)
- Moves the tower around inside the site boundary
- Strong impact on channeling effects and recirculation zones
4. Rotation Angle (Tower + Podium Together)
- Rotates the entire massing as a single unit
- Controls which facade meets the incoming wind
All these variables adapt simultaneously under a fixed volume constraint, ensuring only realistic geometries are explored.
Defining Your Optimization Problem
Our goal is to minimize both extremes of wind behavior:
- Areas > 8 m/s : uncomfortable, potentially unsafe
- Areas < 3 m/s : stagnant, poor ventilation
To keep things realistic, the overall building volume stays constant. This ensures Galapagos compares fair, equivalent massing solutions.
Getting Wind Results from infrared.city
After setting parameters:
- Run the wind simulation with the Simulate One component.
- Process the mesh in Grasshopper using (inside the cluster):
- Cull Faces to isolate areas meeting conditions
- Mesh Area to calculate total area per condition
- Division to convert into percentages of total domain
You extract two metrics:
- %_slow : area with wind speed < 3 m/s
- %_fast : area with wind speed > 8 m/s
Building a Meaningful Fitness Function
Galapagos needs a single number to maximize or minimize. But we have two undesirable conditions. To combine them, we define:
fitness = (100 - %_slow) + (100 - %_fast)
Interpretation:
- If a design has lots of slow wind areas, the first term decreases
- If a design has lots of fast wind areas, the second term decreases
- The highest fitness value belongs to the geometry with the least amount of wind problems
Why maximize?
By maximizing the fitness value, you automatically minimize:
- high-speed problematic areas
- low-speed stagnant areas
without needing a multi-objective solver.
Important: In this formulation, both slow-wind and fast-wind areas contribute equally to the fitness value. This means the workflow treats low-speed stagnation and high-speed acceleration as equally undesirable. In many practical applications, especially when assessing pedestrian-level wind safety, high wind speeds are often considered more critical than low speeds.
If the design goal prioritizes reducing high-wind events over mitigating stagnation, the alternative weighted formulation (described in the next section) may be more appropriate, as it allows assigning higher importance to high-speed areas.
Alternative Way to Combine the Metrics
- Weighted Average (For prioritizing one issue)
You can assign different weights to slow-wind and fast-wind areas:
fitness = (w1 * %_slow + w2 * %_fast) / (w1 + w2)
- If high-speed discomfort is the main risk : give higher weight to %_fast
- If ventilation is the priority : give higher weight to %_slow
Galapagos must then be set to Minimize (because the direct weighted average represents “penalty”). This method is useful when the project brief requires emphasizing one comfort criterion more than the other.
Setting Up Galapagos
- Connect all genome sliders:
- podium width
- podium height
- tower move X
- tower move Y
- rotation angle
- Connect the fitness value (the combined metric) to the Galapagos Fitness input
- Set Galapagos → Maximize
- Choose your solver settings:
- Smaller population = faster early explorations
- Higher mutation rate = better coverage of search space
- Run the solver and let the evolution stabilize
Galapagos will iterate through hundreds of massing variations to find the optimal one.
Interpreting the Optimization Result
The best individual returned by Galapagos shows:
- minimized high-speed zones (> 8 m/s)
- minimized stagnant zones (< 3 m/s)
- a geometry configuration that improves comfort without increasing building volume
You can now:
- visualize the best case
- test the same geometry under different wind directions
- run sensitivity studies
- continue refining with new constraints (e.g., urban rules or solar access)
Why this helps
- Makes climate-aware design iterative and fast: By connecting wind simulation directly to your Grasshopper definition, you can test massing variations instantly without exporting files or switching platforms.
- Lets you optimize geometry based on real environmental performance: Instead of guessing how a form will behave, the evolutionary solver evaluates hundreds of design options using actual wind results from infrared.city.
- Ensures every solution stays realistic: Because the workflow preserves total building volume, all tested geometries remain feasible massing scenarios.
- Captures both wind extremes automatically: The custom fitness function balances high-wind risks and low-wind stagnation, giving you a single score that reflects overall pedestrian comfort.
- Supports evidence-based design decisions: The optimization outputs become a clear, data-driven argument for layout choices, ideal for stakeholder discussions, reports, and design reviews.
What’s next
- Try running the optimization for most frequent scenario and compare solutions.
- Add constraints such as minimum clearances, fixed tower orientation, or height limits.
- Combine this workflow with UTCI, thermal comfort statistics, or pedestrian wind comfort simulations.
- Use the best individuals from the first run as seeds for a second, more precise run.
- Try switching the objective (e.g., prioritize only high winds or only stagnant zones).
- Tutorial