ACCESS THE COMPLETE LIBRARY OF COURSES & TUTORIALS 
Updated 25 November 2025
Reading time: 19 mins

Combining GMSH and OpenSeesPy for dynamic finite element analysis of floor structures

Part 3 - Generate finite element meshes and perform modal analysis for complex plate geometries with GMSH and OpenSeesPy
[object Object]
by Dr Seán Carroll
Download the complete Jupyter Notebook file for this tutorial.

Download the complete Jupyter Notebook file for this tutorial.

Welcome to the third and final part of our series exploring modal analysis of floors using OpenSeesPy and GMSH. So far, in this series, we’ve covered:

In this final part, we’ll bring these two workflows together and perform a modal analysis on a concrete floor slab, based on a custom mesh. This should be a relatively short tutorial, as we’ve already completed most of the work in parts 1 and 2. Now we just need to tie those two workflows (meshing and modal analysis) together.

The end result will be a Python script (we'll use a Jupyter Notebook for convenience) that can take in the coordinates of vertices defining the shape of a slab, the locations of any openings in the slab and any columns that support the slab and report back:

  • modal frequencies
  • modal masses
  • mode shapes

This will be a useful tool for engineers who need to perform modal analysis on complex floor plate geometries...and all we need are some freely available open-source tools! If you need a more complete introduction (or a refresher) on modal analysis, take a look at my course, Multi-Degree of Freedom Dynamics, Modal Analysis and Seismic Response Simulation in Python.

Multi-Degree of Freedom Dynamics, Modal Analysis and Seismic Response Simulation in Python

Build the knowledge and tools to decode the dynamic response of real-world structures to real-world loads.

After completing this course...

  • You will be able to model the influence of earthquake-induced ground motion.
  • You will develop numerical tools to solve the coupled equations of motion for multi-degree of freedom systems.
  • You will understand the role of modal decomposition in uncoupling the equations of motion and identifying the underlying dynamic characteristics of MDoF systems.
Tutorial breakdown

📍 1.0 Floor slab geometry and meshing

We start by reviewing the case study slab that we’ll be analysing. We’ll define the geometry of the slab, its lift-core openings and column locations. We’ll generate and visualise the mesh using the utility functions we developed in part 2.

📍 2.0 Modal Analysis

The last time we performed modal analysis with OpenSeesPy (in part 1), we were processing a simple rectangular mesh that we procedurally defined. This time, we’re processing the mesh that GMSH has generated. So, we’ll need to slightly modify the code we previously wrote for modal analysis. But the broad strokes will be the same; we’ll extract modal frequencies and mode shapes and then use the mode shape data to calculate modal masses.

📍 3.0 Visualising modal properties

Finally, we’ll build a nice visualisation for the mode shape data. There’s quite a lot we could do in terms of mode shape visualisation, animating them for example would be a great idea. But we’ll stick with static renderings here since this gives us all the information we actually need.

📍 4.0 Review and wrap up

We’ll wrap up by highlighting some additional steps you might like to take to further enhance your analysis pipeline.

📁 Remember to download the complete Jupyter Notebook for this tutorial. It contains all of the code, ready to run.

1.0 Floor slab geometry and meshing

Let’s start by defining the slab that we want to analyse. I’ve mocked up a relatively simple L-shaped slab that contains two openings and 16 columns, Fig 1.

Case-study slab layout | EngineeringSkills.com

Fig 1. Case-study slab showing overall dimensions and layout of openings and columns.

We’ll assume that the openings are for lift or stair-cores that rise through the building, providing lateral stability. As such, we’ll assume that the slab is restrained against both in-plane and out-of-plane translation at the openings.

We will assume that the slab is only restrained against out-of-plane (vertical) translation at the column locations. And we’ll assume the edge of the slab is completely unrestrained (free to move in all directions).

Since we’re assuming a concrete flat slab construction, we can specify the following generic concrete properties:

Engineering Essentials Membership

Engineering tutorials,
written by an engineer — not a model.

Read the rest, download the resources and unlock the full archive. This is independent, human-crafted engineering content. An Essentials Membership gets you access to all member-only tutorials and helps keep the lights on for a learning platform built by engineers, for engineers.

  • The complete archiveAll member-only tutorials in the archive with new expertly researched deep dives added regularly.
  • Full, runnable Python sourceThe complete source for every project, not trimmed snippets. Run it, break it, learn from it.
  • Video walkthroughsWatch video walkthroughs, with the reasoning behind how and why each step was implemented.
  • Made by an engineer, not a modelEvery line is written, tested and debugged by a human. Your membership is what keeps it that way.
Support the work

Essentials Membership

Annual Subscription$7/mobilled $84/year
  • Instant access to the full archive
  • 28-day refund, no questions
  • Cancel anytime
  • Your card and subscription are handled by Stripe

Already a member? Log in

Want all video courses too?
Upgrade to All Access Membership for the complete library of in-depth video courses on top of everything in Essentials.Explore All Access Membership