Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
9befe44
Bump version to 3.0.0 in PyAero
chiefenne Dec 14, 2024
f00ba2f
Remove unused HtmlView class and its dependencies
chiefenne Dec 14, 2024
e37caa6
Remove unused toggleTestObjects method from Slots class
chiefenne Dec 19, 2024
945ac81
Remove unused shortcut for toggling test objects in MainWindow
chiefenne Dec 19, 2024
aa676cb
Remove unused files because of refactoring the whole codebase
chiefenne Dec 22, 2024
5e65c61
Update documentation to remove outdated references and correct variab…
chiefenne Dec 28, 2024
3f48947
Update README to remove outdated meshio reference and correct shell c…
chiefenne Dec 28, 2024
9e1289b
Add initial configuration file for PyAero settings
chiefenne Dec 28, 2024
7d0a6b8
Remove obsolete configuration file for PyAero settings
chiefenne Dec 28, 2024
ed1b316
Add initial configuration file for PyAero settings
chiefenne Dec 28, 2024
4a4f0ac
rearrange folder structure
chiefenne Dec 31, 2024
baf9e4c
rearrange folder structure
chiefenne Dec 31, 2024
af01a10
Remove aerodynamics_panel.rst documentation file
chiefenne Dec 31, 2024
cdfd53e
Update documentation to remove outdated references to AeroPython pane…
chiefenne Dec 31, 2024
f62503c
Refactor config.ini to streamline paths and remove unused icon settings
chiefenne Dec 31, 2024
8df1917
rearrange folder structure
chiefenne Dec 31, 2024
e8de78a
refactor settings and mainwindows access
chiefenne Dec 31, 2024
476f7f0
remove files as not used anymore
chiefenne Dec 31, 2024
6d2026b
split utils and mathutils
chiefenne Dec 31, 2024
ffddb8e
Refactor RubberBand class to use main window's RUBBERBAND_MIN constant
chiefenne Dec 31, 2024
ef29612
Add import for VectorUtils from MathUtils in Meshing.py
chiefenne Dec 31, 2024
afabbe5
Major refactoring of the GUI, look and feel and code quality and cons…
chiefenne Mar 25, 2026
b4a0e91
continued refactoring for v3
chiefenne Mar 26, 2026
69f02bc
Continued major refactoring
chiefenne Mar 30, 2026
26bf5b8
Continued major refactoring
chiefenne Mar 31, 2026
9d3c8f9
Continued major refactoring
chiefenne Mar 31, 2026
650e3a2
Continued major refactoring
chiefenne Apr 1, 2026
0284da9
Continued major refactoring
chiefenne Apr 1, 2026
fdc8f39
Continued major refactoring
chiefenne Apr 1, 2026
3e8f99f
Continued major refactoring
chiefenne Apr 1, 2026
e00bd39
Continued major refactoring
chiefenne Apr 1, 2026
11fb9c2
Continued major refactoring
chiefenne Apr 2, 2026
26ac243
Continued major refactoring
chiefenne Apr 2, 2026
cd63d3b
Continued major refactoring
chiefenne Apr 2, 2026
3852d84
Continued major refactoring
chiefenne Apr 2, 2026
37bba7c
Refine documentation language for clarity in index.rst and ui_GUI.rst
chiefenne Apr 2, 2026
2e3045a
Continued major refactoring
chiefenne Apr 3, 2026
68ce592
Add design spec for robust medial-axis camberline tracing
chiefenne Aug 21, 2026
8b6ae89
Replace fragile per-station inscribed-circle solver with medial-axis …
chiefenne Aug 21, 2026
4d83166
Make the medial-axis tracer the sole, default camber method
chiefenne Aug 22, 2026
d2a4057
Add design spec for the structured grid-generation framework
chiefenne Aug 22, 2026
9da8055
Add StructuredCore: frame dataclasses, TE detection, distributions
chiefenne Aug 22, 2026
e13c96f
Add StructuredTopologies: O/C frames, both tunnels, sharp and blunt TE
chiefenne Aug 22, 2026
9a5c2df
Add GridTFI: vectorized standard and Hermite transfinite interpolation
chiefenne Aug 22, 2026
93e96cc
Add OrthoLayers: exact-normal near-wall block with corner blend and t…
chiefenne Aug 22, 2026
abafba5
Add StructuredEngine and wire structured engine into Windtunnel
chiefenne Aug 22, 2026
02d0f1a
Add Structured engine GUI group and settings assembly
chiefenne Aug 22, 2026
b8a0648
Record phase-1 plan execution: all tasks done, deviations noted
chiefenne Aug 22, 2026
21fb007
Curve the O-grid seam along the TE bisector to prevent folds at cambe…
chiefenne Aug 22, 2026
6da2107
Spec: add mesh-smoother stage and sharp/blunt trailing-edge handling
chiefenne Aug 22, 2026
ac5cd15
Add metric-based quad pipeline modules and continue meshing refactor
chiefenne Aug 24, 2026
6caa727
Rebuild meshing panel around metric engine and wire in structured engine
chiefenne Aug 24, 2026
876c534
Make test suite self-contained: track airfoil data under tests/data
chiefenne Aug 24, 2026
5f8b5a6
Add GridElliptic: Winslow/TM elliptic solver with periodic seam and o…
chiefenne Aug 25, 2026
5eafef4
Wire elliptic algorithm into structured engine and GUI
chiefenne Aug 25, 2026
91f9d38
Add GridHyperbolic: adaptive front marching with metric-aware smoothing
chiefenne Aug 25, 2026
65def52
Add implementation plan for structured grid phases 2, 3, 5
chiefenne Sep 5, 2026
742637b
Wire hyperbolic algorithm into structured engine and GUI
chiefenne Sep 5, 2026
feb3a9d
Add GridSmoothers: constrained Laplacian, elliptic, and angle-based s…
chiefenne Sep 5, 2026
14962c6
Wire post-smoothing stage into structured engine and GUI
chiefenne Sep 5, 2026
9f829be
Record phases 2, 3, 5 delivery in spec and plan
chiefenne Sep 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 3 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,13 @@ data/LOGS/
docs/*.pptx
*.txt
lib_AE/
boundary_layer_code/
PyInstaller/
setup.py
.vscode/
src/__pycache__/
__pycache__/
SU2/
todo.txt
environment.yml
launch.json
requirements.txt
requirements.txt
6 changes: 3 additions & 3 deletions .readthedocs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,6 @@ formats:

# We recommend specifying your dependencies to enable reproducible builds:
# https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
# python:
# install:
# - requirements: docs/requirements.txt
python:
install:
- requirements: docs/requirements.txt
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
The MIT License (MIT)

Copyright (c) 2024 Andreas Ennemoser
Copyright (c) 2026 Andreas Ennemoser

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

Expand Down
232 changes: 60 additions & 172 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,211 +1,99 @@

# PyAero
![](docs/images/SD7003_velocity_AOA6.png)
PyAero generated mesh (Solver: [SU2](https://su2code.github.io), Visualization: [ParaView](https://www.paraview.org/))
<br>

![PyAero generated mesh](docs/images/SD7003_velocity_AOA6.png)

[![readthedocs](https://img.shields.io/badge/docs-latest-brightgreen.svg?style=flat)](https://pyaero.readthedocs.io/en/latest/?badge=latest)
[![GitHub](https://img.shields.io/github/license/mashape/apistatus.svg)](https://en.wikipedia.org/wiki/MIT_License)

PyAero is an open-source desktop tool for airfoil contour preparation, contour analysis, and 2D block-structured CFD mesh generation. It focuses on the workflow that typically happens before a solver run: cleaning up geometry, refining point distributions, creating a practical trailing edge, building a structured wind-tunnel mesh, and exporting the result in solver-friendly formats.

PyAero is an open-source airfoil contour analysis and CFD meshing tool written in Python. The graphical user interface is based on [Qt for Python](https://www.qt.io/qt-for-python) (Pyside6).

## Features

- Load and display airfoil contour files
- Airfoil splining and refining
- Get a smooth contour and sufficient contour points
- Refine leading edge and trailing edge
- Prepare contour for meshing
- Automatic calculation of leading edge radius
- Point distribution on spline used as mesh distribution around airfoil
- Automatic generation of block-strcuctured mesh
- Single element C-type mesh
- **Strictly orthogonal** mesh in the vicinity of the airfoil
- Mesh resolution control for airfoil, leading edge, trailing edge and windtunnel
- Sharp or blunt trailing edges
- Mesh smoothing (to be improved)
- Mesh export
- [AVL FIRE](https://www.avl.com/fire) (.flma)
- Some other file formats are exported as well (only listed formats)
- [SU2](https://su2code.github.io) (.su2)
- Including boundary markers
- [GMSH](http://gmsh.info) (.msh)
- [VTK](https://vtk.org) (.vtk)

- Automatic definition of boundary elements (edges, faces)
- Airfoil, inlet, outlet, symmetry
- Run in batch mode (i.e. run PyAero from the command line)
- Mesh multiple airfoils and export the meshes in multiple formats in one run without user interaction
- Using the ``-no-gui`` option and a [control file](data/Batch/batch_control.json) in json format
- Example command: ``python src/PyAero.py -no-gui data/Batch/batch_control.json``
- Simple aerodynamic analysis using [AeroPython](http://nbviewer.ipython.org/github/barbagroup/AeroPython/blob/master/lessons/11_Lesson11_vortexSourcePanelMethod.ipynb)
- Airfoil contour analysis (gradient, curvature and curvature circle)
- NOT YET IMPLEMENTED:
- Decent smoothing algorithm for the mesh regions outside the orthogonal blocks
- Advanced aerodynamic analysis (i.e. linking to open source CFD software, e.g. SU2)

## Header image
- Airfoil SD7003
- Meshing with PyAero
- Calculation with the CFD code [SU2](https://su2code.github.io)
- Post-processing done in [ParaView](https://www.paraview.org/)

## Sample screenshots

![](docs/images/gui_airfoil1_new.png)
**PyAero GUI at a glance**
<br><br>

![](docs/images/mesh_RAE2822_MAC.png)
**Example mesh around RAE2822 airfoil**
<br><br>

![](docs/images/LE_mesh_RAE2822_MAC.png)
**Example mesh around RAE2822 airfoil - Leading Edge**
<br><br>

![](docs/images/TE_mesh_RAE2822_MAC.png)
**Example mesh around RAE2822 airfoil with a blunt Trailing Edge (with finite thickness)**
<br><br>

![](docs/images/TE_mesh_sharp_MAC.png)
**Example mesh with a sharp Trailing Edge**
<br><br>

![](docs/images/MAKAROV_KPS_mesh_MAC.png)
**Example mesh around MAKAROV KPS airfoil as used in the CFD code AVL-FIRE**
<br><br>

![](docs/images/MAKAROV_KPS_Veloyity.gif)
**Velocity field (RE=50000) around MAKAROV KPS airfoil using the CFD code AVL-FIRE**
<br><br>

![](docs/images/MAKAROV_KPS_TKE.gif)
**Turbulence kinetic energy field (RE=50000) around MAKAROV KPS airfoil using the CFD code AVL-FIRE**
<br><br>

![](docs/movies/RG14_3D_laminar_Iso-Q_pressure.gif)
**Unsteady 3D calculation of the RG14 airfoil using the CFD code AVL-FIRE**
<br>
**RE=330000, AOA=2°, 20 million cells.**
<br>
**Laminar calculation: CD=0.0079, CL=0.371**
<br>
**LES calculation (subgrid scale model: Kobayashi CSM): CD=0.0078, CL=0.362**
<br><br>

![](docs/images/SD7003_CP_RE200000_AOA3.png)
**Steady 2D calculation of the SD7003 airfoil using the CFD code SU2 (RE=200000, AOA=3), post-processing with ParaView**
<br><br>

## Documentation

The PyAero documentation can be found at the following link:

**[http://pyaero.readthedocs.io](http://pyaero.readthedocs.io)**

The documentation is automatically generated using the markdown files in the [docs](https://github.com/chiefenne/PyAero/tree/master/docs) folder via [Sphinx](http://www.sphinx-doc.org/en/stable/index.html).

## Dependencies
The current application is built with Python and PySide6 and ships with a redesigned workflow-oriented user interface. PyAero does not solve the CFD case itself; it prepares geometry and meshes for downstream tools such as SU2, Gmsh, ParaView, or AVL FIRE workflows.

- [Python 3.x](https://www.python.org/)
- [Qt for Python (PySide6)](https://www.qt.io/qt-for-python)
- [Numpy](http://www.numpy.org/)
- [Scipy](https://www.scipy.org/)
- [meshio](https://github.com/nschloe/meshio)
## Highlights

At the moment no binary is available for Windows.
- Workflow sidebar with airfoil library, geometry prep, meshing, contour analysis, and CFD helper tools
- Bundled and local airfoil library with search, import, and quick loading
- Geometry preparation with CST and legacy B-spline modes
- Recursive leading-edge refinement plus dedicated trailing-edge segment refinement
- Optional finite-thickness trailing edge with independent upper and lower blending controls
- Derived geometry outputs including prepared contour, camber line, and CST parameters
- 2D block-structured C-type wind-tunnel mesh generation with dedicated airfoil, trailing-edge, tunnel, and wake blocks
- Simple, elliptic, and angle-based smoothing options, including protected tunnel guide controls
- Mesh export to `FLMA`, `SU2`, `Gmsh`, and `VTU`
- Batch mode for generating and exporting meshes without the GUI
- Registry-driven menus, toolbars, and keyboard shortcuts, including a shortcut editor

## Download
The $ symbol at the beginning the following command examples represents the prompt at command shell. It is not part of the command.
## Typical Workflow

### Option 1: Download source version using Git:

```bash
$ cd anywhere_on_your_computer
$ git clone https://github.com/chiefenne/PyAero.git
```
or if you want a specific branch (e.g. develop):

```bash
$ git clone https://github.com/chiefenne/PyAero.git -b develop
```
1. Load an airfoil from the bundled library, local library, or an external `.dat` or `.txt` file.
2. Prepare the contour with CST or legacy B-spline refinement.
3. Optionally add a finite-thickness trailing edge.
4. Generate the structured tunnel mesh.
5. Export the mesh in one or more formats.

## Current Interface

### Option 2: Download source version as a ZIP file:
[![PyAero interface overview](docs/images/ui_overview_main.png)](docs/images/ui_overview_main.png)

From the [PyAero GitHub repository](https://github.com/chiefenne/PyAero). There is on the upper right side a green pull down menu ***Clone or download***. Click on it and then click ***Download ZIP***. You get a file ***PyAero-master.zip*** which you store anywhere on your computer.

```bash
$ cd anywhere_on_your_computer
$ unzip PyAero-master.zip
```
The application now centers around a workflow sidebar on the left and a workspace on the right. Geometry preparation, mesh generation, export, contour analysis, and CFD helper tools are grouped into dedicated pages so the main path from raw airfoil to exported mesh is easier to follow.

## Installation

After cloning from Git, or downloading and unzipping, set the environment variable for the PyAero installation path.

### Linux

If your shell is **bash**:
```bash
$ export PYAEROPATH=path_to_your_installation
```
PyAero currently runs from the source tree. Start it from the repository root so the application can resolve its bundled resources.

And if you want to set it permanently across sessions (one of the following):
```bash
$ echo 'export PYAEROPATH=path_to_your_installation' >> ~/.bashrc
$ echo 'export PYAEROPATH=path_to_your_installation' >> ~/.bash_profile
git clone https://github.com/chiefenne/PyAero.git
cd PyAero
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python src/PyAero.py
```

For **csh** or **tcsh** use:
```bash
$ setenv PYAEROPATH path_to_your_installation
```
For batch mode:

And if you want to set it permanently across sessions:
```bash
$ echo 'setenv PYAEROPATH path_to_your_installation' >> ~/.cshrc
python src/PyAero.py -no-gui data/Batch/batch_control.json
```

Run PyAero using:
## Runtime Dependencies

```bash
$ python $PYAEROPATH/src/PyAero.py
```
- Python 3
- PySide6
- NumPy
- SciPy

To simplify the command, set an *alias* (the upper beeing for bash and the lower for csh/tcsh).
`meshio` is no longer part of the active runtime dependency set.

```bash
$ alias pyaero="python $PYAEROPATH/src/PyAero.py"
$ alias pyaero "python $PYAEROPATH/src/PyAero.py"
```
## Documentation

To keep this across sessions, again append the *alias* command to the respective *.bashrc*, *.cshrc*, etc.
The documentation lives in [docs/](docs) and is published at:

Then start PyAero using:
<https://pyaero.readthedocs.io>

```bash
$ pyaero
```
The refreshed docs cover:

## Qt for Python version
- the redesigned interface
- airfoil library usage
- geometry preparation and CST workflows
- meshing and export
- contour analysis
- CFD input helpers
- settings, shortcuts, and UI customization
- batch processing

PyAero version based on the [Qt for Python](https://www.qt.io/qt-for-python) API (alias PySide2 for QT5 or PySide6 for QT6).
## Project Scope

PyAero started based on the PyQt4 framework which for me was the API to go at the time when I started development.
PyAero is currently focused on:

After a small creative break I decided to upgrade to PyQt5 and continue development. I soon realized that the PyQt5 documentation lacks information, i.e. there were only links to the Qt C++ documentation and no Python related docs, I had the feeling that the PyQt5 development probably stagnates.
- 2D airfoil contour preparation
- 2D structured mesh generation
- mesh export for external CFD workflows

Short online research revealed to me that meanwhile Qt themselves are developing now **Qt for Python** which is based on the legacy Pyside API. This made me think that it is possibly best to go with Qt for Python as it is tightly coupled to Qt.
PyAero is not a full CFD solver, and mesh import remains future-facing compared with the export path.

## License

Distributed under the MIT license. See [LICENSE](https://raw.githubusercontent.com/chiefenne/PyAero/master/LICENSE) for more information.

2024 Andreas Ennemoser – andreas.ennemoser@aon.at

## Stargazers over time
Distributed under the MIT license. See [LICENSE](LICENSE).

[![Stargazers over time](https://starchart.cc/chiefenne/PyAero.svg?variant=adaptive)](https://starchart.cc/chiefenne/PyAero)
2026 Andreas Ennemoser - andreas.ennemoser@aon.at
42 changes: 42 additions & 0 deletions config/config.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
; ****************
; PyAero Settings
; ****************

[Paths]
DATA_DIR = data
AIRFOILS = ${DATA_DIR}/Airfoils
OUTPUT = ${DATA_DIR}/OUTPUT
LOGS = ${DATA_DIR}/LOGS

[Application]
EXIT_ON_ESCAPE = True
DEFAULT_AIRFOIL = ${Paths:AIRFOILS}/F1K/hn1033a.dat
DECIMAL_SEPARATOR = .

[Window]
WINDOW_STARTUP_MODE = maximized
WINDOW_PRESET_1 = 120, 80, 1800, 1200
WINDOW_PRESET_2 = 140, 90, 1600, 1000
WINDOW_PRESET_3 = 160, 100, 2200, 1400

[Graphics]
MARKER_SIZE = 3
ZOOM_ANCHOR = mouse
VIEW_STYLE = solid
MIN_ZOOM = 10.0
MAX_ZOOM = 120000.0
RUBBERBAND_MIN = 0.08
SCALE_INCREMENT = 1.1
ZOOM_DIRECTION = -1

[Magnifier]
MAGNIFIER_SIZE = 360
MAGNIFIER_MAGNIFICATION = 2.0
MAGNIFIER_OUTLINE_WIDTH = 2.0

[Dialogs]
DIALOG_FILTER = Airfoil contour files (*.dat *.txt)
FILE_FILTER = *.dat, *.txt

[Logging]
LOGCOLOR = rgb(255, 0, 255)
11 changes: 11 additions & 0 deletions config/shortcuts_user.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"version": 1,
"all": {},
"windows": {},
"macos": {
"file.open": [
"Ctrl+D"
]
},
"linux": {}
}
4 changes: 2 additions & 2 deletions data/Batch/batch_control.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"path": "data/OUTPUT",
"formats": [
"SU2",
"VTK"
"VTU"
]
},
"Airfoil contour refinement": {
Expand Down Expand Up @@ -57,4 +57,4 @@
"Cell thickness ratio": 15.0,
"Equalize vertical wake line at" : 30.0
}
}
}
Loading