Computational Structural Engineer

Adnan Almulla

Engineering the intersection of structural analysis, programming, and sustainability. Building digital tools and optimization-driven solutions that enhance both environmental performance and economic viability of structural systems.

Analysis

  • ETABS
  • SAFE
  • Karamba3D
  • Kangaroo

Programming

  • Python
  • C#
  • Grasshopper
  • API Development

BIM

  • Rhino
  • Revit
  • BIM 360

Standards

  • ACI 318-19
  • AISC
  • Eurocode
About

Background & Experience

Driven by a passion for computational design and sustainable engineering solutions.

Current Role

Computational Structural Engineer

Killa Architectural Design • Dubai, UAE

February 2025 – Present

Previous Role

Graduate Engineer

Killa Architectural Design • Dubai, UAE

January 2023 – February 2025

Education

MSc Civil Engineering: Innovative Structural Materials

University of Bath • Distinction

BEng (Hons) Civil and Environmental Engineering

Coventry University • First Class Honours

Achievements

  • • Active member of Institution of Structural Engineers
  • • COP28 UAE panel participant on cement decarbonization
  • • TRADA Design Challenge – 3rd Place (Net-Zero Timber)
Projects

Parametric Models & Structural Optimizations

A selection of computational design projects focused on performance optimization and sustainable structural solutions.

Parametric Design

Parametric Tower Facade System

A Grasshopper-driven parametric model for generating optimized facade panels with integrated structural analysis via Karamba3D. Achieved 25% material reduction through form-finding algorithms.

GrasshopperKaramba3DPythonOptimization
Structural Optimization

Structural Optimization Engine

Custom optimization framework for reinforced concrete elements targeting embodied carbon reduction. Successfully implemented on B+G+46 residential building achieving ~20% carbon decrease.

ETABS APIPythonACI 318-19Sustainability
3D Analysis

Non-Linear FEA Visualization

Real-time visualization tool for non-linear finite element analysis results. Integrates with Kangaroo for physics-based form-finding and structural behavior simulation.

KangarooC#RhinoVisualization
Automation Tool

Deflection Contour Generator

Automated workflow for generating long-term concrete deflection contours and inter-drift displacement charts from ETABS models for design review submissions.

ETABSPythonData ProcessingAutomation
Data Visualization

Modal Analysis Dashboard

Interactive dashboard for visualizing modal periods, participating mass ratios, and dynamic response data extracted from structural analysis models.

PythonVisualizationDynamicsAPI
BIM Integration

Rebar Schedule Optimizer

Intelligent rebar scheduling algorithm that optimizes reinforcement layouts for constructability while minimizing material waste and embodied carbon.

C#Revit APIOptimizationBIM
Code Snippets

Algorithms & Data Structures

Examples of custom implementations for structural engineering workflows, featuring complex data handling and API integrations.

ShearRow.cs
C#
// ShearRow.cs - Custom data structure for shear wall analysis
public class ShearRow
{
    public string WallId { get; set; }
    public double Length { get; set; }
    public double Thickness { get; set; }
    public double ShearForce { get; set; }
    public double ShearCapacity { get; set; }
    
    public double UtilizationRatio => ShearForce / ShearCapacity;
    
    public bool IsAdequate => UtilizationRatio <= 1.0;
}

// Custom tuple return for wall optimization results
public (double OptimalThickness, double CarbonReduction, List<ShearRow> UpdatedWalls) 
    OptimizeShearWalls(List<ShearRow> walls, double targetUtilization = 0.85)
{
    var optimizedWalls = new List<ShearRow>();
    double totalCarbonSaved = 0;
    
    foreach (var wall in walls)
    {
        var optimalThickness = CalculateOptimalThickness(
            wall, targetUtilization);
        
        var carbonDelta = (wall.Thickness - optimalThickness) 
            * wall.Length * CarbonFactor;
        
        totalCarbonSaved += carbonDelta;
        
        optimizedWalls.Add(new ShearRow
        {
            WallId = wall.WallId,
            Length = wall.Length,
            Thickness = optimalThickness,
            ShearForce = wall.ShearForce,
            ShearCapacity = RecalculateCapacity(optimalThickness)
        });
    }
    
    return (optimizedWalls.Average(w => w.Thickness), 
            totalCarbonSaved, 
            optimizedWalls);
}
etabs_processor.py
Python
# etabs_processor.py - ETABS API data extraction
import comtypes.client
from dataclasses import dataclass
from typing import List, Tuple, Dict

@dataclass
class ModalPeriod:
    mode_number: int
    period: float
    mass_participation_x: float
    mass_participation_y: float
    cumulative_mass_x: float
    cumulative_mass_y: float

def extract_modal_data(model_path: str) -> List[ModalPeriod]:
    """Extract modal analysis results from ETABS model."""
    
    etabs = comtypes.client.GetActiveObject("CSI.ETABS.API.ETABSObject")
    sap_model = etabs.SapModel
    
    # Get number of modes
    num_modes = sap_model.Results.Modal.GetModeCount()
    
    modal_results: List[ModalPeriod] = []
    cumulative_x, cumulative_y = 0.0, 0.0
    
    for mode in range(1, num_modes + 1):
        period = sap_model.Results.Modal.GetPeriod(mode)
        mass_x = sap_model.Results.Modal.GetMassParticipation(mode, 'X')
        mass_y = sap_model.Results.Modal.GetMassParticipation(mode, 'Y')
        
        cumulative_x += mass_x
        cumulative_y += mass_y
        
        modal_results.append(ModalPeriod(
            mode_number=mode,
            period=period,
            mass_participation_x=mass_x,
            mass_participation_y=mass_y,
            cumulative_mass_x=cumulative_x,
            cumulative_mass_y=cumulative_y
        ))
    
    return modal_results

def calculate_base_shear(modal_data: List[ModalPeriod], 
                         seismic_weight: float,
                         site_coefficient: float) -> Dict[str, float]:
    """Calculate design base shear per ASCE 7."""
    
    T1 = modal_data[0].period  # Fundamental period
    
    return {
        "fundamental_period": T1,
        "base_shear_x": seismic_weight * site_coefficient / T1,
        "base_shear_y": seismic_weight * site_coefficient / T1
    }
Contact

Get in Touch

Interested in discussing computational structural engineering, optimization workflows, or potential collaborations? Feel free to reach out.

Email

adnan.almulla@outlook.com

LinkedIn

@Adnan-Almulla

Location

Dubai, United Arab Emirates