CFD Simulation in Python: Vortex Shedding off a Steel Chimney

CFD Simulation in Python: Vortex Shedding off a Steel Chimney

CalcTree
October 8, 2026

Free CFD simulation in Python example: lattice-Boltzmann vortex shedding past a chimney, checked against published data. Open a copy in your browser.

CalcTree
October 8, 2026
Need a calc we don't have yet?

Tell us what you need, or sign up and build it yourself in minutes.

Leave your email and we'll tell you when a template for it is ready:

Required
Thank you!

Your request has been received. We will let you know when it is available.

Sign up

Oops! Something went wrong while submitting the form.

Related templates

No items found.

No items found.

About this CFD Vortex Shedding Example

This page is a worked example of a CFD simulation in Python, running in your browser inside a CalcTree calculation page. A lattice-Boltzmann solver resolves the von Kármán vortex street behind a circular steel chimney and measures the shedding frequency as a Strouhal number. Next to the result, the page compares that number with the published value for a circular cylinder, then carries it through the chimney's natural frequency and the EN 1991-1-4 Annex E screen for vortex-induced vibration.

  • Structural or wind engineer: see how vortex shedding, natural frequency and the Annex E screen connect on one page, and adapt the example to your own stack or mast.
  • Engineer exploring Python in calculations: see a complete CFD solver, its animated output and its benchmark check living in one calculation page.
  • Graduate engineer learning CFD: read a lattice-Boltzmann solver in a few dozen lines of NumPy, change the inputs and watch the vortex street respond.

It is an example of what a CalcTree page can do, built with CalcTree AI, not a design method to rely on as is. The model is idealised and its limits are stated on the page. Duplicate it into your own workspace to change the inputs, read the Python, or use it as the starting point for your own analysis, and verify anything you take into a real design.

More info on CFD Vortex Shedding

Inputs

You set the chimney height, diameter, wall thickness and lining mass, the steel properties, the mean wind speed at the shedding zone, air density and the force coefficient. The CFD settings control the simulation Reynolds number, grid resolution and run length, and the chart settings control the animation frames, streamline density and colour map. A design sketch of the chimney, the wind and the base reactions redraws from these inputs.

The CFD method

The solver uses the lattice-Boltzmann method on a D2Q9 lattice. Each cell carries nine particle populations that collide towards a local equilibrium and then stream to their neighbours. Over many steps this local rule reproduces viscous, incompressible flow, and a bounce-back rule on the chimney gives a no-slip wall. The code sits in a Python node on the page, so you can read it, change it and rerun it.

Checking the simulation

The Strouhal number comes from the transverse velocity in the wake, measured from the mean period between zero crossings and confirmed by the spectrum. The page compares it with the published laminar Strouhal and Reynolds relation for a circular cylinder, flags whether it agrees within tolerance, and states the Reynolds range where the method has been validated.

Vortex-induced vibration screen

The chimney's first natural frequency comes from its shell section and mass as a uniform cantilever. The critical wind speed follows from the natural frequency, the diameter and the design Strouhal number, taken as the larger of the code value and the simulated one. The page then applies the EN 1991-1-4 Annex E criterion for when vortex shedding can be ignored, and tells you what to do next if it cannot.

Python libraries used

NumPy holds the nine particle populations on the lattice and runs the collide and stream steps as whole-array operations. Matplotlib draws the design sketch, the flow speed and streamlines, the wake spectrum and the animated vortex street.

Common Calculation Errors to Avoid

  • Reading drag off a low Reynolds number simulation: a laminar two-dimensional run is valid for the shedding frequency, not for the full-scale drag or cross-wind force on a real chimney.
  • Measuring before the wake settles: the first cycles after start-up are not periodic, so record the wake signal only once shedding is established.
  • An unstable lattice: a relaxation time too close to one half or a high lattice Mach number gives a run that diverges or looks plausible and is wrong.
  • Leaving out non-structural mass: linings, ladders and platforms lower the natural frequency, and with it the critical wind speed.
  • Using the wrong wind speed: the screen needs the mean wind speed where shedding occurs, usually over the top third of the stack, not a peak gust speed.
  • Taking the lower Strouhal number: a larger Strouhal number gives a lower critical wind speed, so the conservative choice is the larger value.
Explore the wide range of resources available
200+

Engineering templates

50+

Common calculators

20+

Design guides

Ready to try?
Streamline your engineering workflows today!
Join engineers from top firms who've signed up
AECOM
ARCADIS
Jacobs
MOTT MACDONALD

FAQs

Can I run a CFD simulation in Python without ANSYS or OpenFOAM?

Yes, for problems like this one. A lattice-Boltzmann solver for two-dimensional flow past a body fits in a few dozen lines of numpy and runs in a browser in seconds. It will not replace a full CFD package for turbulent three-dimensional flow, but it answers a well-posed question such as the shedding frequency of a circular section.

Why use the lattice-Boltzmann method?

Every step is local: populations collide in their own cell and stream to the next. That makes the solver short, easy to read and fast in vectorised Python, and it handles a body in the flow with a simple bounce-back rule rather than a body-fitted mesh.

Does a simulation at a Reynolds number of around 150 apply to a real chimney?

For the Strouhal number, broadly yes. For a circular section it stays close to the same value across a very wide range of Reynolds number, which is why codes give a single design value. The drag and the cross-wind force do not transfer, and the page takes neither from the simulation.

What Strouhal number does EN 1991-1-4 use for a circular section?

Table E.1 of EN 1991-1-4 gives 0.18 for circular cross-sections. The page uses the larger of that value and the simulated one, because a larger Strouhal number gives a lower, more critical wind speed.

What do I do if the vortex shedding screen fails?

Calculate the cross-wind amplitude to EN 1991-1-4 E.1.5. If the amplitude is too large, the usual fixes are helical strakes on the top of the stack, more damping such as a tuned mass damper, or a stiffer shell.

Can I change the chimney and rerun the simulation?

Yes. It is an example to build on: duplicate the page into your workspace, then change the geometry, the wind, the simulation settings or the Python itself. The sketch, frequency, loads, flow field and checks all update together.

Related templates

Turn your documents into calcs like this one

Upload your documents and project files, then let AI generate and review calcs grounded in your context, not guesswork.