Source code for pymead.utils.get_airfoil

import typing
from copy import deepcopy

import numpy as np
import requests


[docs] def extract_data_from_airfoiltools(name: str, repair: typing.Callable or None = None) -> np.ndarray: r""" Extracts the :math:`xy`-coordinates of a specified airfoil from `Airfoil Tools <http://airfoiltools.com/>`_ and returns the :math:`xy`-coordinates as a numpy array of ``shape=(N,2)`` where ``N`` is the number of airfoil coordinates, and the columns represent :math:`x` and :math:`y`. Parameters ---------- name: str Name of the airfoil to be requested from `Airfoil Tools <http://airfoiltools.com/>`_. The name must exactly match the airfoil name inside the parentheses on Airfoil Tools. For example, ``"naca0012"`` does not work, but ``"n0012-il"`` does. repair: typing.Callable or None An optional function that takes that makes modifications to the set of :math:`xy`-coordinates loaded from Airfoil Tools. This function should take exactly one input (the :math:`N \times 2` ``numpy.ndarray`` representing the :math:`xy`-coordinates downloaded from Airfoil Tools) and return this array as the output. Default: ``None`` Returns ------- numpy.ndarray The set of :math:`xy`-coordinates of type ``numpy.ndarray`` with ``shape=(N,2)``, where ``N`` is the number of airfoil coordinates and the columns represent :math:`x` and :math:`y` """ url = f'http://airfoiltools.com/airfoil/seligdatfile?airfoil={name}' data = requests.get(url) if data.status_code == 404: raise AirfoilNotFoundError(f"Airfoil {name} not found at http://airfoiltools.com/") text = deepcopy(data.text) coords_str = text.split('\n') xy_str_list = [coord_str.split() for coord_str in coords_str] xy = np.array([[float(xy_str[0]), float(xy_str[1])] for xy_str in xy_str_list[1:-1]]) if repair is not None: xy = repair(xy) return xy
[docs] class AirfoilNotFoundError(Exception): pass