Skip to main content

Vortex Lattice Method in Python

Project description

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyvlm-0.0.11.tar.gz (39.2 kB view details)

Uploaded Source

Built Distribution

pyvlm-0.0.11-py3-none-any.whl (45.7 kB view details)

Uploaded Python 3

File details

Details for the file pyvlm-0.0.11.tar.gz.

File metadata

  • Download URL: pyvlm-0.0.11.tar.gz
  • Upload date:
  • Size: 39.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.4

File hashes

Hashes for pyvlm-0.0.11.tar.gz
Algorithm Hash digest
SHA256 7d7343670e885a175cd9d3a419841ea365e72fbfd5ca67cae8ab22a7ff0126e5
MD5 a184dacb8df9a4d62d9e16c971cbf5f7
BLAKE2b-256 7f50deb04c09b742e155128c6012397b04b83b305631f1454c3cdf447201e3da

See more details on using hashes here.

File details

Details for the file pyvlm-0.0.11-py3-none-any.whl.

File metadata

  • Download URL: pyvlm-0.0.11-py3-none-any.whl
  • Upload date:
  • Size: 45.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.4

File hashes

Hashes for pyvlm-0.0.11-py3-none-any.whl
Algorithm Hash digest
SHA256 adfa4caa3d673d44694c9a441c157777095bf5bc3cc139d3d9b72a57e526a13c
MD5 e3a079448c6016aee31058910a9021f5
BLAKE2b-256 9c438c4c2bf74ed14bbcdd33cab81fba1c4f8777f0da9fda96a94c9350c61266

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page