{ "metadata": { "name": "", "signature": "sha256:7a6cc3531e93449f2a7e1b9c5aa5fe8b0a86e2f9893fa45d0d79e8448d59badb" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "raw", "metadata": {}, "source": [ "Content provided under a Creative Commons Attribution license, CC-BY 4.0; code under MIT license. (c)2014 Lorena A. Barba, Olivier Mesnard. Thanks: Ian Carr and NSF for support via CAREER award #1149784." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[@LorenaABarba](https://twitter.com/LorenaABarba)" ] }, { "cell_type": "heading", "level": 5, "metadata": {}, "source": [ "Version 0.1 -- May 2014" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "2D Source-vortex panel method with boundary-layer correction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A *source-panel method* leads to a solution with no circulation, therefore no lift. The objective of this lesson is to start with the source panel method we implemented in the previous lesson and add some *circulation* so that we may have a lift force. We introduce an important concept: the **Kutta-condition** that allows us to determine what the right amount of circulation should be.\n", "\n", "In all prior notebooks we have neglected all viscous forces. This notebook will add a boundary layer correction to the potential flow code around a NACA0012 airfoil.\n", "\n", "In two dimensional flow around an airfoil one can consider the viscous effects to be confined to a thin layer on the surface. The boundary layer, as coined by Prandtl, is a region just above the surface where the frictional effects, caused by the no-slip condition, effect the flow tremedously. Outside the boundary layer the flow can be considered inviscid, hence potential flow theory applies. The impact of this concept by Prandtl, the boundary layer, on modern aerodynamics cannot be overstated. \n", "\n", "The boundary layer begins to grow the moment the flow comes in contact with the surface of the airfoil and continues to do so until the trailing edge. At a certain point in its evolution the boundary layer transitions from a laminar scheme to a turbulent one. To apply these concepts to the code we've been working with we will employ three methods: Thwaites', Michaels, and Heads. Thwaites' method applies to the laminar boundary layer, Michael's criterion determines the transition point, and Head's method applies to the turbulent boundary layer." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Discretizition of airfoil geometry" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's get the preliminaries out of the way. We need to import our favorite libraries, and the function `integrate` from SciPy, as in Lesson 10." ] }, { "cell_type": "code", "collapsed": false, "input": [ "from math import *\n", "import numpy as np\n", "from scipy import integrate\n", "import matplotlib.pyplot as plt" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "# reads of the geometry from a data file\n", "with open ('../resources/naca0012.dat') as file_name:\n", " x, y = np.loadtxt(file_name, dtype=float, delimiter='\\t', unpack=True)\n", "\n", "# plots the geometry\n", "%matplotlib inline\n", "\n", "val_x, val_y = 0.1, 0.2\n", "x_min, x_max = x.min(), x.max()\n", "y_min, y_max = y.min(), y.max()\n", "x_start, x_end = x_min-val_x*(x_max-x_min), x_max+val_x*(x_max-x_min)\n", "y_start, y_end = y_min-val_y*(y_max-y_min), y_max+val_y*(y_max-y_min)\n", "\n", "size = 10\n", "plt.figure(figsize=(size, (y_end-y_start)/(x_end-x_start)*size))\n", "plt.grid(True)\n", "plt.xlabel('x', fontsize=16)\n", "plt.ylabel('y', fontsize=16)\n", "plt.xlim(x_start, x_end)\n", "plt.ylim(y_start, y_end)\n", "plt.plot(x, y, color='k', linestyle='-', linewidth=2);" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\n/v5+AP77/cnHbhERERHJEK9OJSIiIpIhJnFEREREMsQkjoiIiEiGmMQRERERyRCTOCIiIiIZYhJH\nREREJENM4oiIiIhkiEkcERERkQwxiSMiIiKSISZxRERjYLVakZGRgZkzZ8Jut4vrv/zySwQEBODv\nf/+7F1tHROMBH7tFRDRGFRUVmDVrFlauXIkXXngBZrMZ2dnZmD17Nv797397u3lE5OeYxBERXYDX\nX38df/zjH/HFF1/g5ZdfRmVlJb799ls+yJyILjkmcUREF+imm27Cnj17YLfb8Z///Ad5eXnebhIR\njQOcE0dEdIEWLlyIvr4+ZGdnM4EjIskwiSMiugBNTU149NFHcfnll6OiogJ/+9vfvN0kIhonmMQR\nEY2RIAh44IEHEBoait27d2PFihVYs2YNvv/+e283jYjGAc6JIyIao1deeQWPPfYY9u7dizlz5qC/\nvx+zZs1Cb28vDh06hJCQEG83kYj8GHviiIjG4PDhw/jLX/6Cxx9/HHPmzAEABAYGYvPmzaiursaq\nVau83EIi8nfsiSMiIiKSIfbEEREREckQkzgiIiIiGWISR0RERCRDTOKIiIiIZIhJHBEREZEMMYkj\nIiIikiEmcUREREQyxCSOiIiISIaYxBERERHJ0P8DTXjYHxEkAyYAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We define a class `Panel` that will store all information about one panel: start and end points, center point, length, orientation, source strength, tangential velocity and pressure coefficient. We don't save the vortex-sheet strength because all panels will have the same value.As with both Lesson 10 and 11, we define the attributes of a panel with the class Panel." ] }, { "cell_type": "code", "collapsed": false, "input": [ "class Panel:\n", " \"\"\"Contains information related to one panel.\"\"\"\n", " def __init__(self, xa, ya, xb, yb):\n", " \"\"\"Creates a panel.\n", " \n", " Arguments\n", " ---------\n", " xa, ya -- Cartesian coordinates of the first end-point.\n", " xb, yb -- Cartesian coordinates of the second end-point.\n", " \"\"\"\n", " self.xa, self.ya = xa, ya\n", " self.xb, self.yb = xb, yb\n", " \n", " self.xc, self.yc = (xa+xb)/2, (ya+yb)/2 # control-point (center-point)\n", " self.length = sqrt((xb-xa)**2+(yb-ya)**2) # length of the panel\n", " \n", " # orientation of the panel (angle between x-axis and panel's normal)\n", " if xb-xa <= 0.:\n", " self.beta = acos((self.yb-self.ya)/self.length)\n", " elif xb-xa > 0.:\n", " self.beta = pi + acos(-(self.yb-self.ya)/self.length)\n", " \n", " # location of the panel\n", " if self.beta <= pi:\n", " self.side = 'extrados'\n", " else:\n", " self.side = 'intrados'\n", " \n", " self.sigma = 0. # source strength\n", " self.vt = 0. # tangential velocity\n", " self.cp = 0. # pressure coefficient" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Like before, we call the function `define_panels()` to discretize the airfoil geometry in `N` panels. The function will return a NumPy array of `N` objects of the type `Panel`." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def define_panels(x, y, N=40):\n", " \"\"\"Discretizes the geometry into panels using 'cosine' method.\n", " \n", " Arguments\n", " ---------\n", " x, y -- Cartesian coordinates of the geometry (1D arrays).\n", " N - number of panels (default 40).\n", " \n", " Returns\n", " -------\n", " panels -- Numpy array of panels.\n", " \"\"\"\n", " R = (x.max()-x.min())/2 # radius of the circle\n", " x_center = (x.max()+x.min())/2 # x-coord of the center\n", " x_circle = x_center + R*np.cos(np.linspace(0, 2*pi, N+1)) # x-coords of the circle\n", " \n", " x_ends = np.copy(x_circle) # projection of the x-coords on the surface\n", " y_ends = np.empty_like(x_ends) # initialization of the y-coords Numpy array\n", "\n", " x, y = np.append(x, x[0]), np.append(y, y[0]) # extend arrays using np.append\n", " \n", " # computes the y-coordinate of end-points\n", " I = 0\n", " for i in range(N):\n", " while I < len(x)-1:\n", " if (x[I] <= x_ends[i] <= x[I+1]) or (x[I+1] <= x_ends[i] <= x[I]):\n", " break\n", " else:\n", " I += 1\n", " a = (y[I+1]-y[I])/(x[I+1]-x[I])\n", " b = y[I+1] - a*x[I+1]\n", " y_ends[i] = a*x_ends[i] + b\n", " y_ends[N] = y_ends[0]\n", " \n", " # creates panels\n", " panels = np.empty(N, dtype=object)\n", " for i in xrange(N):\n", " panels[i] = Panel(x_ends[i], y_ends[i], x_ends[i+1], y_ends[i+1])\n", " \n", " return panels" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can use our new function to define the geometry for the airfoil panels, and then plot the panel nodes on the geometry." ] }, { "cell_type": "code", "collapsed": false, "input": [ "N = 80 # number of panels\n", "panels = define_panels(x, y, N) # discretizes of the geometry into N panels\n", "\n", "# plots the geometry and the panels\n", "val_x, val_y = 0.1, 0.2\n", "x_min, x_max = min( panel.xa for panel in panels ), max( panel.xa for panel in panels )\n", "y_min, y_max = min( panel.ya for panel in panels ), max( panel.ya for panel in panels )\n", "x_start, x_end = x_min-val_x*(x_max-x_min), x_max+val_x*(x_max-x_min)\n", "y_start, y_end = y_min-val_y*(y_max-y_min), y_max+val_y*(y_max-y_min)\n", "\n", "size = 10\n", "plt.figure(figsize=(size, (y_end-y_start)/(x_end-x_start)*size))\n", "plt.grid(True)\n", "plt.xlabel('x', fontsize=16)\n", "plt.ylabel('y', fontsize=16)\n", "plt.xlim(x_start, x_end)\n", "plt.ylim(y_start, y_end)\n", "plt.plot(x, y, color='k', linestyle='-', linewidth=2)\n", "plt.plot(np.append([panel.xa for panel in panels], panels[0].xa), \n", " np.append([panel.ya for panel in panels], panels[0].ya), \n", " linestyle='-', linewidth=1, marker='o', markersize=6, color='#CD2305');" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nB9R432TI32coAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Freestream conditions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The airfoil is immersed in a free-stream ($U_\\infty$,$\\alpha$) where $U_\\infty$ and $\\alpha$ are the velocity magnitude and angle of attack, respectively. Like before, we create a class for the free stream, even though we will only have one object that uses this class. It makes it easier to pass the free stream to other functions later on." ] }, { "cell_type": "code", "collapsed": false, "input": [ "class Freestream:\n", " \"\"\"Freestream conditions.\"\"\"\n", " def __init__(self, u_inf=1.0, alpha=0.0):\n", " \"\"\"Sets the freestream conditions.\n", " \n", " Arguments\n", " ---------\n", " u_inf -- Farfield speed (default 1.0).\n", " alpha -- Angle of attack in degrees (default 0.0).\n", " \"\"\"\n", " self.u_inf = u_inf\n", " self.alpha = alpha*pi/180 # degrees --> radians" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 6 }, { "cell_type": "code", "collapsed": false, "input": [ "# defines and creates the object freestream\n", "u_inf = 1.0\n", "alpha = 0.0\n", "freestream = Freestream(u_inf, alpha)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Flow tangency condition" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A constant vortex strength $\\gamma$ will be added to each panel (all panels have the same, constant vortex-sheet strength). Thus, using the principle of superposition, the velocity potential becomes:\n", "\n", "$$\n", "\\begin{align*}\n", "\\phi\\left(x_{c_i},y_{c_i}\\right) &= V_\\infty x_{c_i} \\cos \\alpha + V_\\infty y_{c_i} \\sin \\alpha \\\\\n", "&+ \\sum_{j=1}^N \\frac{\\sigma_j}{2\\pi} \\int_j \\ln \\left(\\sqrt{(x_{c_i}-x_j(s_j))^2+(y_{c_i}-y_j(s_j))^2} \\right) {\\rm d}s_j \\\\\n", "&- \\sum_{j=1}^N \\frac{\\gamma}{2\\pi} \\int_j \\tan^{-1} \\left(\\frac{y_{c_i}-y_j(s_j)}{x_{c_i}-x_j(s_j)}\\right) {\\rm d}s_j\n", "\\end{align*}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We already worked the first integral in the previous lesson:\n", "\n", "$$\\frac{\\partial}{\\partial n_i} \\ln \\left(\\sqrt{(x_{c_i}-x_j(s_j))^2+(y_{c_i}-y_j(s_j))^2} \\right) = \\frac{\\left(x_{c_i}-x_j\\right)\\frac{\\partial x_{c_i}}{\\partial n_i} + \\left(y_{c_i}-y_j\\right)\\frac{\\partial y_{c_i}}{\\partial n_i}}{\\left(x_{c_i}-x_j\\right)^2 + \\left(x_{c_i}-x_j\\right)^2}$$\n", "\n", "where $\\frac{\\partial x_{c_i}}{\\partial n_i} = \\cos \\beta_i$ and $\\frac{\\partial y_{c_i}}{\\partial n_i} = \\sin \\beta_i$, and:\n", "\n", "$$x_j(s_j) = x_{b_j} - s_j \\sin \\beta_j$$\n", "\n", "$$y_j(s_j) = y_{b_j} + s_j \\cos \\beta_j$$\n", "\n", "We now need to derive the last integral of the boundary equation:\n", "\n", "$$\\frac{\\partial}{\\partial n_i} \\tan^{-1} \\left(\\frac{y_{c_i}-y_j(s_j)}{x_{c_i}-x_j(s_j)}\\right)= \\frac{\\left(x_{c_i}-x_j\\right)\\frac{\\partial y_{c_i}}{\\partial n_i} - \\left(y_{c_i}-y_j\\right)\\frac{\\partial x_{c_i}}{\\partial n_i}}{\\left(x_{c_i}-x_j\\right)^2 + \\left(y_{c_i}-y_j\\right)^2}$$\n", "\n", "where $\\frac{\\partial x_{c_i}}{\\partial n_i} = \\cos \\beta_i$ and $\\frac{\\partial y_{c_i}}{\\partial n_i} = \\sin \\beta_i$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Kutta-condition" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To enforce the *Kutta-condition*, we state that the pressure coefficient on the fisrt panel must be equal to that on the last panel:\n", "\n", "$$C_{p_1} = C_{p_{N}}$$\n", "\n", "Using the definition of the pressure coefficient $C_p = 1-\\left(\\frac{V}{U_\\infty}\\right)^2$, the Kutta-condition implies that the magnitude of the velocity at the first panel center must equal the magnitude of the last panel center:\n", "\n", "$$V_1^2 = V_N^2$$\n", "\n", "Since the flow tangency condition requires that $V_{n_1} = V_{n_N} = 0$, we end up with the following *Kutta-condition*:\n", "\n", "$$V_{t_1} = - V_{t_N}$$\n", "\n", "(the minus sign comes from the reference axis we chose for the normal and tangential vectors)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Therefore, we need to evaluate the tangential velocity at the first and last panels. Let's derive it for every panel, since it will be useful to compute the pressure coefficient.\n", "\n", "$$V_{t_i} = \\frac{\\partial}{\\partial t_i} \\left(\\phi\\left(x_{c_i},y_{c_i}\\right)\\right)$$\n", "\n", "i.e.,\n", "\n", "$$\n", "\\begin{align*}\n", "V_{t_i} &= V_\\infty \\sin \\left(\\alpha-\\beta_i\\right) \\\\\n", "&+ \\sum_{j=1,j\\neq i}^N \\frac{\\sigma_j}{2\\pi} \\int_j \\frac{\\partial}{\\partial t_i} \\ln \\left(\\sqrt{(x_{c_i}-x_j(s_j))^2+(y_{c_i}-y_j(s_j))^2} \\right) {\\rm d}s_j \\\\\n", "&- \\sum_{j=1,j\\neq i}^N \\frac{\\gamma}{2\\pi} \\int_j \\frac{\\partial}{\\partial t_i} \\tan^{-1} \\left(\\frac{y_{c_i}-y_j(s_j)}{x_{c_i}-x_j(s_j)}\\right) {\\rm d}s_j\n", "\\end{align*}\n", "$$\n", "\n", "\n", "which gives\n", "\n", "$$\n", "\\begin{align*}\n", "V_{t_i} &= V_\\infty \\sin \\left(\\alpha-\\beta_i\\right) \\\\\n", "&+ \\sum_{j=1,j\\neq i}^N \\frac{\\sigma_j}{2\\pi} \\int_j \\frac{\\left(x_{c_i}-x_j\\right)\\frac{\\partial x_{c_i}}{\\partial t_i} + \\left(y_{c_i}-y_j\\right)\\frac{\\partial y_{c_i}}{\\partial t_i}}{\\left(x_{c_i}-x_j\\right)^2 + \\left(x_{c_i}-x_j\\right)^2} {\\rm d}s_j \\\\\n", "&- \\sum_{j=1,j\\neq i}^N \\frac{\\gamma}{2\\pi} \\int_j \\frac{\\left(x_{c_i}-x_j\\right)\\frac{\\partial y_{c_i}}{\\partial t_i} - \\left(y_{c_i}-y_j\\right)\\frac{\\partial x_{c_i}}{\\partial t_i}}{\\left(x_{c_i}-x_j\\right)^2 + \\left(x_{c_i}-x_j\\right)^2} {\\rm d}s_j \n", "\\end{align*}\n", "$$\n", "\n", "where $\\frac{\\partial x_{c_i}}{\\partial t_i} = -\\sin \\beta_i$ and $\\frac{\\partial y_{c_i}}{\\partial t_i} = \\cos \\beta_i$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Building the linear system" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here, we build and solve the linear system of equations of the form\n", "\n", "$$[A][\\sigma,\\gamma] = [b]$$\n", "\n", "where the $N+1 \\times N+1$ matrix $[A]$ contains three blocks: an $N \\times N$ source matrix (the same one of Lesson 10), an $N \\times 1$ vortex array to store the weight of the variable $\\gamma$ at each panel, and a $1 \\times N+1$ Kutta array that repesents our Kutta-condition." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We are going to re-use the function `integral()` from Lesson 10 to compute the different integrals with the NumPy function `integrate.quad()`:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def integral(x, y, panel, dxdz, dydz):\n", " \"\"\"Evaluates the contribution of a panel at one point.\n", " \n", " Arguments\n", " ---------\n", " x, y -- Cartesian coordinates of the point.\n", " panel -- panel which contribution is evaluated.\n", " dxdz -- derivative of x in the z-direction.\n", " dydz -- derivative of y in the z-direction.\n", " \n", " Returns\n", " -------\n", " Integral over the panel of the influence at one point.\n", " \"\"\"\n", " def func(s):\n", " return ( ((x - (panel.xa-sin(panel.beta)*s))*dxdz\n", " + (y - (panel.ya+cos(panel.beta)*s))*dydz)\n", " / ((x - (panel.xa-sin(panel.beta)*s))**2\n", " + (y - (panel.ya+cos(panel.beta)*s))**2) )\n", " return integrate.quad(lambda s:func(s), 0.0, panel.length)[0]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We first build the source matrix:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def source_matrix(panels):\n", " \"\"\"Builds the source matrix.\n", " \n", " Arguments\n", " ---------\n", " panels -- array of panels.\n", " \n", " Returns\n", " -------\n", " A -- NxN matrix (N is the number of panels).\n", " \"\"\"\n", " N = len(panels)\n", " A = np.empty((N, N), dtype=float)\n", " np.fill_diagonal(A, 0.5)\n", " \n", " for i, p_i in enumerate(panels):\n", " for j, p_j in enumerate(panels):\n", " if i != j:\n", " A[i,j] = 0.5/pi*integral(p_i.xc, p_i.yc, p_j, cos(p_i.beta), sin(p_i.beta))\n", " \n", " return A" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": {}, "source": [ "then the vortex array:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def vortex_array(panels):\n", " \"\"\"Builds the vortex array.\n", " \n", " Arguments\n", " ---------\n", " panels - array of panels.\n", " \n", " Returns\n", " -------\n", " a -- 1D array (Nx1, N is the number of panels).\n", " \"\"\"\n", " a = np.zeros(len(panels), dtype=float)\n", " \n", " for i, p_i in enumerate(panels):\n", " for j, p_j in enumerate(panels):\n", " if i != j:\n", " a[i] -= 0.5/pi*integral(p_i.xc, p_i.yc, p_j, +sin(p_i.beta), -cos(p_i.beta))\n", " \n", " return a" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "and finally the Kutta array:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def kutta_array(panels):\n", " \"\"\"Builds the Kutta-condition array.\n", " \n", " Arguments\n", " ---------\n", " panels -- array of panels.\n", " \n", " Returns\n", " -------\n", " a -- 1D array (Nx1, N is the number of panels).\n", " \"\"\"\n", " N = len(panels)\n", " a = np.empty(N+1, dtype=float)\n", " a[N] = 0.0\n", " \n", " a[0] = 0.5/pi*integral(panels[N-1].xc, panels[N-1].yc, panels[0], \n", " -sin(panels[N-1].beta), +cos(panels[N-1].beta))\n", " a[N-1] = 0.5/pi*integral(panels[0].xc, panels[0].yc, panels[N-1], \n", " -sin(panels[0].beta), +cos(panels[0].beta))\n", " \n", " for i, panel in enumerate(panels[1:N-1]):\n", " a[i] = 0.5/pi*(integral(panels[0].xc, panels[0].yc, panel, \n", " -sin(panels[0].beta), +cos(panels[0].beta))\n", " + integral(panels[N-1].xc, panels[N-1].yc, panel, \n", " -sin(panels[N-1].beta), +cos(panels[N-1].beta)) )\n", "\n", " a[N] -= 0.5/pi*(integral(panels[0].xc, panels[0].yc, panel, \n", " +cos(panels[0].beta), +sin(panels[0].beta))\n", " + integral(panels[N-1].xc, panels[N-1].yc, panel, \n", " +cos(panels[N-1].beta), +sin(panels[N-1].beta)) )\n", " \n", " return a" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that the three blocks have be defined, we can assemble the matrix $[A]$:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def build_matrix(panels):\n", " \"\"\"Builds the matrix of the linear system.\n", " \n", " Arguments\n", " ---------\n", " panels -- array of panels.\n", " \n", " Returns\n", " -------\n", " A -- (N+1)x(N+1) matrix (N is the number of panels).\n", " \"\"\"\n", " N = len(panels)\n", " A = np.empty((N+1, N+1), dtype=float)\n", " \n", " AS = source_matrix(panels)\n", " av = vortex_array(panels)\n", " ak = kutta_array(panels)\n", " \n", " A[0:N,0:N], A[0:N,N], A[N,:] = AS[:,:], av[:], ak[:]\n", " \n", " return A" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": {}, "source": [ "On the right hand-side, we store the free-stream conditions that do not depend on the unknowns strengths:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def build_rhs(panels, freestream):\n", " \"\"\"Builds the RHS of the linear system.\n", " \n", " Arguments\n", " ---------\n", " panels -- array of panels.\n", " freestream -- farfield conditions.\n", " \n", " Returns\n", " -------\n", " b -- 1D array ((N+1)x1, N is the number of panels).\n", " \"\"\"\n", " N = len(panels)\n", " b = np.empty(N+1,dtype=float)\n", " \n", " for i, panel in enumerate(panels):\n", " b[i] = - freestream.u_inf * cos(freestream.alpha - panel.beta)\n", " b[N] = -freestream.u_inf*( sin(freestream.alpha-panels[0].beta)\n", " +sin(freestream.alpha-panels[N-1].beta) )\n", " \n", " return b" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "All in all, the system has been defined with the functions `source_matrix()`, `vortex_array()`, `kutta_array()` and `build_rhs()`, which we have to call to build the complete system:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "A = build_matrix(panels) # computes the singularity matrix\n", "b = build_rhs(panels, freestream) # computes the RHS array" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Solving the linear system" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The linear system is then solved using the NumPy function `linalg.solve()`and we store the results in the attribute `sigma` of each object. We also create a variable `gamma` to store the value of the constant vortex strength. " ] }, { "cell_type": "code", "collapsed": false, "input": [ "# solves the linear system\n", "variables = np.linalg.solve(A, b)\n", "\n", "for i, panel in enumerate(panels):\n", "\tpanel.sigma = variables[i]\n", "gamma = variables[-1]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Surface pressure coefficient" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The pressure coefficient at the $i$-th panel center is:\n", "\n", "$$C_{p_i} = 1 - \\left(\\frac{V_{t_i}}{U_\\infty}\\right)^2$$\n", "\n", "So, we have to compute the tangential velocity at each panel center using the function `get_tangential_velocity()`:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def get_tangential_velocity(panels, freestream, gamma):\n", " \"\"\"Computes the tangential velocity on the surface.\n", " \n", " Arguments\n", " ---------\n", " panels -- array of panels.\n", " freestream -- farfield conditions.\n", " gamma -- circulation density.\n", " \"\"\"\n", " N = len(panels)\n", " A = np.empty((N, N+1), dtype=float)\n", " np.fill_diagonal(A, 0.0)\n", " A[:,N] = 0.0\n", " \n", " for i, p_i in enumerate(panels):\n", " for j, p_j in enumerate(panels):\n", " if i != j:\n", " A[i,j] = 0.5/pi*integral(p_i.xc, p_i.yc, p_j, -sin(p_i.beta), +cos(p_i.beta))\n", " A[i,N] -= 0.5/pi*integral(p_i.xc, p_i.yc, p_j, +cos(p_i.beta), +sin(p_i.beta))\n", "\n", " b = freestream.u_inf * np.sin([freestream.alpha - panel.beta for panel in panels])\n", " \n", " var = np.append([panel.sigma for panel in panels], gamma)\n", " \n", " vt = np.dot(A, var) + b\n", " \n", " for i, panel in enumerate(panels):\n", " panel.vt = vt[i]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 16 }, { "cell_type": "code", "collapsed": false, "input": [ "# computes the tangential velocity at each panel center.\n", "get_tangential_velocity(panels, freestream, gamma)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "def get_pressure_coefficient(panels, freestream):\n", " \"\"\"Computes the surface pressure coefficients.\n", " \n", " Arguments\n", " ---------\n", " panels -- array of panels.\n", " freestream -- farfield conditions.\n", " \"\"\"\n", " for panel in panels:\n", " panel.cp = 1.0 - (panel.vt/freestream.u_inf)**2" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "# computes surface pressure coefficients\n", "get_pressure_coefficient(panels, freestream)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 19 }, { "cell_type": "code", "collapsed": false, "input": [ "# plots the surface pressure coefficients\n", "val_x, val_y = 0.1, 0.2\n", "x_min, x_max = min(panel.xa for panel in panels), max(panel.xa for panel in panels)\n", "cp_min, cp_max = min(panel.cp for panel in panels), max(panel.cp for panel in panels)\n", "x_start, x_end = x_min-val_x*(x_max-x_min), x_max+val_x*(x_max-x_min)\n", "y_start, y_end = cp_min-val_y*(cp_max-cp_min), cp_max+val_y*(cp_max-cp_min)\n", "\n", "plt.figure(figsize=(10, 6))\n", "plt.grid(True)\n", "plt.xlabel('x', fontsize=16)\n", "plt.ylabel('$C_p$', fontsize=16)\n", "plt.plot([panel.xc for panel in panels if panel.side == 'extrados'], \n", " [panel.cp for panel in panels if panel.side == 'extrados'], \n", " color='r', linestyle='-', linewidth=2, marker='o', markersize=6)\n", "plt.plot([panel.xc for panel in panels if panel.side == 'intrados'], \n", " [panel.cp for panel in panels if panel.side == 'intrados'], \n", " color='b', linestyle='-', linewidth=1, marker='o', markersize=6)\n", "plt.legend(['extrados', 'intrados'], loc='best', prop={'size':14})\n", "plt.xlim(x_start, x_end)\n", "plt.ylim(y_start, y_end)\n", "plt.gca().invert_yaxis()\n", "plt.title('Number of panels : %d' % N);" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nwoWnfE9paany8/MViUS0e/duwxO6p7PMly9frkgkoksvvVRXX3213nrrLR+mdEsyf88lafv27crI\nyNDLL79scDo3JZN5LBbT8OHDVVBQoGg0anZAB3WW+Ycffqjx48dr2LBhKigo0K9//WvzQzrk9ttv\n14ABA3TJJZec9j1OfX56CIxEIuHl5uZ6Bw4c8Jqbm71IJOLt3bv3hPeUl5d7119/ved5nrdlyxZv\n5MiRfozqjGQy37Rpk3f48GHP8zzv1VdfJfMvKZnM2983btw4r7i42HvxxRd9mNQdyWR+6NAhb+jQ\noV5tba3neZ73wQcf+DGqM5LJ/IEHHvDuu+8+z/Pa8u7Xr58Xj8f9GNcJFRUV3q5du7yCgoJT/ty1\nz0/OwAXItm3blJeXp0GDBikcDmvSpElauXLlCe9ZtWqVpkyZIkkaOXKkDh8+rIaGBj/GdUIymY8e\nPVp9+vSR1JZ5XV2dH6M6I5nMJWnJkiX6zne+o6985Ss+TOmWZDJ//vnnddNNNyk7O1uS1L9/fz9G\ndUYymV944YU6cuSIJOnIkSM6//zzlZGR4ce4TigsLNR555132p+79vlJgQuQ+vp65eTkdBxnZ2er\nvr6+0/dQKM5cMpkf77nnntOECRNMjOasZP+er1y5UnfccYckKRQKGZ3RNclk/u677+rjjz/WuHHj\nNGLECP32t781PaZTksl82rRp2rNnjwYOHKhIJKInnnjC9JgpxbXPT6p+gCT7IeV95skvfLiduS+S\n3YYNG7Rs2TK9+eabZ3Ei9yWT+ezZs/Wzn/1MoVBInued9HceX0wymcfjce3atUvr169XY2OjRo8e\nrVGjRik/P9/AhO5JJvMFCxZo2LBhisViqq6u1rXXXquqqir17t3bwISpyaXPTwpcgGRlZam2trbj\nuLa2tuNyxuneU1dXp6ysLGMzuiaZzCXprbfe0rRp07RmzZrPPUWPziWT+c6dOzVp0iRJbYver776\nqsLhsCZOnGh0Vlckk3lOTo769++vzMxMZWZmasyYMaqqqqLAnaFkMt+0aZPmzp0rScrNzdXXv/51\n7du3TyNGjDA6a6pw7vPT3xU8HC8ej3sXXXSRd+DAAa+pqanTmxg2b95s/RKm35LJ/L333vNyc3O9\nzZs3+zSlW5LJ/HglJSXeSy+9ZHBC9yST+TvvvONdc801XiKR8I4ePeoVFBR4e/bs8Wli+yWT+Z13\n3unNnz/f8zzPO3jwoJeVleV99NFHfozrjAMHDiR1E4MLn5+cgQuQjIwMLV26VEVFRWppadHUqVM1\nZMgQlZWVSZKmT5+uCRMmaPXq1crLy1OvXr30q1/9yuep7ZZM5g899JAOHTrUsY8VDoe1bds2P8e2\nWjKZo2slk/ngwYM1fvx4XXrppUpLS9O0adM0dOhQnye3VzKZz5kzR7fddpsikYhaW1u1aNEi9evX\nz+fJ7TV58mRt3LhRH374oXJycvTggw8qHo9LcvPzk6/SAgAAsAx3oQIAAFiGAgcAAGAZChwAAIBl\nKHAAAACWocABAABYhgIHAABgGQocAACAZShwAAAAlqHAAQAAWIYCBwBf0NGjRzV48GCNHDlSiUSi\n4/V169YpLS1NTz/9tI/TAUgFfJUWAJyByspKjRo1Snfeeacee+wxNTQ0KBKJaPTo0XrllVf8Hg+A\n4yhwAHCGfvnLX+ruu+/W2rVr9fjjj2vPnj2qqqriC8kBnHUUOAD4EoqLi7V+/XolEgm99tprGjdu\nnN8jAUgB7MABwJdwyy23qLm5WZFIhPIGwBgKHACcoYMHD2rWrFm6/PLLVVlZqSeffNLvkQCkCAoc\nAJwBz/M0ZcoUZWZm6vXXX9fs2bN177336u233/Z7NAApgB04ADgDixcv1n333acNGzaosLBQ8Xhc\no0aNUlNTk3bs2KEePXr4PSIAh3EGDgC+oF27dmnevHmaM2eOCgsLJUnhcFgrVqxQTU2N7rrrLp8n\nBOA6zsABAABYhjNwAAAAlqHAAQAAWIYCBwAAYBkKHAAAgGUocAAAAJahwAEAAFiGAgcAAGAZChwA\nAIBlKHAAAACW+X8leI3Ih6MWewAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 20 }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Accuracy check" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For a closed body, the sum of all the source strengths must be zero. If not, it means the body would be adding or absorbing mass from the flow! Therfore, we should have\n", "\n", "$$\\sum_{i=1}^{N} \\sigma_i l_i = 0$$\n", "\n", "where $l_i$ is the length of the $i^{\\text{th}}$ panel.\n", "\n", "With this, we can get a measure of the accuracy of the source panel method." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# calculates the accuracy\n", "accuracy = sum(panel.sigma*panel.length for panel in panels)\n", "print '--> sum of source/sink strengths:', accuracy" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "--> sum of source/sink strengths: 0.00197648461643\n" ] } ], "prompt_number": 21 }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Lift coefficient" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The lift is given by the Kutta-Joukowski theorem, $L = \\rho \\Gamma U_\\infty$, \n", "where $\\rho$ is the fluid density. The total circulation $\\Gamma$ is given by:\n", "\n", "$$\\Gamma = \\sum_{i=1}^N \\gamma l_i$$\n", "\n", "Finally, the lift coefficient is given by:\n", "\n", "$$C_l = \\frac{\\sum_{i=1}^N \\gamma l_i}{\\frac{1}{2}U_\\infty c}$$\n", "\n", " with $c$ the chord-length of the airoil" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# calculates of the lift\n", "cl = gamma*sum(panel.length for panel in panels)/(0.5*freestream.u_inf*(x_max-x_min))\n", "print '--> Lift coefficient: Cl = %.3f' % cl" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "--> Lift coefficient: Cl = 0.008\n" ] } ], "prompt_number": 22 }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Boundary Layer Calculation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To calculate the boundary layer in the laminar region, we use Thwaites' method. The laminar/tubulent transition is prediction with Michel's criterion. Finally, the turbulent boundary layer is solved using Head's method." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We start by finding the stagnation point on the surface near the leading edge with the function `find_stagnation()`. The function return the coordinates of the stagnation point (`x_stagn`, `y_stagn`) and the index of the station `I` just after the stagnation point." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def find_stagnation(panels):\n", " \"\"\"Finds the stagnation point.\n", " \n", " Arguments\n", " ---------\n", " panels -- array of panels.\n", " \n", " Returns\n", " -------\n", " I -- index of the pannel control-point just after the stagnation point.\n", " x_stagn, y_stagn -- Cartesian coordinates of the stagnation point.\n", " \"\"\"\n", " I = 0\n", " for i, panel in enumerate(panels):\n", " if panel.vt/panels[0].vt < 0.0:\n", " I = i\n", " break\n", "\n", " # station before stagnation point\n", " vt1, x1, y1 = panels[I-1].vt, panels[I-1].xc, panels[I-1].yc\n", " # station after stagnation point\n", " vt2, x2, y2 = panels[I].vt, panels[I].xc, panels[I].yc\n", " \n", " # interpolation to find stagnation point\n", " x_stagn, y_stagn = x1-vt1*(x2-x1)/(vt2-vt1), y1-vt1*(y2-y1)/(vt2-vt1)\n", " \n", " return I, x_stagn, y_stagn" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 23 }, { "cell_type": "code", "collapsed": false, "input": [ "# computes the stagnation point\n", "I, x_stagn, y_stagn = find_stagnation(panels)\n", "\n", "# plots the geometry and the stagnation point\n", "val_x, val_y = 0.1, 0.2\n", "x_min, x_max = x.min(), x.max()\n", "y_min, y_max = y.min(), y.max()\n", "x_start, x_end = x_min-val_x*(x_max-x_min), x_max+val_x*(x_max-x_min)\n", "y_start, y_end = y_min-val_y*(y_max-y_min), y_max+val_y*(y_max-y_min)\n", "\n", "size = 10\n", "plt.figure(figsize=(size, (y_end-y_start)/(x_end-x_start)*size))\n", "plt.grid(True)\n", "plt.xlabel('x', fontsize=16)\n", "plt.ylabel('y', fontsize=16)\n", "plt.xlim(x_start, x_end)\n", "plt.ylim(y_start, y_end)\n", "plt.plot(x, y, color='k', linestyle='-', linewidth=1)\n", "plt.scatter(x_stagn, y_stagn, s=40, color='r', marker='o', linewidth=0)\n", "plt.title('Stagnation point', fontsize=16);" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nwxAeHg5XV1fccsstSEpKgp+fHy5evAg3NzdMnjzZ5Hirq6uv+/Pc3FyryWd/2daxlni4bV3buvWC\nggL0xGrmxA0ZMgQZGRkICgpCeXk5kpKScPHiRb1jsrOzkZaWhkOHDgG4cvGCXC4XL27QKSgowF13\n3YUff/zR4HU4J04aurq6UFVVhaKiIhQWForLwsJClJWVoby8HFVVVfDx8YFSqRTvrh4cHIzAwECD\neTt+fn68PxSJurq60NzcjMbGxt/cdL1narUabW1t8Pb2ho+Pj9iu3ja2z9vbG15eXnxPElGPJHGL\nkSeffBJ+fn546qmnsHHjRtTX1xvMievs7ER0dDSOHj0KpVKJMWPGiBc2lJeXIzg4GACwadMmnDx5\nEh9++KHB67CIsx1arRbV1dUGd2W/+uq5qqoqNDQ0wNvbGwqFAv7+/uKHqa+vr9F1Ly8veHp6wsPD\nA25ubpy0bSGCIECj0aC5uRnNzc1oaWkxum7sZ5cvXzZahF2+fBlNTU1wdXWFp6fnDTXd+8Td3Z0X\n7RDRTSWJIq6urg6/+93vUFRUpHeLkbKyMixatAgHDhwAABw8eFC8xciCBQvwzDPPAADmzZuH3Nxc\nyGQyREZGYtu2beIcu+6kWsRl2Oh4vrl0dnaKV+fV1NSIPSlqtRp1dXUG6w0NDaipqUF7eztaW1vh\n7u4ODw8PsbDz9PSEm5sb3Nzc4Orqqte673NxcYGTk1OPzcHBAXK5HHZ2duJSt26uAlIQBAiCAK1W\ni66uLoOlRqNBe3s72tvb0dHRIa6b2q71mJaWFrEAq6yshFwu1yvOZDKZXq5NXdf9now1d3d39oL9\nC/9vMT/m3PyknHNJXJ3q6+uLI0eOGOxXKpViAQcA06dPx/Tp0w2O27lz502Nj6TN3t4eCoUCCoXC\n5Mfo/tFrtVo0NTWJvTi6Hh1dj4+uANGtq9VqvW1TCp7Ozk69oqn7OgCjxd219umKE2OFmLGlbr2r\nqwsymczguXVLe3t7ODk5wdHR0aTCVNe6H+/p6Wnw8+7F74ULFzBx4kS9gszR0fGmvCeIiKTOanri\nzEWqPXHUf+kKrKuLO2P7dOuCIBgtxHpacmiQiMi6SGI41VxYxBEREZFUXK9u4Wxtibj60nS6+Zhz\n82POzY85Nz/m3PxsNecs4oiIiIgkiMOpRERERFaKw6lERERENoZFnETY6ni+NWPOzY85Nz/m3PyY\n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\n", "text": [ "" ] } ], "prompt_number": 24 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Description of the algorithm implemented" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The boundary layer calculation has been embeded in a single class `BoundaryLayer`. The constructor of the class builds the running coordinate `s` along a boundary, stores the edge velocity from the source-vortex panel method described above and calculates the velocity gradient.\n", "\n", "For each instance of the class `BoundaryLayer`, we start by calculating the momentum thickness `theta`, the shape factor `H` and the friction coefficient `cf` by integration along the boundary, marching from the stagnation point (using a 4th-order Runge-Kutta method).\n", "\n", "The process starts with Thwaites' method (class' method `solve_laminar()`). After each station, Michel's criterion is applied to check is laminar/turbulent transition happened (class' method `transition_prediction()`). If we are still in the laminar region, Thwaites' method is applied to the next station. If we are now in the turbulent region, Head's method is used to continue the integration along the boundary (class' method `solve_turbulent()`).\n", "\n", "After having solved for the momentum thickness, the shape factor and the friction coefficient, the displacement thickness is calculated and plotted (class' method `displacement_thickness()`).\n" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Thwaites' Method for Laminar Boundary Layer" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Thwaites' method relies on the momentum integral equation but makes no assumption on the form of the velocity profile.\n", "\n", "The method supplements the momentum integral equation with algebraic relations among the unknowns $\\theta$ (momentum thickness), $H$ (shape factor) and $c_f$ (skin friction coefficient).\n", "\n", "The method introduces the parameter $l$:\n", "\n", "$$l \\equiv \\frac{1}{2} Re_{\\theta} c_f$$\n", "\n", "where $Re_{\\theta} = \\frac{u_e \\theta}{\\nu}$ is the Reynolds number based on the momentum thickness.\n", "\n", "Since the skin friction coefficient $c_f$ is a strong function of the Reynolds number, this new paramter $l$ becomes less dependent of the Reynolds number.\n", "\n", "The momentum integral equation is multiplied by $Re_{\\theta}$ to get:\n", "\n", "$$Re_{\\theta} \\frac{d\\theta}{ds} + Re_{\\theta} (2+H) \\frac{\\theta}{u_e} \\frac{du_e}{ds} = l$$\n", "\n", "Thwiates defined a dimensionless pressure-gradient parameter:\n", "\n", "$$\\lambda \\equiv \\frac{\\theta^2}{\\nu} \\frac{du_e}{ds}$$\n", "\n", "so that the modified momentum integral relation becomes:\n", "\n", "$$\\frac{u_e}{\\nu}\\frac{du_e^2}{ds} = 2 \\left( l - (2+H) \\lambda \\right)$$\n", "\n", "\n", "Thwaites approximated the right hand-side with the linear formula:\n", "\n", "$$2 \\left( l - (2+H) \\lambda \\right) \\approx 0.45 - 6\\lambda$$\n", "\n", "that, when used, leads to the following equation:\n", "\n", "$$\\frac{d}{ds} \\left( \\theta^2 u_e^6 \\right) = 0.45 \\frac{u_e^5}{\\nu}$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The above equation can be numerically solved to get the momentum thickness (in the laminar region), using a 4th-order Runge-Kutta method with the given initial condition:\n", "\n", "$$ \\theta(s=0) = \\sqrt{\\frac{0.075\\nu}{\\frac{du_e}{ds}(0)}} $$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then, the pressure-gradient parameter $\\lambda$ can be calculated.\n", "\n", "Finally, the shape factor $H$ and the skin friction coefficient $c_f = \\frac{2l}{Re_{\\theta}}$ are calculated using correlations from Cebecci and Bradshaw:\n", "\n", "$$ H(\\lambda) = 2.61 - 3.75 \\lambda + 5.24 \\lambda^2 \\quad\\quad \\text{if} \\quad 0 < \\lambda < 0.1 $$\n", "\n", "$$ H(\\lambda) = 2.088 + \\frac{0.0731}{\\lambda+0.14} \\quad\\quad \\text{if} \\quad -0.1 < \\lambda < 0 $$\n", "\n", "and\n", "\n", "$$ l(\\lambda) = 0.22 + 1.57\\lambda -1.8 \\lambda^2 \\quad\\quad \\text{if} \\quad 0 < \\lambda < 0.1 $$\n", "\n", "$$ l(\\lambda) = 0.22 + 1.402\\lambda +\\frac{0.018\\lambda}{\\lambda+ 0.107} \\quad\\quad \\text{if}\\quad -0.1 < \\lambda < 0 $$" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Michel's Transition Criterion" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The laminar/turbulent transition point is determined using Michel's criterion which states that transition occurs in the boundary layer when:\n", "\n", "$$ Re_{\\theta} \\geq 1.174 \\left( Re_s^{0.46} + 22,400 Re_s^{-0.54} \\right) $$\n", "\n", "where $Re_s = \\frac{u_e s}{\\nu}$ is the Reynolds number based on the position along the airfoil ($s$ is the running coordinate)." ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Head's Entrainment Method for Turbulent Boundary Layers" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To solve the turbulent boundary-layer, we use the Von Karman momentum integral relation:\n", "\n", "$$ \\frac{d\\theta}{ds} + (2+H) \\frac{\\theta}{u_e} \\frac{du_e}{ds} = \\frac{1}{2} c_f $$\n", "\n", "where the skin fricition coefficient is approximated using Ludwieg-Tillmann relation:\n", "\n", "$$ c_f \\approx 0.246 Re_{\\theta}^{-0.268} 10^{-0.678H} $$\n", "\n", "The entrainment relation is used:\n", "\n", "$$ E = \\frac{1}{u_e} \\frac{d}{ds} \\left( u_e (\\delta-\\delta^*) \\right) $$\n", "\n", "$E$ needs to be correlated with other integral parameters. The original method of Head (1958) defines a new shape factor:\n", "\n", "$$ H_1 =\\frac{\\delta-\\delta^*}{\\theta} $$\n", "\n", "and writes the entrainment equation as a curve-fit correlation:\n", "\n", "$$ \\frac{d}{ds}\\left( u_e \\theta H_1 \\right) = u_e F(H_1) $$\n", "\n", "where\n", "\n", "$$ F(H_1) \\approx 0.0306 \\left( H_1 - 3.0 \\right)^{-0.6169} $$\n", "\n", "Head showed that $H_1$ is correlated to the standard shape factor $H$:\n", "\n", "$$ H_1 = 3.3 + 0.8234(H-1.1)^{-1.287} \\quad\\quad \\text{for} \\quad H \\leq 1.6 $$\n", "\n", "$$ H_1 = 3.3 + 1.5501(H-0.6678)^{-3.064} \\quad\\quad \\text{for} \\quad H \\geq 1.6 $$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using the momentum integral relation, the entrainment can be written as follow:\n", "\n", "$$ \\frac{dH_1}{ds} = (1+H)\\frac{H_1}{u_e}\\frac{du_e}{ds} + \\frac{1}{\\theta}F(H_1) - \\frac{H_1}{\\theta}\\frac{c_f}{2} $$\n", "\n", "The above equation and the momentum integral relation are numericall y solved in the turbulent region using a 4th-order Runge-Kutta method." ] }, { "cell_type": "code", "collapsed": false, "input": [ "class BoundaryLayer:\n", " \"\"\"Boundary-layer correction.\"\"\"\n", " def __init__(self, x_stagn, y_stagn, panels, i_start, i_end):\n", " \"\"\"Initializes the boundary layer, \n", " computes the running coordinate, the edge-velocity and its gradient.\n", " \n", " Arguments\n", " ---------\n", " x_stagn, y_stagn -- Cartesian coordinates of the stagnation point.\n", " panels -- array of panels.\n", " i_start, i_end -- indices of the first and last panels on the boundary.\n", " \"\"\"\n", " self.N = abs(i_end-i_start) + 2\n", "\n", " # stores panels information related to a side\n", " # the parameter 'a' is used to reverse the sign of the tangential velocity \n", " # due to sign convention in panel method\n", " if i_start > i_end:\n", " self.panels = np.flipud(panels[i_end:i_start+1])\n", " a = -1.\n", " else:\n", " self.panels = panels[i_start:i_end+1]\n", " a = +1.\n", " \n", " # stores the Cartesian coordinates\n", " self.x = np.append(x_stagn, [panel.xc for panel in self.panels])\n", " self.y = np.append(y_stagn, [panel.yc for panel in self.panels])\n", " self.beta = np.append(pi, [panel.beta for panel in self.panels])\n", " \n", " # computes running coordinate\n", " self.s = np.empty(self.N, dtype=float)\n", " self.s[0] = 0.0\n", " self.s[1] = sqrt( (x_stagn-self.panels[0].xc)**2 + (y_stagn-self.panels[0].yc)**2 ) \n", " for i in range(2,self.N):\n", " self.s[i] = self.s[i-1] + self.panels[i-2].length/2 + self.panels[i-1].length/2\n", " \n", " # stores the tangetial surface velocity and computes the gradient\n", " self.ve = np.append(0.0, [a*panel.vt for panel in self.panels])\n", " self.velocity_gradient()\n", " \n", " def solve(self, nu=1.0E-05):\n", " \"\"\"Solves the boundary layer.\n", " \n", " Arguments\n", " ---------\n", " nu -- kinematic viscosity of the fluid (default 1.0E-05).\n", " \"\"\"\n", " self.nu = nu\n", " \n", " # initializes the boundary layer variables\n", " self.theta = np.zeros(self.N, dtype=float)\n", " self.H = np.zeros(self.N, dtype=float)\n", " self.cf = np.zeros(self.N, dtype=float)\n", " \n", " # solves laminar boundary\n", " self.solve_laminar()\n", " \n", " # solves turbulent boundary\n", " if not self.is_laminar:\n", " self.solve_turbulent()\n", "\n", " \n", " def solve_laminar(self):\n", " \"\"\"Solves the laminar boundary layer (Thwaites' method).\"\"\"\n", " def shape_factor(lamBda):\n", " \"\"\"Returns the shape factor (Cebeci and Bradshaw correlations).\n", " \n", " Arguments\n", " ---------\n", " lamBda -- Thwaites pressure-gradient parameter.\n", " \"\"\"\n", " if 0. <= lamBda < 0.1:\n", " return 2.61 - 3.75*lamBda + 5.24*lamBda**2\n", " elif -0.1 < lamBda < 0.:\n", " return 2.088 + 0.0731/(lamBda+0.14)\n", " \n", " def skin_friction(lamBda, Re_theta):\n", " \"\"\"Returns the skin friction (Cebeci and Bradshaw correlations).\n", " \n", " Arguments\n", " ---------\n", " lamBda -- Thwaites pressure-gradient parameter.\n", " Re_theta -- Reynolds number based on momentum thickness.\n", " \"\"\"\n", " if 0.0 <= lamBda < 0.1:\n", " l = 0.22 + 1.57*lamBda - 0.18*lamBda**2\n", " elif -0.1 < lamBda < 0.0:\n", " l = 0.22 + 1.402*lamBda + 0.018*lamBda/(lamBda+0.107)\n", " return 2*l/Re_theta\n", " \n", " def f(s, y):\n", " \"\"\"Returns right hand-side of first-order ODE.\n", " \n", " Arguments\n", " ---------\n", " s -- running coordinate along the boundary.\n", " y -- variable to be integrated.\n", " \"\"\"\n", " ve = (s-self.s[i-1])/h*(self.ve[i]-self.ve[i-1]) + self.ve[i-1]\n", " dveds = (s-self.s[i-1])/h*(self.dveds[i]-self.dveds[i-1]) + self.dveds[i-1]\n", " \n", " rhs = 0.45*self.nu/ve - 6*y/ve*dveds\n", " return rhs\n", " \n", " # initial conditions\n", " self.theta[0] = sqrt(0.075*self.nu/abs(self.dveds[0]))\n", " self.ve[0] = 1.0E-06\n", " y = np.array([self.theta[0]**2])\n", " \n", " # marching along the surface with RK4 integration\n", " self.is_laminar = True\n", " i = 1\n", " while self.is_laminar and i < self.N:\n", " s = self.s[i-1]\n", " h = self.s[i] - self.s[i-1]\n", " \n", " k1 = h * f(s, y)\n", " k2 = h * f(s + h/2, y + k1/2)\n", " k3 = h * f(s + h/2, y + k2/2)\n", " k4 = h * f(s + h, y + k3)\n", " \n", " y += 1./6 * (k1 + 2*k2 + 2*k3 + k4)\n", " \n", " #self.theta[i] = sqrt(y[0])\n", " self.theta[i] = sqrt( 0.45*self.nu/self.ve[i]**6 \n", " * np.trapz(self.ve[:i]**5,self.s[:i]) )\n", " \n", " # checks for transition laminar/turbulent\n", " self.transition_prediction(i)\n", "\n", " if self.is_laminar:\n", " # calculates the pressure-gradient parameter\n", " lamBda = self.theta[i]**2 / self.nu * self.dveds[i]\n", " # computes the shape factor\n", " self.H[i] = shape_factor(lamBda)\n", " # calculates the Reynolds number based on momentum thickness\n", " Re_theta = self.ve[i] * self.theta[i]/self.nu\n", " # computes the friction coefficient\n", " self.cf[i] = skin_friction(lamBda, Re_theta)\n", " \n", " i += 1\n", "\n", " def solve_turbulent(self):\n", " \"\"\"Solves the turbulent boundary layer (Head's method).\"\"\"\n", " def skin_friction(theta, H, ve):\n", " \"\"\"Returns the skin friction (Ludwieg-Tillmann relation).\n", " \n", " Arguments\n", " ---------\n", " theta -- momentum thickness.\n", " H -- shape factor.\n", " ve -- edge velocity.\n", " \"\"\"\n", " return 0.246 * (ve*theta/self.nu)**(-0.268) * 10.**(-0.678*H)\n", " \n", " def new_shape_factor(H):\n", " \"\"\"Returns Head's shape factor (Head's curve-fit formula).\n", " \n", " Arguments\n", " ---------\n", " H -- shape factor.\n", " \"\"\"\n", " if H < 1.1:\n", " return 16.0\n", " elif H <= 1.6:\n", " return 3.3 + 0.8234*(H-1.1)**(-1.287)\n", " else:\n", " return 3.3 + 1.5501*(H-0.6778)**(-3.064)\n", " \n", " def shape_factor(H1):\n", " \"\"\"Returns the shape factor (Head's curve-fit formula).\n", " \n", " Arguments\n", " ---------\n", " H1 -- Head's shape factor.\n", " \"\"\"\n", " if H1 <= 3.32:\n", " return 3.0\n", " elif H1 < 5.3:\n", " return 0.6778 + ((H1-3.3)/1.5501)**(-(1./3.064))\n", " else:\n", " return 1.1 + ((H1-3.3)/0.8234)**(-(1./1.287))\n", "\n", " def F(H1):\n", " \"\"\"Returns RHS of entrainment equation (Head's curve-fit formula).\n", " \n", " Arguments\n", " ---------\n", " H1 -- Head's shape factor.\n", " \"\"\"\n", " return 0.0306 * (H1-3.0)**(-0.6169)\n", "\n", " def f(s, y):\n", " \"\"\"Returns right hand-side of first-order ODE.\n", " \n", " Arguments\n", " ---------\n", " s -- running coordinate along the boundary.\n", " y -- variable to be integrated.\n", " \"\"\"\n", " theta, H1 = y[0], y[1]\n", " \n", " ve = (s-self.s[i-1])/h*(self.ve[i]-self.ve[i-1]) + self.ve[i-1]\n", " dveds = (s-self.s[i-1])/h*(self.dveds[i]-self.dveds[i-1]) + self.dveds[i-1]\n", " \n", " H = shape_factor(H1)\n", " cf = skin_friction(theta, H, ve)\n", " \n", " rhs1 = 0.5*cf - (2.0 + H)*theta/ve*dveds\n", " rhs2 = - H1/theta*rhs1 - H1/ve*dveds + F(H1)/theta\n", " return np.array([rhs1, rhs2])\n", " \n", " # initial conditions\n", " H1 = new_shape_factor(self.H[self.i_trans-1])\n", " y = np.array([self.theta[self.i_trans-1], H1])\n", " \n", " # marching along the surface from the first turbulent station using RK4\n", " for i in range(self.i_trans, self.N):\n", " s = self.s[i-1]\n", " h = self.s[i] - self.s[i-1]\n", " \n", " k1 = h * f(s, y)\n", " k2 = h * f(s + h/2, y + k1/2)\n", " k3 = h* f(s + h/2, y + k2/2)\n", " k4 = h * f(s + h, y + k3)\n", " \n", " y += 1./6 * (k1 + 2*k2 + 2*k3 + k4)\n", " \n", " self.theta[i], H1 = y[0], y[1]\n", " self.H[i] = shape_factor(H1)\n", " self.cf[i] = skin_friction(self.theta[i], self.H[i], self.ve[i])\n", " \n", " def velocity_gradient(self):\n", " \"\"\"Computes the velocity gradient w.r.t. the running coordinate.\"\"\"\n", " N = len(self.s)\n", " self.dveds = np.gradient(self.ve, \n", " np.append(self.s[1] - self.s[0], \n", " self.s[1:N] - self.s[0:N-1]))\n", " \n", " def transition_prediction(self, i):\n", " \"\"\"Checks laminar/turbulent transition (Michel's criterion).\n", " \n", " Arguments\n", " ---------\n", " i -- index of the boundary point.\n", " \"\"\"\n", " Re_theta = self.ve[i]*self.theta[i]/self.nu\n", " Re_s = self.ve[i]*self.s[i]/self.nu\n", " \n", " michel_criterion = 1.174*(Re_s**(0.46)+22400*Re_s**(-0.54))\n", " \n", " if Re_theta > michel_criterion:\n", " self.is_laminar = False\n", " self.i_trans = i # index of the first turbulent boundary point\n", " \n", " def displacement_thickness(self, factor=1.0):\n", " \"\"\"Computes the displacement thickness and its Cartesian coordinates.\n", " \n", " Arguments\n", " ---------\n", " factor -- amplification of the boundary thickness (default 1.0).\n", " \"\"\"\n", " self.delta_star = self.H * self.theta\n", " \n", " self.x_delta = self.x + factor*self.delta_star*np.cos(self.beta)\n", " self.y_delta = self.y + factor*self.delta_star*np.sin(self.beta)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 25 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that the stagnation has been found, the airfoil surface can be divided into two boundaries: `upper` and `lower` and we create two objects of the class `BoundaryLayer`:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# creates the different boundaries to solve\n", "boundaries = {}\n", "boundaries['upper'] = BoundaryLayer(x_stagn, y_stagn, panels, I-1, 0)\n", "boundaries['lower'] = BoundaryLayer(x_stagn, y_stagn, panels, I, N-1)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 26 }, { "cell_type": "markdown", "metadata": {}, "source": [ "For each surface, the boundary layer is calculated using the algorithm described previously. The Reynolds number has been set to $Re = 10^6$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The displacement thickness $\\delta^*$ is then calculated using the definition of the shape factor:\n", "\n", "$$ H \\equiv \\frac{\\delta^*}{\\theta} $$\n", "\n", "Note that we use a factor $20$ to make the boundary layer visible on the figure below." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# solves the boundary layer and computes the displacement thickness on each side\n", "Re = 1.0E+06\n", "for boundary in boundaries.itervalues():\n", " boundary.solve(nu=1./Re)\n", " boundary.displacement_thickness(factor=20)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stderr", "text": [ "-c:89: RuntimeWarning: divide by zero encountered in double_scalars\n" ] } ], "prompt_number": 27 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, the displacement thickness is displayed on the airfoil geometry. The solid blue line represents the boundary layer thickness, and the red dot is the laminar/turbulent transition point." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# plots the displacement thickness of the different boundaries\n", "val_x, val_y = 0.1, 1.0\n", "x_min, x_max = x.min(), x.max()\n", "y_min, y_max = y.min(), y.max()\n", "x_start, x_end = x_min-val_x*(x_max-x_min), x_max+val_x*(x_max-x_min)\n", "y_start, y_end = y_min-val_y*(y_max-y_min), y_max+val_y*(y_max-y_min)\n", "\n", "size = 10\n", "plt.figure(figsize=(size, (y_end-y_start)/(x_end-x_start)*size))\n", "plt.grid(True)\n", "plt.xlabel('x', fontsize=16)\n", "plt.ylabel('y', fontsize=16)\n", "plt.xlim(x_start, x_end)\n", "plt.ylim(y_start, y_end)\n", "plt.plot(x, y, color='k', linestyle='-', linewidth=1)\n", "for boundary in boundaries.itervalues():\n", " plt.plot(boundary.x_delta, boundary.y_delta, color='b', linestyle='-', linewidth=1);\n", " if not boundary.is_laminar:\n", " plt.scatter(boundary.x_delta[boundary.i_trans], \n", " boundary.y_delta[boundary.i_trans], \n", " s=40, color='r', marker='o', zorder=10);" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 28 }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Example of the flat plate" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To test the numerical method implemented above, we use the example of the flat plate to compare our data with experimental ones.\n", "\n", "A 5-meter flat plate is immersed in a uniform flow (with speed $33$ m/s and viscosity of $1.51 \\times 10^{-5}$ m2/s)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "class Plate:\n", " \"\"\"Contains plate information.\"\"\"\n", " def __init__(self, x_min, x_max, ve=1.0, nu=1.51E-05, N=100):\n", " \"\"\"Discretizes the plate into panels and stores edge-velocity.\n", " \n", " Arguments\n", " ---------\n", " x_min, x_max -- boundaries of the plate.\n", " ve -- edge-velocity (default 1.0).\n", " nu -- kinematic viscosity (default 1.51E-05).\n", " N - number of panels (default 100).\n", " \"\"\"\n", " self.x_min = x_min\n", " self.x_max = x_max\n", " self.N = N\n", " \n", " self.x = np.linspace(self.x_min, self.x_max, self.N+1)\n", " \n", " self.panels = np.empty(self.N, dtype=object)\n", " for i, panel in enumerate(self.panels):\n", " self.panels[i] = Panel(self.x[i], 0.0, self.x[i+1], 0.0)\n", " self.panels[i].vt = ve\n", " \n", " self.nu = nu\n", " \n", " self.boundary = None" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 29 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The flat plate is discretized into `N=200` panels:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# creates the flat plate\n", "plate = Plate(0.0, 5.0, nu=1.51E-05, ve=33.0, N=200)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 30 }, { "cell_type": "markdown", "metadata": {}, "source": [ "And we create an object `plate` of the class `BoundaryLayer` to solve the boundary layer equations." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# defines the boundary layer\n", "plate.boundary = BoundaryLayer(plate.x[0], 0.0, plate.panels, 0, plate.N-1)\n", "\n", "# solves the boundary layer\n", "plate.boundary.solve(nu=plate.nu)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 31 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Blasius solution is also computed for comparison:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Blasius solution\n", "bound = plate.boundary\n", "\n", "momentum_thickness = np.empty(bound.N, dtype=float)\n", "\n", "momentum_thickness[0] = 0.0\n", "\n", "if boundary.is_laminar:\n", " momentum_thickness[1:bound.N] = 0.664*bound.s[1:bound.N] \\\n", " / np.sqrt(bound.ve[1:bound.N]*bound.s[1:bound.N]\n", " / bound.nu)\n", "else:\n", " i_trans = bound.i_trans\n", " momentum_thickness[1:i_trans] = 0.664 * bound.s[1:i_trans] \\\n", " / np.sqrt(bound.ve[1:i_trans]*bound.s[1:i_trans]/bound.nu)\n", " momentum_thickness[i_trans:bound.N] = 0.0155*bound.s[i_trans:bound.N] \\\n", " / (bound.ve[i_trans:bound.N]\n", " *bound.s[i_trans:bound.N]\n", " /bound.nu)**(1./7)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 32 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Numerical results are compared with experimental data from Wieghardt and Tillmann (1951):" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# reads experimental data from Wieghardt and Tillmann (1951)\n", "with open ('../resources/WIECF.dat') as file_name:\n", " data = np.loadtxt(file_name, dtype=float, usecols=(0, 3), skiprows=5)\n", " x_exp = 0.3048*data[:,0] # conversion feet to meters\n", " theta_exp = 0.3048*data[:,1] # conversion feet to meters\n", "\n", "# plots the momentum thickness along the flat plate\n", "plt.figure(figsize=(10, 6))\n", "plt.grid(True)\n", "plt.xlabel('x', fontsize=18)\n", "plt.ylabel(r'$Re_\\theta$', fontsize=18)\n", "# plots numerical solution\n", "plt.plot(bound.x, bound.theta*bound.ve/bound.nu, \n", " color='b', linestyle='-', linewidth=1)\n", "# plots Blasius solution\n", "plt.plot(bound.s, momentum_thickness*bound.ve/bound.nu, \n", " color='r', linestyle='-', linewidth=1)\n", "# plots experimental data\n", "plt.scatter(x_exp, theta_exp*bound.ve[1]/bound.nu, color='g', s=40, marker='o', linewidth=0)\n", "plt.legend(['Present work', 'Blasius', 'Wieghardt & Tillmann (1951)'], \n", " loc='best', prop={'size':16})\n", "if not plate.boundary.is_laminar:\n", " plt.axvline(bound.s[plate.boundary.i_trans], ymin=0., ymax=1., \n", " color='k', linestyle='-', linewidth=2)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAnwAAAGHCAYAAAAqUI8RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XmczWX/x/HXjBlk38cy7iaMfexbtJAlIZIfpYiSRIu0\naU8RSiWUFlFaULYJIaKxpIaE3MYyGMuMsTX2xpjl+/vjuk00h2bOMt9zzryfj8c87s41Z/mcz31m\nfOb6fq7rCrAsy0JERERE/Fag3QGIiIiIiGep4BMRERHxcyr4RERERPycCj4RERERP6eCT0RERMTP\nqeATERER8XNeU/AdPHiQNm3aUKdOHerWrcvEiRMBSEpKon379lSvXp0OHTpw8uTJzMeMGTOG8PBw\natasybJlyzLHN27cSEREBOHh4QwdOjRzPCUlhbvuuovw8HBatGjB/v37c+8NioiIiNjEawq+4OBg\nxo8fz7Zt2/j111/54IMP2L59O2PHjqV9+/bs2rWLtm3bMnbsWABiYmL45ptviImJYenSpQwZMoSL\nWwoOHjyYqVOnEhsbS2xsLEuXLgVg6tSplC5dmtjYWIYNG8bw4cNte78iIiIiucVrCr7y5cvToEED\nAIoUKUKtWrVISEhgwYIF9OvXD4B+/foRGRkJwHfffUfv3r0JDg4mLCyMatWqER0dTWJiImfOnKFZ\ns2YA3HfffZmPufS5evTowYoVK3L7bYqIiIjkOq8p+C61b98+Nm3aRPPmzTly5AghISEAhISEcOTI\nEQAOHTpEaGho5mNCQ0NJSEjIMl6pUiUSEhIASEhIoHLlygAEBQVRvHhxkpKScuttiYiIiNjC6wq+\ns2fP0qNHDyZMmEDRokUv+15AQAABAQE2RSYiIiLim4LsDuBSqamp9OjRg759+3LHHXcAZlbv8OHD\nlC9fnsTERMqVKweYmbuDBw9mPjY+Pp7Q0FAqVapEfHx8lvGLjzlw4AAVK1YkLS2NU6dOUapUqSxx\nVKpUiUOHDnnyrYqIiIi4RdWqVdm9e/dV7+M1M3yWZTFgwABq167NE088kTnetWtXpk+fDsD06dMz\nC8GuXbsya9YsLly4QFxcHLGxsTRr1ozy5ctTrFgxoqOjsSyLL7/8km7dumV5rjlz5tC2bVuHsRw6\ndAjLsvTl5Nerr75qewy++nUxd5f+XOgr5/nTl/Kn3PnWl/Ln2teePXv+tc7ymhm+n3/+ma+++op6\n9erRsGFDwGy78txzz9GrVy+mTp1KWFgY3377LQC1a9emV69e1K5dm6CgICZPnpx5uXfy5Mn079+f\n5ORkOnXqRMeOHQEYMGAAffv2JTw8nNKlSzNr1ix73qyf27dvn90h+CzlzjXKn2uUP+cpd65R/jzP\nawq+G264gYyMDIff+/HHHx2Ov/DCC7zwwgtZxhs3bszWrVuzjBcoUCCzYBQRERHJK7zmkq74j/79\n+9sdgs9S7lyj/LlG+XOecuca5c/zAizLsv79bnlLQEAASovY6WJ7gj6HIiLyb7JTt2iGT9wuKirK\n7hB8lnLnGuXPNcqf85Q71yh/nqeCT0RERMTP6ZKuA7qkK3bTJV0REckuXdIVERERERV84n7qxXCe\ncuca5c81yp/zlDvXKH+ep4JPRERExM+ph88B9fCJ3dTDJyIi2aUePhERERFRwSfup14M5yl3rlH+\nXKP8OU+5c43y53kq+ERERET8nHr4HFAPn9hNPXwiIpJd6uETERERERV84n7qxXCecuca5c81yp/z\nlDvXKH+ep4JPRERExM+ph88B9fCJ3dTDJyIi2aUePhERERFRwSfup14M5yl3rlH+XKP8OU+5c43y\n53kq+ERERET8nHr4HFAPn9hNPXwiIpJd6uETERERERV84n7qxXCecuca5c81yp/zlDvXKH+ep4JP\nRERExM+ph88B9fCJ3dTDJyIi2aUePhERERFRwSfup14M5yl3rlH+XKP8OU+5c43y53kq+ERERET8\nnHr4HFAPn9hNPXwiIpJd6uETERERERV84n7qxXCecuca5c81yp/zlDvXKH+ep4JPRERExM+ph88B\n9fCJ3dTDJyIi2aUePhERERFRwSfup14M5yl3rlH+XKP8OU+5c43y53kq+ERERET8nHr4HFAPn9hN\nPXwiIpJd6uETERERERV84n7qxXCecuca5c81yp/zlDvXKH+eF2R3ACIiIpJHpaTA8eN2R5EnqIfP\nAfXwid3Uwycifu2vv2DKFBg3Dh54AF5/3e6IfFp26hbN8ImIiEjuOHMGPvwQ3n0Xrr8evvsOGje2\nO6o8QT184nbqxXCecuca5c81yp/zlLt/ceKEmcWrUgU2bYLly2H+/MxiT/nzPBV8IiIi4hnHjsEL\nL0C1ahAXB2vXwsyZEBFhd2R5jnr4HFAPn9hNPXwi4tMOHYK334bPP4e77oJnn4XrrrM7Kr+lffhE\n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\n", "text": [ "" ] } ], "prompt_number": 33 }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The cell below can be ignored. It is used to create the style of the notebook." ] }, { "cell_type": "code", "collapsed": false, "input": [ "from IPython.core.display import HTML\n", "def css_styling():\n", " styles = open('../styles/custom.css', 'r').read()\n", " return HTML(styles)\n", "css_styling()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", "\n", "\n", "\n", "\n" ], "metadata": {}, "output_type": "pyout", "prompt_number": 34, "text": [ "" ] } ], "prompt_number": 34 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 34 } ], "metadata": {} } ] }