Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix customprofile and add tutorial on it #100

Merged
merged 6 commits into from
Sep 15, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions bladex/__init__.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
"""
BladeX init
"""
__all__ = ['profilebase', 'nacaprofile', 'customprofile', 'reversepropeller', 'blade', 'shaft', 'propeller', 'deform', 'params', 'ndinterpolator']
__all__ = ['ProfileInterface', 'NacaProfile', 'CustomProfile',
'ReversePropeller', 'Blade', 'Shaft', 'Propeller', 'Deformation',
'ParamFile', 'RBF', 'reconstruct_f', 'scipy_bspline']

from .meta import *
from .profilebase import ProfileBase
from .nacaprofile import NacaProfile
from .customprofile import CustomProfile
from .profile import ProfileInterface
from .profile import NacaProfile
from .profile import CustomProfile
from .blade import Blade
from .shaft import Shaft
from .propeller import Propeller
from .deform import Deformation
from .params import ParamFile
from .ndinterpolator import RBF, reconstruct_f, scipy_bspline
from .ndinterpolator import RBF, reconstruct_f, scipy_bspline
from .reversepropeller import ReversePropeller
4 changes: 2 additions & 2 deletions bladex/blade.py
Original file line number Diff line number Diff line change
Expand Up @@ -479,7 +479,7 @@ def plot(self, elev=None, azim=None, ax=None, outfile=None):
>>> blade_2.rotate(rot_angle_deg=72)
>>> fig = plt.figure()
>>> ax = fig.gca(projection=Axes3D.name)
>>> ax = fig.add_subplot(projection='3d')
>>> blade_1.plot(ax=ax)
>>> blade_2.plot(ax=ax)
Expand All @@ -504,7 +504,7 @@ def plot(self, elev=None, azim=None, ax=None, outfile=None):
ax = ax
else:
fig = plt.figure()
ax = fig.gca(projection=Axes3D.name)
ax = fig.add_subplot(projection='3d')
ax.set_aspect('auto')

for i in range(self.n_sections):
Expand Down
8 changes: 8 additions & 0 deletions bladex/profile/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
"""
Profile init
"""
__all__ = ['ProfileInterface', 'NacaProfile', 'CustomProfile']

from .profileinterface import ProfileInterface
from .nacaprofile import NacaProfile
from .customprofile import CustomProfile
293 changes: 125 additions & 168 deletions bladex/customprofile.py → bladex/profile/customprofile.py

Large diffs are not rendered by default.

31 changes: 18 additions & 13 deletions bladex/nacaprofile.py → bladex/profile/nacaprofile.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
"""
Derived module from profilebase.py to provide the airfoil coordinates for standard
Naca profiles.
Derived module from profilebase.py to provide the airfoil coordinates for
standard Naca profiles.
"""
from scipy.interpolate import splev, splrep
import numpy as np
from .profilebase import ProfileBase
from .profileinterface import ProfileInterface

class NacaProfile(ProfileBase):
class NacaProfile(ProfileInterface):
"""
Generate 4- and 5-digit NACA profiles.

Expand All @@ -24,29 +24,29 @@ class NacaProfile(ProfileBase):

- P/10: indicates the location of the maximum camber measured from the
leading edge. The location is normalized by the chord length.

- TT/100: the maximum thickness as fraction of the chord length.

The profile 00TT refers to a symmetrical NACA airfoil.

The NACA five-digit series describes more complex airfoil shapes.
Its format is: LPSTT, where:

- L: the theoretical optimum lift coefficient at ideal
angle-of-attack = 0.15*L

- P: the x-coordinate of the point of maximum camber
(max camber at x = 0.05*P)

- S: indicates whether the camber is simple (S=0) or reflex (S=1)
TT/100: the maximum thickness in percent of chord, as in a four-digit
NACA airfoil code

References:

- Moran, Jack (2003). An introduction to theoretical and computational
aerodynamics. Dover. p. 7. ISBN 0-486-42879-6.

- Abbott, Ira (1959). Theory of Wing Sections: Including a Summary of
Airfoil Data. New York: Dover Publications. p. 115. ISBN 978-0486605869.

Expand All @@ -68,7 +68,8 @@ def __init__(self, digits, n_points=240, cosine_spacing=True):
self.n_points = n_points
self.cosine_spacing = cosine_spacing
self._check_args()
self._generate_coordinates()
self.generate_coordinates()
self.generate_parameters(convention='british')

def _check_args(self):
"""
Expand All @@ -84,7 +85,10 @@ def _check_args(self):
if self.n_points < 0:
raise ValueError('n_points must be positive.')

def _generate_coordinates(self):
def generate_parameters(self, convention='british'):
return super().generate_parameters(convention)

def generate_coordinates(self):
"""
Private method that generates the coordinates of the NACA 4 or 5 digits
airfoil profile. The method assumes a zero-thickness trailing edge, and
Expand Down Expand Up @@ -214,4 +218,5 @@ def _generate_coordinates(self):
self.ydown_coordinates = yc - yt

else:
raise Exception
raise Exception

Loading
Loading