Skip to main content

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:

http://gmsh.info/

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)

Source distribution for pyvlm 0.0.13
File Size Uploaded Provenance
pyvlm-0.0.13.tar.gz 44.5 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for pyvlm 0.0.13
File Interpreter ABI Platform
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 log

Release 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 log

Security 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.

Select from 2 files

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 log

A 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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page