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:
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7d7343670e885a175cd9d3a419841ea365e72fbfd5ca67cae8ab22a7ff0126e5 |
|
MD5 | a184dacb8df9a4d62d9e16c971cbf5f7 |
|
BLAKE2b-256 | 7f50deb04c09b742e155128c6012397b04b83b305631f1454c3cdf447201e3da |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | adfa4caa3d673d44694c9a441c157777095bf5bc3cc139d3d9b72a57e526a13c |
|
MD5 | e3a079448c6016aee31058910a9021f5 |
|
BLAKE2b-256 | 9c438c4c2bf74ed14bbcdd33cab81fba1c4f8777f0da9fda96a94c9350c61266 |