Diving into Parametric Design
Creating Architecture through Algorithms

Introduction
At its core, parametric design defines relationships between design elements based on mathematical equations. The term "parametric" originates from mathematics and uses specific variables that we can manipulate to alter the outcome. BIM is a tightly connected concept since we associate parameters (key-value pairs of information) with 3D geometry. These pieces of data define aspects of building elements that their geometry alone doesn't describe—for example, manufacturer information for a steel column.
The Power of Parametric Design
One key characteristic that sets parametric design apart is its inherent flexibility. Due to the interconnected nature of design elements, changes can be made easily at any stage of the design process without causing a domino effect of manual adjustments, allowing architects to explore various design options and rapidly iterate on their ideas.
Also, it allows for high precision and control. Architects can ensure that the final result meets specifications and quality standards by explicitly defining the relationships and constraints between design elements, reducing the risk of errors compromising the design's integrity or functionality.
Real-World Examples
When it comes to applying these concepts, one of the pioneers in this field was Zaha Hadid, whose fluid, organic architectural forms became her signature style. The Guangzhou Opera House, with its distinctive undulating form, was realized through parametric principles.

The Gherkin in London is a testament to the potential of parametric design in creating iconic structures. Foster and Partners designed its tapered, pickle-like shape using intricate algorithms to balance aesthetic and structural efficiency considerations.

In sustainability, we have the Al Bahar Towers in Abu Dhabi, designed by Aedas. A complex design created a responsive façade that opens and closes in response to the sun's movement, dramatically reducing solar gain and enhancing energy efficiency.

Another example, a bit more far-fetched, is the Bund Finance Centre. A collaboration between Foster and Heatherwick presents an adaptive façade that moves throughout the day. We can see a relation between tube lengths, placement, and movement speed that follows specific rules to achieve the desired effect.
<a href="https://medium.com/media/d57cdbbde5407701544384dc0df11f76/href">https://medium.com/media/d57cdbbde5407701544384dc0df11f76/href</a>
Practical Applications
For a deeper understanding, let's consider a simple scenario: designing a rectangular room with parameters like length, width, height, and the number of desks that fit inside. These elements are not independent but are interconnected. We can establish a parameter or rule that links desks and room size. Therefore, the desk grid adjusts to maintain this rule if the room's width increases.
Contrast this with traditional design, where we manipulate each element independently. If you decided to increase the room's width, the desk grid would remain unaffected unless manually changed, seeming more straightforward for a basic design. Still, as complexity grows, parametric design is a powerful tool for managing complexity efficiently and consistently.
The algorithms used can range from simple mathematical formulas to complex ones based on principles of geometry, physics, and environmental factors. For instance, an architect might create one that adjusts the shape and position of a building's façade based on the sun's path throughout the day, optimizing natural light and heat and enhancing energy efficiency.
We can use Dynamo inside Revit, one of the most popular BIM platforms, to achieve such results. It's a powerful visual scripting tool that integrates well with Python. Here, we can manipulate and query data in a project.
Fitting Desks in a Room
Let's assume we have a rectangular area as per the previous example. The parametric rule is that the room's width and height directly dictate how many desks fit, creating an evenly-spaced grid.
Following the steps below, I ran a quick experiment to illustrate this example.
Define Input Parameters
I used number sliders for the room and desk width, length, height, the offset (distance) between desks, and a Plane where to place the objects.
2. Define Room and Desk geometries
I defined rectangles to represent the room and desk shapes, connecting the previous inputs using twoRectangle.ByWidthLength nodes.
3. Generate a Grid
I created a grid of points within the room to represent possible positions for the furniture. This was achieved using a CodeBlock node to generate a series of X, and Y coordinates based on the dimensions, making sequences to create a grid of points, and connecting the inputs (dimensions and offset). We also need to move the points to the corner of the grid, so we're subtracting half the width/length.
The entire content is as follows:
x_coords = (0..(RoomWidth - FurnitureWidth)..FurnitureWidth + Offset)-RoomWidth /2;
y_coords = (0..(RoomLength - FurnitureLength)..FurnitureLength + Offset)-RoomLength/2;
pnts = Point.ByCoordinates(x_coords<1>, y_coords<2>);
4. Check Intersections
After creating a Bounding Box using the room rectangle, I used the BoundingBox.Contains node to check if each point intersects with the room. This ensured the furniture was placed within the room, filtering points that fell outside through the List.FilterByBoolMask node. This node's "in" output will give us our list of points inside the room.
5. Position Furniture
Here, the Geometry.Translate node uses our list of points from point 3 as the starting geometry, and we add an x, y, and z translation to move the points to a corner of the cube that comes from our furniture dimensions divided by two.
I then used the Cuboid.ByLengths node to create a cuboid at each point on the filtered and translated grid, effectively creating a grid of cuboids in the room, with the dimensions set by our input sliders.
6. Visualize the Results
We can finally view the result in Dynamo's 3D view. Each cuboid represents a piece of furniture and its potential position within the room.
This process was parametric, meaning you can change the room's or furniture's dimensions and offset, and the grid would automatically update to optimize the furniture placement based on your inputs.
You can download the Dynamo file here. There's much room for improvement and other additions like randomizing desk placement or calculating occupancy percentages.
This basic scenario can be adapted to many other situations and scales, like placing buildings in a city area to optimize density or scattering perforations in a façade according to sunlight. I hope this explains the point.
Adaptive Façade
A real-life algorithm like the adaptive façade of the Al Bahar Towers would require advanced calculations incorporating sunlight data, material properties, and energy efficiency models. This idea goes beyond the scope of a simple example but is achievable using similar concepts.
It would involve geometric transformations and analysis of the sun's path, material properties, and occupancy patterns. While creating the entire script here might be overwhelming, and I'm too lazy, I tried to put together an example of how you might define and alter façade elements based on specific parameters, such as sunlight exposure.
Consider a simplified scenario with a façade composed of a grid of panels. Each panel could adapt to different sunlight exposure levels by changing its rotation angle based on a list of exposure values we give it, approaching this in Python inside Dynamo.
I created this with ChatGPT's help (sorry, my Python is a bit rusty), adding some adjustments. It probably won't work as is, but it's meant to illustrate the point:
import clr
import math
# Import RevitAPI
clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *
# Import DocumentManager and TransactionManager
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
# The input to this node will be stored in the IN variable of this node.
sunlight_exposure = IN[0] # assumed to be a list of exposure values
# Start transaction
doc = DocumentManager.Instance.CurrentDBDocument
TransactionManager.Instance.EnsureInTransaction(doc)
# Get all panels in the current document
collector = FilteredElementCollector(doc)
panels = collector.OfClass(FamilyInstance).OfCategory(BuiltInCategory.OST_CurtainWallPanels).ToElements()
# Loop through all panels and adjust rotation based on sunlight exposure
for i in range(len(panels)):
panel = panels[i]
exposure = sunlight_exposure[i] # Get the exposure value for this panel
# Calculate the new rotation angle based on the exposure (simple linear mapping here)
new_angle = exposure * math.pi / 2 # assuming exposure is a value between 0 and 1
# Get the panel's rotation parameter (assumes you have a Revit family with this parameter set up)
param_rotation = panel.get_Parameter(BuiltInParameter.ROTATION_PARAM)
# Set the panel's rotation to the new angle
param_rotation.Set(new_angle)
# End transaction
TransactionManager.Instance.TransactionTaskDone()
# The output of this node will be stored in the OUT variable.
OUT = 0
An actual implementation might require more sophisticated calculations and considerations. And fewer assumptions (I assumed way too much up there). For instance, we might calculate sunlight exposure from sun path analysis and the panel's orientation. The adjustment rules might consider the current sunlight exposure and the indoor lighting needs, occupancy patterns, energy efficiency, and structural constraints of the façade system.
The point is possibilities in architecture are endless, limited only by our creativity and understanding of the available tools and techniques.
Helping Architectural Innovation
Parametric design represents a paradigm shift in architecture. It marries the logical rigor of mathematics with the creative freedom of design, enabling architects to conceive and create innovative structures that were once impossible. As technologies like AI, machine learning, and 3D printing evolve, they will further expand the boundaries of what we can achieve in architecture.
From realizing architectural masterpieces to contributing to sustainable design practices, this is a testament to how technology can enhance human creativity. By embracing this approach, today's architects can shape our built environment and inspire the next generation of designers to think beyond the conventional and explore more.
Conclusion
As we have seen, parametric design opens up a world of possibilities that are unachievable through traditional design methods. The ability to manipulate complex algorithms and parameters allows architects to create more intricate, personalized, and efficient designs.
However, as with any technology, this is a tool, a means to an end we must use with skill and understanding. Architects must ensure they not only master the technical aspects but also understand the underlying principles that govern good design: human comfort, aesthetic appeal, functionality, and sustainability.
As parametric design continues to revolutionize the architectural landscape, it's not just about making buildings that look different. It's about using the power of algorithms and technology to create environments that live, breathe, and adapt — just like the people who use them.
This article is about Parametric Design. If you want to read more about generative design, I wrote about that here. If you want to learn more about AI-powered design, we have articles about that and other design tech topics in our blog at e-verse.