From 3ddf567aea717096cae57a6369a6d40abb917b9d Mon Sep 17 00:00:00 2001 From: Thomas Lambert <t.lambert@uliege.be> Date: Mon, 11 Jul 2022 20:41:14 +0200 Subject: [PATCH] add(airfoil): add airfoil class --- +af_tools/@Airfoil/Airfoil.m | 103 ++++++++++++++++++++++++ +af_tools/@Airfoil/addextremereynolds.m | 42 ++++++++++ CHANGELOG.md | 1 + 3 files changed, 146 insertions(+) create mode 100644 +af_tools/@Airfoil/Airfoil.m create mode 100644 +af_tools/@Airfoil/addextremereynolds.m diff --git a/+af_tools/@Airfoil/Airfoil.m b/+af_tools/@Airfoil/Airfoil.m new file mode 100644 index 0000000..a5ebfd2 --- /dev/null +++ b/+af_tools/@Airfoil/Airfoil.m @@ -0,0 +1,103 @@ +classdef Airfoil + % AIRFOIL Class for airfoils with all their important data. + % This AIRFOIL class is used to represent completely an airfoil and the important metrics + % attached to it. These data include: + % - the airofil name + % - the airofil full coordinates (in Selig format) + % - the airofil upper surface coordinates + % - the airofil lower surface coordinates + % - a structure containing the original airfoil polars (obtained using xf2mat) + % - a structure containing the extended airfoil polars (obtained using extendpolar) + % + % <a href="https://gitlab.uliege.be/am-dept/matlab_airfoil_toolbox">Documentation (README)</a> + % <a href="https://gitlab.uliege.be/am-dept/matlab_airfoil_toolbox/-/issues">Report an issue</a> + % ----- + % + % Usage: + % Af = AIRFOIL initiates an empty airfoil object. + % + % Af = AIRFOIL(coordFile) initiates an airfoil object whose coordinates will be found in + % coordFile. The airfoil name will be retreived automatically from the coordinates file. + % + % Af = AIRFOIL(coordFile, name) initiates an airfoil object whose coordinates will be found in + % coordFile, but using the name given as input. + % + % Inputs: + % coordFile : Airfoil coordinates, in Selig or Lednicer format (dat-file) + % name : The name of the airfoil + % + % Example: + % Af = AIRFOIL + % Af = AIRFOIL('data/naca0012.dat') + % Af = AIRFOIL('data/naca0012.dat','NACA 0012') + % + % See also: XF2MAT, EXTENDPOLAR. + % + % ----- + % (c) Copyright 2022 University of Liege + % Author: Thomas Lambert <t.lambert@uliege.be> + % ULiege - Aeroelasticity and Experimental Aerodynamics + % Apache 2.0 License + % https://gitlab.uliege.be/am-dept/matlab_airfoil_toolbox + + % ---------------------------------------------------------------------------------------------- + + properties + % Name + name + % Coordinates (full airfoil, upper and lower surfaces separately) + coord + upper + lower + end + + properties (GetAccess = public, SetAccess = protected) + % Polar must be protected to ensure proprer behavior of the codes using Airfoil + Polar (1, 1) af_tools.Polar + end + + methods + + function self = Airfoil(coordFile, name) + % AIRFOIL Constructor. + % Initiates the Airfoil object based on its coordFile. If a name is explicitely + % passed, this will be used for the airfoil name. If no name is given, it will be + % retreived from the coordFile. + + self.Polar = af_tools.Polar; + if nargin > 0 && ~isempty(coordFile) + import af_tools.* + + % Parse the coordinates files and save the useful properties + Dat = formatairfoilcoord(coordFile); + self.coord = Dat.coord; + self.upper = Dat.upper; + self.lower = Dat.lower; + + % Define name + if nargin == 2 + self.name = name; + else + self.name = Dat.airfoil; + end + end + end + + % --------------------------------------- + % Other methods + function self = loadpolar(self, polarFile) + self.Polar = self.Polar.loadpolar(polarFile); + end + + function self = polypolar(self, clPoly, cdPoly) + self.Polar = self.Polar.polypolar(clPoly, cdPoly); + end + + function self = extendpolar(self) + self.Polar = self.Polar.extendpolar(); + end + + self = addextremereynolds(self) + + end +end diff --git a/+af_tools/@Airfoil/addextremereynolds.m b/+af_tools/@Airfoil/addextremereynolds.m new file mode 100644 index 0000000..fe3b79e --- /dev/null +++ b/+af_tools/@Airfoil/addextremereynolds.m @@ -0,0 +1,42 @@ +function obj = addextremereynolds(obj) + % ADDEXTREMEREYNOLDS Adds dupplicate polars for extreme Reynolds number. + % In order to make a proper interpolation later on, this method duplicates the polars for the + % lowest and highest Reynolds and assign these respectively to Re = 1 and Re = 1e15. + % This will allow extrapolation outside of the original Range by symply considering the Polars + % to be Reynolds-independant if the Reynolds is very low or very high. + % + % Note: + % If we have only one polar (i.e. one Reynolds), then this method does not do anything. + % ----- + % (c) Copyright 2022 University of Liege + % Author: Thomas Lambert <t.lambert@uliege.be> + % ULiege - Aeroelasticity and Experimental Aerodynamics + % Apache 2.0 License + % https://gitlab.uliege.be/am-dept/matlab_airfoil_toolbox + + % ---------------------------------------------------------------------------------------------- + + % Defaults extreme Reynolds + DEF.LOW_REYNOLDS = 1; + DEF.HIGH_REYNOLDS = 1e15; + + % Add duplicate polars for extreme Reynolds + if ~isempty(obj.Polar) + + if length(obj.Polar.reynolds) > 1 + obj.Polar.reynolds = [DEF.LOW_REYNOLDS, obj.Polar.reynolds, DEF.HIGH_REYNOLDS]; + obj.Polar.aoa = duplicateextremes(obj.Polar.aoa); + obj.Polar.cl = duplicateextremes(obj.Polar.cl); + obj.Polar.cd = duplicateextremes(obj.Polar.cd); + obj.Polar.cm = duplicateextremes(obj.Polar.cm); + end + + end + +end + +function array = duplicateextremes(array) + % DUPLICATEEXTREMES Duplicates the first and last columns of an array + array = [array(:, 1), array, array(:, end)]; + +end diff --git a/CHANGELOG.md b/CHANGELOG.md index 4998329..ad2dda8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - **Polar**: add polypolar method +- **Airfoil** class ### Changed -- GitLab