{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "raw", "metadata": {}, "source": [ "Text and code provided under a Creative Commons Attribution license, CC-BY. (c) Lorena A. Barba, Olivier Mesnard, 2014. Thanks: 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 -- February 2014" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Infinite row of vortices" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This time, you'll be on your own creating the code for this flow!\n", "\n", "The objective of this assignement is to visualize the streamlines induced by an infinite row of vortices.\n", "Because the computer does not enable the passage to the limit of an infinite number, we first consider the case of a finite number of vortices.\n", "\n", "However, it is possible to derive an analytical expression for the infinite case.\n", "\n", "Are the streamlines different from one case to the other?\n", "\n", "\n", "In this notebook, their is no Python code... not yet! Your job is to read the theory, to think how you could implement it in an efficient manner and finally to code it and visualize the results." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Vortex flow (from previous lesson)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As seen in a previous lesson, a vortex of strength $\\Gamma$ has a stream-function\n", "\n", "$$\\psi\\left(r,\\theta\\right) = \\frac{\\Gamma}{2\\pi}\\ln r$$\n", "\n", "and a velocity potential\n", "\n", "$$\\phi\\left(r,\\theta\\right) = -\\frac{\\Gamma}{2\\pi}\\theta$$\n", "\n", "From this we can derive the velocity components in a polar coordinate system\n", "\n", "$$u_r\\left(r,\\theta\\right) = 0$$\n", "\n", "$$u_\\theta\\left(r,\\theta\\right) = -\\frac{\\Gamma}{2\\pi r}$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In a Cartesian system, the velocity components at $\\left(x,y\\right)$ induced by a vortex, of strength $\\Gamma$ located at $\\left(x_\\text{vortex},y_\\text{vortex}\\right)$, are given by\n", "\n", "$$u\\left(x,y\\right) = +\\frac{\\Gamma}{2\\pi}\\frac{y-y_\\text{vortex}}{(x-x_\\text{vortex})^2+(y-y_\\text{vortex})^2}$$\n", "\n", "$$v\\left(x,y\\right) = -\\frac{\\Gamma}{2\\pi}\\frac{x-x_\\text{vortex}}{(x-x_\\text{vortex})^2+(y-y_\\text{vortex})^2}$$\n", "\n", "and the stream-function is\n", "\n", "$$\\psi\\left(x,y\\right) = \\frac{\\Gamma}{4\\pi}\\ln\\left((x-x_\\text{vortex})^2+(y-y_\\text{vortex})^2\\right)$$" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Adding many vortices" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this assignement, we consider a useful example to illustrate the concept of a *vortex sheet*: an infinite row of vortices of equal strength $\\Gamma$ (same sign and magnitude) evenly spaced by a distance $a$. But let's start with a finite row of vortices first.\n", "\n", "\n", "The stream-function $\\psi_i$ of the $i^{th}$ vortex at a distance $r_i$ is given by:\n", "\n", "$$\\psi_i = \\frac{\\Gamma}{2\\pi}\\ln r_i$$\n", "\n", "Applying the principle of superposition, the stream-function of $N$ vortices is, then\n", "\n", "$$\\psi = \\frac{\\Gamma}{2\\pi} \\sum_{i=1}^N \\ln r_i$$\n", "\n", "And the velocity field (in Cartesian coordinates) of the row of vortices is\n", "\n", "$$u\\left(x,y\\right) = + \\frac{\\Gamma}{2\\pi} \\sum_{i=1}^N \\frac{y-y_i}{(x-x_i)^2+(y-y_i)^2}$$\n", "\n", "$$v\\left(x,y\\right) = - \\frac{\\Gamma}{2\\pi} \\sum_{i=1}^N \\frac{x-x_i}{(x-x_i)^2+(y-y_i)^2}$$\n", "\n", "where $\\left(x_i,y_i\\right)$ are the Cartesian coordinates of the $i^{\\text{th}}$ vortex.\n", "\n", "(In the next section, we'll show you how to derive a closed-form expression for the *infinite* sum of vortices. But hang on.)\n", "\n", "
![image](files/resources/infiniteRowVorticesSketch.png)
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Task:\n", "\n", "#### Compute the velocity field and plot the streamlines of a row of vortices" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You will place a $N$ vortices aligned on the horizontal axis and visualize the flow pattern created. Do the following:\n", "\n", "* Using the equations derived above, compute the velocity components of each vortex on a mesh grid.\n", "\n", "* Remember that a finite number of vortices can be represented by a *list* or a NumPy *array*. Think and decide which one to use.\n", "\n", "* Define functions to avoid code repetition (and why not classes, if you prefer and are familiar with the concept).\n", "\n", "* Once you have all the velocities, apply the principle of superposition and plot the resulting flow pattern. \n", "\n", "* Play around with the size of your vortex row and the plotting range. Make your plot of publishable quality!\n", "\n", "In the end you should get something similar to this:\n", "\n", "
![image](files/resources/infiniteRowVortices.png)
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Infinite row of vortices" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This will be a fun mathematical exercise! Follow along, and take your own notes.\n", "\n", "To derive the closed-form functions, we use the complex representation:\n", "\n", "$$z = x + jy$$\n", "\n", "where $j^2=-1$. (We don't use $i$ to not confuse it with our indices!)\n", "\n", "The complex potential is defined as $w = \\phi + j\\psi$, where $\\phi$ is the potential velocity and $\\psi$ is the stream-function. If we differentiate the complex potential $w$ with respect to the complex variable $z$, we get the complex velocity\n", "\n", "$$\\frac{dw}{dz} = u-jv$$\n", "\n", "where $u$ and $v$ are the Cartesian velocity components.\n", "\n", "The complex potential representing a vortex of strength $\\Gamma$ located at the origin is\n", "\n", "$$w = \\frac{j\\Gamma}{2\\pi}\\ln z$$\n", "\n", "Why?\n", "\n", "Because $z=re^{j\\theta}$ and $w$ becomes\n", "\n", "$$w = -\\frac{\\Gamma}{2\\pi}\\theta + j\\frac{\\Gamma}{2\\pi}\\ln r = \\phi + j\\psi$$\n", "\n", "Consider a second vortex located at $\\left(a,0\\right)$ with the same strength $\\Gamma$. Its complex potential is given by\n", "\n", "$$w = \\frac{j\\Gamma}{2\\pi}\\ln \\left(z-a\\right)$$\n", "\n", "A additional vortex located $a$ further will have a complex potential of the form\n", "\n", "$$w = \\frac{j\\Gamma}{2\\pi}\\ln \\left(z-2a\\right)$$\n", "\n", "and so on...\n", "\n", "Therefore, the complex potential representing an inifinite row of vortices (on the line $y=0$) is given by\n", "\n", "$$w = \\frac{j\\Gamma}{2\\pi}\\sum_{m=-\\infty}^{+\\infty} \\ln \\left( z-ma \\right)$$\n", "\n", "When we integrate the velocity components, in the previous notebooks, to find the stream-function and the potential, we dropped the constant of integration. Here, we decide to add a constant (not a random one!). Why not, since the differentiation will give the same results.\n", "\n", "$$w = \\frac{j\\Gamma}{2\\pi}\\sum_{m=-\\infty}^{+\\infty} \\ln \\left( z-ma \\right) + \\text{constant}$$\n", "\n", "where\n", "\n", "$$\\text{constant} = -\\frac{j\\Gamma}{2\\pi} \\sum_{m=-\\infty, m\\neq 0}^{+\\infty} \\ln \\left( -ma \\right)$$\n", "\n", "so that, the complex potential can be cast in the following form\n", "\n", "$$w = \\frac{j\\Gamma}{2\\pi}\\sum_{m=-\\infty,m\\neq 0}^{+\\infty} \\ln \\left( \\frac{z-ma}{-ma} \\right) + \\frac{j\\Gamma}{2\\pi}\\ln z$$\n", "\n", "Now, it is time do some mathematics...\n", "\n", "$$w = \\frac{j\\Gamma}{2\\pi}\\sum_{m=-\\infty,m\\neq 0}^{+\\infty} \\ln \\left( 1-\\frac{z}{ma} \\right) + \\frac{j\\Gamma}{2\\pi}\\ln z$$\n", "\n", "$$w = \\frac{j\\Gamma}{2\\pi}\\sum_{m=1}^{+\\infty} \\left\\lbrace \\ln\\left(1-\\frac{z}{ma}\\right) + \\ln\\left(1+\\frac{z}{ma}\\right) \\right\\rbrace + \\frac{j\\Gamma}{2\\pi}\\ln z$$\n", "\n", "$$w = \\frac{j\\Gamma}{2\\pi}\\sum_{m=1}^{+\\infty} \\ln\\left(1-\\frac{z^2}{m^2a^2}\\right) + \\frac{j\\Gamma}{2\\pi}\\ln z$$\n", "\n", "$$w = \\frac{j\\Gamma}{2\\pi} \\ln\\left(\\prod_{m=1}^{+\\infty}\\left(1-\\frac{z^2}{m^2a^2}\\right)\\right) + \\frac{j\\Gamma}{2\\pi}\\ln z$$\n", "\n", "$$w = \\frac{j\\Gamma}{2\\pi} \\ln\\left(z\\prod_{m=1}^{+\\infty}\\left(1-\\frac{z^2}{m^2a^2}\\right)\\right)$$\n", "\n", "$$w = \\frac{j\\Gamma}{2\\pi} \\ln\\left(z\\prod_{m=1}^{+\\infty}\\left(1-\\frac{\\left(\\frac{z\\pi}{a}\\right)^2}{m^2\\pi^2}\\right)\\right)$$\n", "\n", "The product is actually the formula for the sine and the complex potential becomes\n", "\n", "$$w = \\frac{j\\Gamma}{2\\pi}\\ln\\left(\\sin\\left(\\frac{z\\pi}{a}\\right)\\right)$$\n", "\n", "We derive the complex potential with respect to the complex variable to get the complex velocity\n", "\n", "$$\\frac{dw}{dz} = u-iv = \\frac{j\\Gamma}{2a}\\cot\\left(\\frac{z\\pi}{a}\\right)$$\n", "\n", "$$u-jv = \\frac{j\\Gamma}{2a}\\frac{\\cos\\left(\\frac{\\pi x}{a}+j\\frac{\\pi y}{a}\\right)}{\\sin\\left(\\frac{\\pi x}{a}+j\\frac{\\pi y}{a}\\right)}$$\n", "\n", "Applying trigonometric identities, we find the following expression\n", "\n", "$$u-jv = \\frac{j\\Gamma}{2a}\\frac{\\cos\\left(\\frac{\\pi x}{a}\\right)\\cosh\\left(\\frac{\\pi y}{a}\\right) - j\\sin\\left(\\frac{\\pi x}{a}\\right)\\sinh\\left(\\frac{\\pi y}{a}\\right)}{\\sin\\left(\\frac{\\pi x}{a}\\right)\\cosh\\left(\\frac{\\pi y}{a}\\right) + j\\cos\\left(\\frac{\\pi x}{a}\\right)\\sinh\\left(\\frac{\\pi y}{a}\\right)}$$\n", "\n", "which can be cast in the form (try it!)\n", "\n", "$$u-jv = \\frac{\\Gamma}{2a}\\frac{\\sinh\\left(\\frac{2\\pi y}{a}\\right)}{\\cosh\\left(\\frac{2\\pi y}{a}\\right) - \\cos\\left(\\frac{2\\pi x}{a}\\right)} + j \\frac{\\Gamma}{2a}\\frac{\\sin\\left(\\frac{2\\pi x}{a}\\right)}{\\cosh\\left(\\frac{2\\pi y}{a}\\right) - \\cos\\left(\\frac{2\\pi x}{a}\\right)}$$\n", "\n", "Therefore, the Cartesian velocity components of an infinite row of vortices are given by\n", "\n", "$$u\\left(x,y\\right) = +\\frac{\\Gamma}{2a}\\frac{\\sinh\\left(\\frac{2\\pi y}{a}\\right)}{\\cosh\\left(\\frac{2\\pi y}{a}\\right)-\\cos\\left(\\frac{2\\pi x}{a}\\right)}$$\n", "\n", "$$v\\left(x,y\\right) = -\\frac{\\Gamma}{2a}\\frac{\\sin\\left(\\frac{2\\pi x}{a}\\right)}{\\cosh\\left(\\frac{2\\pi y}{a}\\right)-\\cos\\left(\\frac{2\\pi x}{a}\\right)}$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Task:\n", "\n", "#### Compute the velocity field and plot the streamlines of an *infinite* row of vortices" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have derived the functions for the velocity components, implement them in a code cell and plot the streamlines. \n", "\n", "Can you see any difference with the previous task where the number of vortices was finite?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "Please ignore the cell below. It just loads our style for 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": 1, "text": [ "" ] } ], "prompt_number": 1 } ], "metadata": {} } ] }