← Back to CV

Vortex Panel Method

  • Python
  • Panel Methods
  • Aerodynamics
  • CFD

Overview

The Vortex Panel Method (VPM) is a simple aerodynamic tool that is rich enough to capture meaningful flow physics, yet fast enough for design iterations. In this project, I used a 2D axisymmetric VPM to model the flow around a diffuser-augmented wind turbine (DAWT), combining classical potential flow theory with a Joukowsky actuator disk representation of the rotor. The result is a lightweight model that can predict induced velocities and wake development without requiring full CFD.

Why Vortex Panel Method and Model Assumptions

The VPM is based on potential flow theory, which assumes:

  • incompressible flow
  • inviscid flow
  • irrotational flow
  • steady conditions

Instead of solving Navier–Stokes, the geometry is represented using a distribution of panels along its surface, with the panels having attributed vortices. Each vortex influences the surrounding flow (Biot-Savart Law), and the combined effect of all the panels reconstructs the velocity field.

This implementation extends a regular vortex method in two ways:

  1. Axisymmetric formulation (r–x plane)
  2. Coupling with a Joukowsky actuator disk model for the turbine

Instead of applying a simple pressure jump (classic actuator disk), the turbine is modeled as a wake-inducing vortex sheet, which interacts directly with the flow field. This allows the model to capture:

  • diffuser-induced acceleration
  • rotor loading effects
  • wake development

For a detailed explanation of this vortex panel method or other vortex methods in general, visit my PhD thesis (starting page 54) or the references Bontempo and Lewis.

How the Code Works

Step 1 — Geometry & Panel Generation

The geometry (airfoil or diffuser) is discretised into panels using cosine clustering, which increases resolution near leading and trailing edge. Each panel stores:

  • center point
  • length
  • slope
  • curvature

Step 2 — Coefficients Matrix and Solving First Iteration

For each panel pair (i,j), compute how panel j affects panel i. The coefficients go into the K-Matrix. Then, the panel vortex strengths are solved using:

K · γ = rhs

Where:

  • K = aerodynamic interaction matrix
  • γ = panel vortex strengths
  • rhs = freestream boundary condition

With γ solved, you can now compute the flow around the diffuser. It will not include the turbine — just an empty diffuser.

Step 3 — Including the Turbine and Wake

When activated:

  • turbine loading extracts axial momentum
  • a wake sheet is introduced downstream of the blade tip
  • wake vortices modify/induce the velocity field
  • diffuser solution is updated iteratively

Now that we are accounting for the wake vortices and turbine influence, we can compute the flow again. The wake sheet will have a different shape, so we must update our wake vortices and re-compute the induction on the velocity field.

After iterating a few times, the solution converges and you have successfully coupled diffuser, turbine and wake, enabling DAWT modelling.

Integration of the Code on the Browser

In this project, the solver runs entirely in the browser. Pyodide allows a dynamic solver loading, where the Python code is compiled to WebAssembly, loading once and caching the solver. Any new edits to the solver can be instantly implemented without rebuilding the app. For the visualization, the Agg backend was used to render Matplotlib figures as PNG, then displayed in JavaScript.

References

  1. Bontempo, F. et al. — Title to be completed.
  2. Lewis, R. I. — Title to be completed.
  3. Pyodide — Python with the scientific stack, compiled to WebAssembly. https://pyodide.org/
  4. Matplotlib Agg backend — Non-interactive backend for rendering to PNG. Matplotlib Backends Documentation