pyvlm
A Vortex Lattice Method implemented in Python for use from terminal or from within Python.
Installation:
pip install pyvlm
Terminal Usage:
pyvlm aircraft.json
The above command generates a "aircraft.md" file containing results.
JSON Definition File:
{
"name": "Test Aircraft",
"mach": 0.0,
"sref": 1.358,
"cref": 0.31,
"bref": 4.5,
"xref": 1.175,
"yref": 0.0,
"zref": 0.0,
"surfaces": [
{
"name": "Wing",
"angle": 0.0,
"mirror": true,
"numc": 8,
"cspace": "cosine",
"xpos": 0.875,
"ypos": 0.0,
"zpos": 0.15,
"sections": [
{
"xpos": 0.0,
"ypos": 0.0,
"zpos": 0.0,
"chord": 0.35,
"angle": 0.0,
"numb": 3,
"bspace": "equal",
"airfoil": "NACA 2412",
"noload": true
},
{
"xpos": null,
"ypos": 0.21,
"zpos": null,
"chord": 0.35,
"angle": 0.0,
"numb": 5,
"bspace": "semi-cosine",
"airfoil": "NACA 2412"
},
{
"xpos": null,
"ypos": 0.8,
"zpos": null,
"chord": null,
"angle": null,
"numb": 20,
"bspace": "semi-cosine",
"airfoil": "NACA 2412"
},
{
"xpos": null,
"ypos": 1.8,
"zpos": null,
"chord": null,
"angle": null,
"numb": 15,
"bspace": "cosine",
"airfoil": "NACA 2412",
"controls": {
"aileron": {
"xhinge": 0.8,
"posgain": 1.0,
"neggain": 0.8,
"reverse": true,
"hvec": {"x": 0.0, "y": 0.0, "z": 0.0}
}
}
},
{
"xpos": 0.3,
"ypos": 2.25,
"zpos": 0.0,
"chord": 0.2,
"angle": -1.5
}
]
},
{
"name": "Horizontal Tail",
"mirror": true,
"numc": 8,
"cspace": "cosine",
"xpos": 2.3,
"ypos": 0.0,
"zpos": 0.1,
"angle": -1.8,
"sections": [
{
"xpos": 0.0,
"ypos": 0.0,
"zpos": 0.0,
"chord": 0.22,
"numb": 25,
"bspace": "cosine",
"controls": {
"elevator": {
"xhinge": 0.7,
"posgain": 1.0,
"neggain": 1.0,
"reverse": false,
"hvec": {"x": 0.0, "y": 0.0, "z": 0.0}
}
}
},
{
"xpos": 0.1,
"ypos": 0.7,
"zpos": 0.0,
"chord": 0.18
}
]
},
{
"name": "Vertical Tail",
"angle": 0.0,
"numc": 5,
"cspace": "cosine",
"xpos": 2.3,
"ypos": 0.0,
"zpos": 0.1,
"sections": [
{
"xpos": 0.0,
"ypos": 0.0,
"zpos": 0.0,
"chord": 0.25,
"angle": 0.0,
"numb": 15,
"bspace": "cosine"
},
{
"xpos": 0.1,
"ypos": 0.0,
"zpos": 0.4,
"chord": 0.15,
"angle": 0.0
}
]
}
],
"cases": [
{
"name": "Positive 1g Cruise",
"trim": "Looping Trim",
"density": 0.945,
"speed": 25.0,
"mass": 20.0,
"load factor": 1.0
},
{
"name": "Positive 5g Dive",
"trim": "Looping Trim",
"density": 0.945,
"speed": 50.0,
"mass": 20.0,
"load factor": 5.0
},
{
"name": "Negative 3g Dive",
"trim": "Looping Trim",
"density": 0.945,
"speed": 50.0,
"mass": 20.0,
"load factor": -3.0
},
{
"name": "60deg Banked Turn Cruise",
"trim": "Turning Trim",
"density": 0.945,
"speed": 25.0,
"mass": 20.0,
"bank angle": 60.0
},
{
"name": "Positive 1g Cruise + 15deg Side Slip",
"inherit": "Positive 1g Cruise",
"beta": 15.0
},
{
"name": "Positive 1g Cruise + 15deg Elevator",
"inherit": "Positive 1g Cruise",
"elevator": 15.0
},
{
"name": "Positive 1g Cruise - 15deg Elevator",
"inherit": "Positive 1g Cruise",
"elevator": -15.0
}
]
}
Typical Python Script File "aircraft.py":
#%%
# Import Dependencies
from IPython.display import display_markdown
from pyvlm import LatticeSystem
from pyvlm.outputs.msh import latticeresult_to_msh
from pyvlm.outputs.prf import latticeresult_to_prf
#%%
# Import Geometry
jsonfilepath = '../files/Aircraft.json'
lsys = LatticeSystem.from_json(jsonfilepath)
#%%
# Display System
display_markdown(lsys)
#%%
# Display Results
for case in lsys.results:
lres = lsys.results[case]
display_markdown(lres)
#%%
# Mesh File Output
lres = lsys.results['Positive 1g Cruise + 15deg Side Slip']
latticeresult_to_msh(lres, '../results/Aircraft.msh')
#%%
# Pessure File Output
latticeresult_to_prf(lsys, '../results/Aircraft_pressures.json')
#%%
# 5g Trim Case
ltrm = lsys.results['Positive 5g Dive']
#%%
# Plot Lift Distribution
axl = ltrm.plot_trefftz_lift_force_distribution()
#%%
# Plot Y Force Distribution
axy = ltrm.plot_trefftz_side_force_distribution()
#%%
# Print Strip Forces
display_markdown(ltrm.strip_forces)
#%%
# Print Strip Coefficients
display_markdown(ltrm.strip_coefficients)
#%%
# Print Panel Forces
display_markdown(ltrm.panel_forces)
#%%
# Print Total Loads
display_markdown(ltrm.surface_loads)
Mesh File Output:
You can generate a Gmsh mesh file (*.msh) directly from a Python script using the following code snippet.
lres = lsys.results['Positive 1g Cruise + 15deg Side Slip']
latticeresult_to_msh(lres, '../results/Aircraft.msh')
This will output a mesh file to the specified location, which can then be viewed in Gmsh. The latest version of Gmsh can be downloaded at:
Use File > Open in Gmsh to open the mesh file with the pressure results.
A sample of the aircraft shown in Gmsh is captured below. Consult Gmsh help to operate Gmsh.
Metadata
Release files for pyvlm 0.0.13
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| pyvlm-0.0.13.tar.gz | 44.5 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pyvlm-0.0.13-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 95.7 kB
Release files / pyvlm-0.0.13.tar.gz
| Download URL | pyvlm-0.0.13.tar.gz |
|---|---|
| Size | 44.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f25aa21f4cca22643d68f8e8bc03d31413da94ffc2450d813461512816ef7c21
|
|
BLAKE2b-256 checksum How to use checksums |
5a655cf678185fa967ba6a8c1b647e6e66d6ba691b521ce1361b668a008efb7d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logRelease files / pyvlm-0.0.13-py3-none-any.whl
| Download URL | pyvlm-0.0.13-py3-none-any.whl |
|---|---|
| Size | 51.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
38a5f8f09160e732c5fbb005002efe30c07f824f61963fbd6cd9a4b6e3d90f14
|
|
BLAKE2b-256 checksum How to use checksums |
fb3c38e72f4b48e3f19cff564369f1dfcc094659f03cf7f266cff9ab9cf77233
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logSecurity for pyvlm 0.0.13
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for pyvlm-0.0.13.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.