{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### Content under Creative Commons Attribution license CC-BY 4.0, code under MIT license (c)2014 L.A. Barba, C.D. Cooper, G.F. Forsyth."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Riding the wave"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Convection problems"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Welcome to *Riding the wave: Convection problems*, the third module of  [\"Practical Numerical Methods with Python\"](https://openedx.seas.gwu.edu/courses/course-v1:MAE+MAE6286+2017/about). \n",
    "\n",
    "In the [first module](https://github.com/numerical-mooc/numerical-mooc/tree/master/lessons/01_phugoid), we learned about numerical integration methods for the solution of ordinary differential equations (ODEs). The [second module](https://github.com/numerical-mooc/numerical-mooc/tree/master/lessons/02_spacetime) introduced the finite difference method for numerical solution of partial differential equations (PDEs), where we need to discretize both *space* and *time*.\n",
    "\n",
    "This module explores the convection equation in more depth, applied to a traffic-flow problem.  We already introduced convection in [Lesson 1 of Module 2](https://nbviewer.jupyter.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/02_spacetime/02_01_1DConvection.ipynb). This hyperbolic equation is very interesting because the solution can develop *shocks*, or regions with very high gradient, which are difficult to resolve well with numerical methods. \n",
    "\n",
    "We will start by introducing the concept of a conservation law, closely related to the convection equation. Then we'll explore different numerical schemes and how they perform when shocks are present."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Conservation laws"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You know from (non relativistic) physics that mass is _conserved_. This is one example of a conserved quantity, but there are others (like momentum and energy) and they all obey a _conservation law_. Let's start with the more intuitive case of conservation of mass."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Conservation of mass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In any closed system, we know that the mass $M$ in the system does not change, which we can write: $\\frac{D\\,M}{Dt} =0$. When we change the point of view from a closed system to what engineers call a _control volume_, mass can move in and out of the volume and conservation of mass is now expressed by:\n",
    "\n",
    "![massconservation-CV](./figures/massconservation-CV.png)\n",
    "\n",
    "Let's imagine the control volume as a tiny cylinder of cross-section dA and length dx, like in the sketch below.\n",
    "\n",
    "![1Dcontrolvolume](./figures/1Dcontrolvolume.png)\n",
    "#### Figure 1. Tiny control volume in the shape of a cylinder.\n",
    "\n",
    "If we represent the mass density by $\\rho$, then mass is equal to $\\rho\\times$ volume. For simplicity, let's assume that mass flows in or out of the control volume only in one direction, say, the $x$-direction. Express the 1D velocity component by $u$, and conservation of mass for the control volume is translated to a mathematical expression as follows:\n",
    "\n",
    "$$\n",
    "\\begin{equation}\n",
    "\\frac{\\partial}{\\partial t}\\int_{\\text{cv}}\\rho \\, dV + \\int_{\\text{cs}}\\rho \\, u\\, dA =0\n",
    "\\end{equation}\n",
    "$$\n",
    "\n",
    "where \"cv\" stands for control volume and \"cs\" stands for control surface. The first term represents the rate of change of mass in the control volume, and the second term is the rate of flow of mass, with velocity $u$, across the control surface."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Since the control volume is very small, we can take, to leading order, $\\rho$ as a uniform quantity inside it, and the first term in equation (1) can be simplified to the time derivative of density multiplied by the volume of the tiny cylinder, $dAdx$:\n",
    "\n",
    "$$\n",
    "\\frac{\\partial}{\\partial t}\\int_{\\text{cv}}\\rho \\, dV \\rightarrow \\frac{\\partial \\rho}{\\partial t} dA dx\n",
    "$$\n",
    "\n",
    "Now, for the second term in equation (1), we have to do a little more work. The quantity inside the integral is now $\\rho u$ and, to leading order, we have to take into consideration that this quantity can change in the distance $dx$. Take $\\rho u$ to be the value in the center of the cylinder. Then the flow of mass on each side is illustrated in the figure below, where we use a Taylor expansion of the quantity $\\rho u$ around the center of the control volume (to first order)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![1Dfluxbalance](./figures/1Dfluxbalance.png)\n",
    "#### Figure 2. Flux terms on the control surfaces."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Subtracting the negative flux on the left to the positive flux on the right, we arrive at the total flux of mass across the control surfaces, the second term in equation (1):\n",
    "\n",
    "$$\n",
    "\\int_{\\text{cs}}\\rho \\, u\\, dA \\rightarrow \\frac{\\partial}{\\partial x}(\\rho u) dA dx\n",
    "$$\n",
    "\n",
    "We can now put together the equation of conservation of mass for the tiny cylindrical control volume, which after diving by $dA dx$ is:\n",
    "\n",
    "$$\n",
    "\\begin{equation}\n",
    "\\frac{\\partial \\rho}{\\partial t} + \\frac{\\partial}{\\partial x}(\\rho u)=0\n",
    "\\end{equation}\n",
    "$$\n",
    "\n",
    "This is the 1D mass conservation equation in differential form. If we take $u$ to be a constant and take it out of the spatial derivative this equation looks the same as the first PDE we studied: the linear convection equation in [Lesson 1 of Module 2](https://nbviewer.jupyter.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/02_spacetime/02_01_1DConvection.ipynb).\n",
    "But in the form shown above, it is a typical _conservation law_. The term under the spatial derivative is called the _flux_, for reasons that should be clear from our discussion above: it represents amounts of the conserved quantity flowing across the boundary of the control volume."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Dig deeper"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can follow the derivation of the full three-dimensional equation of conservation of mass for a flow on this screencast by Prof. Barba (duration 12:47)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/jpeg": "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\n",
      "text/html": [
       "\n",
       "        <iframe\n",
       "            width=\"400\"\n",
       "            height=\"300\"\n",
       "            src=\"https://www.youtube.com/embed/35unQgSaT88\"\n",
       "            frameborder=\"0\"\n",
       "            allowfullscreen\n",
       "        ></iframe>\n",
       "        "
      ],
      "text/plain": [
       "<IPython.lib.display.YouTubeVideo at 0x7f63d41cb710>"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import YouTubeVideo\n",
    "YouTubeVideo('35unQgSaT88')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### General conservation laws"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "All conservation laws express the same idea: the variation of a conserved quantity inside a control volume is due to the total flux of that quantity crossing the boundary surface (plus possibly the effect of any sources inside the volume, but let's ignore those for now).\n",
    "\n",
    "The _flux_ is a fundamental concept in conservation laws: it represents the amount of the quantity that crosses a surface per unit time. Our discussion above was limited to flow in one dimension, but in general the flux has any direction and is a vector quantity. Think about this: if the direction of flow is parallel to the surface, then no quantity comes in or out. We really only care about the component of flux perpendicular to the surface. Mathematically, for a vector flux $\\vec{F}$, the amount of the conserved quantity crossing a small surface element is:\n",
    "\n",
    "$$\n",
    "\\vec{F}\\cdot d\\vec{A}\n",
    "$$\n",
    "\n",
    "where $d\\vec{A}$ points in the direction of the outward normal to the surface. A general conservation law for a quantity $e$ is thus (still ignoring possible sources):\n",
    "\n",
    "$$\n",
    "\\begin{equation}\n",
    "\\frac{\\partial}{\\partial t}\\int_{\\text{cv}}e \\, dV + \\oint_{\\text{cs}}\\vec{F}\\cdot d\\vec{A} =0\n",
    "\\end{equation}\n",
    "$$\n",
    "\n",
    "To obtain a differential form of this conservation equation, we can apply the theorem of Gauss to the second integral, which brings the gradient of $\\vec{F}$ into play. One way to recognize a conservation law in differential form is that the _fluxes appear only under the gradient operator_.\n",
    "\n",
    "Recall the non-linear convection equation from [Lesson 1 of Module 2](https://nbviewer.jupyter.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/02_spacetime/02_01_1DConvection.ipynb). It was:\n",
    "\n",
    "$$\n",
    "\\begin{equation}\n",
    "\\frac{\\partial u}{\\partial t} + u \\frac{\\partial u}{\\partial x} = 0\n",
    "\\end{equation}\n",
    "$$\n",
    "\n",
    "If we look closely at the spatial derivative, we can rewrite this equation as\n",
    "\n",
    "$$\n",
    "\\begin{equation}\n",
    "\\frac{\\partial u}{\\partial t} + \\frac{\\partial}{\\partial x} \\left(\\frac{u^2}{2} \\right) = 0\n",
    "\\end{equation}\n",
    "$$\n",
    "\n",
    "which is the *conservation form* of the non-linear convection equation, with flux $F=\\frac{u^2}{2}$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Traffic flow model"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We've all experienced it: as rush hour approaches certain roads in or out of city centers start getting full of cars, and the speed of travel can reduce to a crawl. Sometimes, the cars stop altogether. If you're a driver, you know that the more cars on the road, the slower your trip will flow.\n",
    "\n",
    "Traffic flow models seek to describe these everyday experiences with mathematics, to help engineers design better road systems.\n",
    "\n",
    "Let's review the [Lighthill-Whitham-Richards](http://en.wikipedia.org/wiki/Macroscopic_traffic_flow_model) traffic model that was offered as an exercise at the end of Module 2. This model considers cars with a continuous *traffic density* (average number of cars per unit length of road) rather than keeping track of them individually. If $\\rho(x)=0$, there are no cars at that point $x$ of the road.  If $\\rho(x) = \\rho_{\\rm max}$, traffic is literally bumper to bumper.\n",
    "\n",
    "If the number of cars on a bounded stretch of road changes, it means that cars are entering or leaving the road somehow. _Traffic density obeys a conservation law_ (!) where the flux is the number of cars leaving the road per unit time. It is given by $F=\\rho u$—as with mass conservation, flux equals density times velocity. But don't forget your experience on the road: the speed of travel depends on the car density. Here, $u$ refers not to the speed of each individual car, but to the _traffic speed_ at a given point of the road.  \n",
    "\n",
    "You know from experience that with more cars on the road, the speed of travel decreases. It is also true that if you are traveling at fast speed, you are advised to leave a larger gap with cars ahead. These two considerations lead us to propose a monotonically decreasing $u=u(\\rho)$ function. As a first approximation, we may consider the linear function:\n",
    "\n",
    "$$\n",
    "\\begin{equation}\n",
    "u(\\rho) = u_{\\rm max} \\left(1-\\frac{\\rho}{\\rho_{\\rm max}}\\right)\n",
    "\\end{equation}\n",
    "$$\n",
    "\n",
    "![velocityvsdensity](./figures/velocityvsdensity.png)\n",
    "#### Figure 3. Traffic speed vs. traffic density.\n",
    "\n",
    "The linear model of the behavior of drivers satisfies these experimental observations:  \n",
    "1.  All drivers will approach a maximum velocity $u_{max}$ when the road is empty.\n",
    "2.  If the road is completely jampacked ($\\rho \\rightarrow \\rho_{max}$), velocity goes to zero.  \n",
    "\n",
    "That seems like a reasonable approximation of reality! \n",
    "\n",
    "Applying a conservation law to the vehicle traffic, the traffic density will obey the following transport equation:\n",
    "\n",
    "$$\n",
    "\\begin{equation}\n",
    "\\frac{\\partial \\rho}{\\partial t} + \\frac{\\partial F}{\\partial x} = 0\n",
    "\\end{equation}\n",
    "$$\n",
    "\n",
    "where $F$ is the *traffic flux*, which in the linear traffic-speed model is given by: \n",
    "\n",
    "$$\n",
    "\\begin{equation}\n",
    "F = \\rho u_{\\rm max} \\left(1-\\frac{\\rho}{\\rho_{\\rm max}}\\right)\n",
    "\\end{equation}\n",
    "$$\n",
    "\n",
    "We can now use our numerical kung-fu to solve some interesting traffic situations, and check if our simple model gives realistic results!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Green light!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's say that we are examining a road of length $4$ where the speed limit is $u_{\\rm max}=1$, fitting $10$ cars per unit length $(\\rho_{\\rm max}=10)$. Now, imagine we have an intersection with a red light at $x=2$.  At the stoplight, traffic is bumper-to-bumper, and the traffic density decreases linearly to zero as we approach the beginning of our road. Ahead of the stoplight, the road is clear.\n",
    "\n",
    "Mathematically, we can represent this situation with the following initial condition:\n",
    "\n",
    "$$\n",
    "\\begin{equation}\n",
    "\\rho(x,0) = \\left\\{\n",
    "\\begin{array}{cc}\n",
    "\\rho_{\\rm max}\\frac{x}{2} & 0 \\leq x < 2  \\\\\n",
    "0 & 2 \\leq x \\leq 4 \\\\\n",
    "\\end{array}\n",
    "\\right.\n",
    "\\end{equation}\n",
    "$$\n",
    "\n",
    "Let's see what a plot of that looks like."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy\n",
    "from matplotlib import pyplot\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Set the font family and size to use for Matplotlib figures.\n",
    "pyplot.rcParams['font.family'] = 'serif'\n",
    "pyplot.rcParams['font.size'] = 16"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def rho_green_light(x, rho_light):\n",
    "    \"\"\"\n",
    "    Computes the \"green light\" initial condition.\n",
    "    It consists of a shock with a linear distribution behind it.\n",
    "    \n",
    "    Parameters\n",
    "    ----------\n",
    "    x : numpy.ndaray\n",
    "        Locations on the road as a 1D array of floats.\n",
    "    rho_light : float\n",
    "        Car density at the stoplight.\n",
    "    \n",
    "    Returns\n",
    "    -------\n",
    "    rho : numpy.ndarray\n",
    "        The initial car density along the road as a 1D array of floats.\n",
    "    \"\"\"\n",
    "    rho = numpy.zeros_like(x)\n",
    "    mask = numpy.where(x < 2.0)\n",
    "    rho[mask] = rho_light * x[mask] / 2.0\n",
    "    return rho"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Set parameters.\n",
    "nx = 81  # number of locations on the road\n",
    "L = 4.0  # length of the road\n",
    "dx = L / (nx - 1)  # distance between two consecutive locations\n",
    "nt = 30  # number of time step to compute\n",
    "u_max = 1.0  # maximum speed allowed on the road\n",
    "rho_max = 10.0  # maximum car density allowed on the road\n",
    "rho_light = 10.0  # car density at the stoplight\n",
    "\n",
    "# Discretize the road.\n",
    "x = numpy.linspace(0.0, L, num=nx)\n",
    "\n",
    "# Compute the initial traffic density.\n",
    "rho0 = rho_green_light(x, rho_light)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot the initial car density on the road.\n",
    "pyplot.figure(figsize=(6.0, 4.0))\n",
    "pyplot.xlabel(r'$x$')\n",
    "pyplot.ylabel(r'$\\rho$')\n",
    "pyplot.grid()\n",
    "pyplot.plot(x, rho0, color='C0', linestyle='-', linewidth=2)\n",
    "pyplot.xlim(0.0, L)\n",
    "pyplot.ylim(-0.5, 11.0);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**How does the traffic behave once the light turns green?** Cars should slowly start moving forward: the density profile should move to the right. Let's see if the numerical solution agrees with that!\n",
    "\n",
    "Before we start, let's define a function to calculate the traffic flux. We'll use it in each time step of our numerical solution."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def flux(rho, u_max, rho_max):\n",
    "    \"\"\"\n",
    "    Computes the traffic flux F = V * rho.\n",
    "    \n",
    "    Parameters\n",
    "    ----------\n",
    "    rho : numpy.ndarray\n",
    "       Traffic density along the road as a 1D array of floats.\n",
    "    u_max : float\n",
    "        Maximum speed allowed on the road.\n",
    "    rho_max : float\n",
    "        Maximum car density allowed on the road.\n",
    "    \n",
    "    Returns\n",
    "    -------\n",
    "    F : numpy.ndarray\n",
    "        The traffic flux along the road as a 1D array of floats.\n",
    "    \"\"\"\n",
    "    F = rho * u_max * (1.0 - rho / rho_max)\n",
    "    return F"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Forward-time/backward-space"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Start by using a forward-time, backward-space scheme, like you used in Module 2. The discretized form of our traffic model is:\n",
    "\n",
    "$$\n",
    "\\begin{equation}\n",
    "\\frac{\\rho^{n+1}_i- \\rho^n_{i}}{\\Delta t}+ \\frac{F^n_{i}-F^n_{i-1}}{\\Delta x}=0\n",
    "\\end{equation}\n",
    "$$\n",
    "\n",
    "Like before, we'll step in time via a for-loop, and we'll operate on all spatial points simultaneously via array operations. In each time step, we also need to call the function that computes the flux. Here is a function that implements in code the forward-time/backward-space difference scheme:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def ftbs(rho0, nt, dt, dx, bc_value, *args):\n",
    "    \"\"\"\n",
    "    Computes the history of the traffic density on the road \n",
    "    at a certain time given the initial traffic density.\n",
    "    \n",
    "    Parameters\n",
    "    ----------\n",
    "    rho0 : numpy.ndarray\n",
    "        The initial car density along the road\n",
    "        as a 1D array of floats.\n",
    "    nt : integer\n",
    "        The number of time steps to compute.\n",
    "    dt : float\n",
    "        The time-step size to integrate.\n",
    "    dx : float\n",
    "        The distance between two consecutive locations.\n",
    "    bc_value : float\n",
    "        The constant density at the first station.\n",
    "    args : list or tuple\n",
    "        Positional arguments to be passed to the flux function.\n",
    "    \n",
    "    Returns\n",
    "    -------\n",
    "    rho_hist : list of numpy.ndarray objects\n",
    "        The history of the car density along the road.\n",
    "    \"\"\"\n",
    "    rho_hist = [rho0.copy()]\n",
    "    rho = rho0.copy()\n",
    "    for n in range(nt):\n",
    "        # Compute the flux.\n",
    "        F = flux(rho, *args)\n",
    "        # Advance in time.\n",
    "        rho[1:] = rho[1:] - dt / dx * (F[1:] - F[:-1])\n",
    "        # Set the left boundary condition.\n",
    "        rho[0] = bc_value\n",
    "        # Record the time-step solution.\n",
    "        rho_hist.append(rho.copy())\n",
    "    return rho_hist"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We're all good to go! \n",
    "\n",
    "**Note:** The code above saves the complete traffic density at each time step—we'll use that in a second to create animations with our results.  \n",
    "\n",
    "Running the numerical solution is easy now: we just need to call the function for evolving the initial condition with the forward-time/backward-space scheme.\n",
    "\n",
    "Let's see how that looks."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Set the time-step size based on CFL limit.\n",
    "sigma = 1.0\n",
    "dt = sigma * dx / u_max  # time-step size\n",
    "\n",
    "# Compute the traffic density at all time steps.\n",
    "rho_hist = ftbs(rho0, nt, dt, dx, rho0[0], u_max, rho_max)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's now create an animation of the traffic flow density using the `animation` module of Matplotlib."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "from matplotlib import animation\n",
    "from IPython.display import HTML"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot the initial traffic density.\n",
    "fig = pyplot.figure(figsize=(6.0, 4.0))\n",
    "pyplot.xlabel(r'$x$')\n",
    "pyplot.ylabel(r'$\\rho$')\n",
    "pyplot.grid()\n",
    "line = pyplot.plot(x, rho0,\n",
    "                    color='C0', linestyle='-', linewidth=2)[0]\n",
    "pyplot.xlim(0.0, L)\n",
    "pyplot.ylim(-0.5, 11.0)\n",
    "fig.tight_layout()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "def update_plot(n, rho_hist):\n",
    "    \"\"\"\n",
    "    Update the line y-data of the Matplotlib figure.\n",
    "    \n",
    "    Parameters\n",
    "    ----------\n",
    "    n : integer\n",
    "        The time-step index.\n",
    "    rho_hist : list of numpy.ndarray objects\n",
    "        The history of the numerical solution.\n",
    "    \"\"\"\n",
    "    fig.suptitle('Time step {:0>2}'.format(n))\n",
    "    line.set_ydata(rho_hist[n])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<video width=\"432\" height=\"288\" controls autoplay loop>\n",
       "  <source type=\"video/mp4\" src=\"data:video/mp4;base64,AAAAHGZ0eXBNNFYgAAACAGlzb21pc28yYXZjMQAAAAhmcmVlAABfc21kYXQAAAKuBgX//6rcRem9\n",
       "5tlIt5Ys2CDZI+7veDI2NCAtIGNvcmUgMTQ4IHIyNjQzIDVjNjU3MDQgLSBILjI2NC9NUEVHLTQg\n",
       "QVZDIGNvZGVjIC0gQ29weWxlZnQgMjAwMy0yMDE1IC0gaHR0cDovL3d3dy52aWRlb2xhbi5vcmcv\n",
       "eDI2NC5odG1sIC0gb3B0aW9uczogY2FiYWM9MSByZWY9MyBkZWJsb2NrPTE6MDowIGFuYWx5c2U9\n",
       "MHgzOjB4MTEzIG1lPWhleCBzdWJtZT03IHBzeT0xIHBzeV9yZD0xLjAwOjAuMDAgbWl4ZWRfcmVm\n",
       "PTEgbWVfcmFuZ2U9MTYgY2hyb21hX21lPTEgdHJlbGxpcz0xIDh4OGRjdD0xIGNxbT0wIGRlYWR6\n",
       "b25lPTIxLDExIGZhc3RfcHNraXA9MSBjaHJvbWFfcXBfb2Zmc2V0PS0yIHRocmVhZHM9OSBsb29r\n",
       "YWhlYWRfdGhyZWFkcz0xIHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFj\n",
       "ZWQ9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTMgYl9weXJh\n",
       "bWlkPTIgYl9hZGFwdD0xIGJfYmlhcz0wIGRpcmVjdD0xIHdlaWdodGI9MSBvcGVuX2dvcD0wIHdl\n",
       "aWdodHA9MiBrZXlpbnQ9MjUwIGtleWludF9taW49MTAgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVz\n",
       "aD0wIHJjX2xvb2thaGVhZD00MCByYz1jcmYgbWJ0cmVlPTEgY3JmPTIzLjAgcWNvbXA9MC42MCBx\n",
       "cG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IGlwX3JhdGlvPTEuNDAgYXE9MToxLjAwAIAAABNnZYiE\n",
       "AD///vdonwKbWkN6gOSVxSXbT4H/rBB7f57jFEA1ZjNHoQ/rFYZo7KjSHtk4thOx/V9USJroc6+w\n",
       "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\n",
       "\">\n",
       "  Your browser does not support the video tag.\n",
       "</video>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Create an animation of the traffic density.\n",
    "anim = animation.FuncAnimation(fig, update_plot,\n",
    "                               frames=nt, fargs=(rho_hist,),\n",
    "                               interval=100)\n",
    "# Display the video.\n",
    "HTML(anim.to_html5_video())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Yikes! The solution is blowing up.** This didn't happen in your traffic-flow exercise (coding assignment) for Module 2! (Thankfully.) What is going on? Is there a bug in the code?\n",
    "\n",
    "No need to panic. Let's take a closer look at the equation we are solving:\n",
    "\n",
    "$$\n",
    "\\begin{equation}\n",
    "\\frac{\\partial \\rho}{\\partial t} + \\frac{\\partial F}{\\partial x} = 0\n",
    "\\end{equation}\n",
    "$$\n",
    "\n",
    "Using the chain rule of calculus, rewrite is as follows:\n",
    "\n",
    "$$\n",
    "\\begin{equation}\n",
    "\\frac{\\partial \\rho}{\\partial t} + \\frac{\\partial F}{\\partial \\rho} \\frac{\\partial \\rho}{\\partial x} = 0\n",
    "\\end{equation}\n",
    "$$\n",
    "\n",
    "This form of the equation looks like the nonlinear convection equation from [Lesson 1 of Module 2](https://nbviewer.jupyter.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/02_spacetime/02_01_1DConvection.ipynb), right? This is a wave equation where the wave speed is $u_{\\rm wave} = \\frac{\\partial F}{\\partial\\rho}$. That term is:\n",
    "\n",
    "$$\n",
    "\\begin{equation}\n",
    "u_{\\rm wave} = \\frac{\\partial F}{\\partial \\rho} = u_{\\rm max} \\left( 1-2\\frac{\\rho}{\\rho_{\\rm max}} \\right)\n",
    "\\end{equation}\n",
    "$$\n",
    "\n",
    "See how the wave speed changes sign at $\\rho = \\rho_{\\rm max}/2$? That means that for the initial conditions given for the green-light problem, the part of the wave under $\\rho = \\rho_{\\rm max}/2$ will want to move right, whereas the part of the wave over this mark, will move left! \n",
    "\n",
    "There is no real problem with that in terms of the model, but a scheme that is backward in space is *unstable* for negative values of the wave speed. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Upwind schemes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Maybe you noticed that the backward-space discretization is spatially biased: we include the points $i$ and $i-1$ in the formula. Look again at the stencil and you'll see what we mean."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![FTBS_stencil](./figures/FTBS_stencil.png)\n",
    "#### Figure 4. Stencil of forward-time/backward-space."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In fact, the spatial bias was meant to be in the direction of propagation of the wave—this was true when we solved the convection equation (with positive wave speed $c$), but now we have some problems. Discretization schemes that are biased in the direction that information propagates are called _upwind schemes_.\n",
    "\n",
    "Remember when we discussed the characteristic lines for the linear convection equation in [lesson 1 of the previous module](https://nbviewer.jupyter.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/02_spacetime/02_01_1DConvection.ipynb)? Compare the sketch of the characteristic lines with the stencil above. The point is that there is an inherent directionality in the physics, and we want the numerical scheme to have the same directionality. This is one example of _choosing an appropriate scheme_ for the physical problem.\n",
    "\n",
    "If we wanted to solve the convection equation with negative wave speed, $c<0$, we would need a spatial bias \"slanting left,\" which we would obtain by using the points $i$ and $i+1$ in the formula.\n",
    "\n",
    "But if we have waves traveling in both directions, we are in a bit of a bind. One way to avoid this problem with our traffic flow model is to simply use an initial condition that doesn't produce negative speed. This should work. But later we will learn about other numerical schemes that are able to handle waves in both directions."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Just for a sanity check, let's try the forward-time/backward-space scheme with the initial conditions\n",
    "\n",
    "\\begin{equation}\\rho(x,0) = \\left\\{ \\begin{array}{cc}\n",
    "2.5 x & 0 \\leq x < 2  \\\\\n",
    "0 & 2 \\leq x \\leq 4 \\\\ \\end{array} \\right.\\end{equation}\n",
    "\n",
    "If all values of $\\rho \\leq \\rho_{\\rm max}/2$, then $\\frac{\\partial F}{\\partial \\rho}$ is positive everywhere. For these conditions, our forward-time/backward-space scheme shouldn't have any trouble, as all wave speeds are positive."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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mxcXF3tFRYWffvrp/vjjj7e9ZzQa9T59+viPfvSjQ+prbm72T3/6056Xl+cLFiw47p/v/f7MgBUe52dxql5nIyISuoqKCvr378/XvvY1br/9dsyM++67j1deeYWXXnqp7aLJiooKysvL2+7nE4lE+P73v09eXh7Nzc1EIhG6dOkCxK6TmTt3Lnv27MHd2bt3L7m5uXTr1o1rr72Wc845h9/85jdMmzatrY4XX3yRd999l4svvviQ+mbOnMkf//hHvvOd71BYWNh2JAaxo7FETqcpbERETsD+/fuprKzkxz/+MevXr+eaa67hwIEDjB8/nqVLl3LqqbFuWps2bSIajXLyyScDsG7dOrp27cqAAbErOlauXMnAgQMpLCzkb3/7G3fffTePPfYYffr04ZlnnmHmzJkUFhaya9cuHnnkEYqKitqe2+rRRx9l7Nix7wmPJ598EoDbb7+d228/tHfxrbfemtBrgRQ2IiIn4JVXXiEajXLWWWfxla98hTvuuOOI+1VUVByyzHj58uWH/P7gxysqKjjjjDPo06cPO3bs4F//9V8566yz2LdvHxdeeCGzZs0iOzubm266iaVLl7a9xmOPPXbIeZ9W69evb6ef9oNT2IiInICKigpyc3Pf94T74WGzYsWKo4bNF77wBS6++GJGjRrFqFGjGDx4MGPGjGHq1Kl8+ctf5vLLL8fdmT17Ng8++CCf/exnAXj77bcD+Anbl8JGROQEVFRUMHLkSHJzc4+53/e///1Dfv/DH/7wkN/fe++9bb8ePHgwr7322nte4/rrr2/7tZmxfPnyEyk5VAobEZET8Nvf/jbsElJKUncQEBGR9KCwERGRwClsREQkcAobEUkYj7MPmoSvvf+sFDYikhDZ2dlEIpGwy5A4NTU1kZV1+H0rT5zCRkQSIj8/P6Et9+WDqa6ubtdbaStsRCQhiouL2bFjB3V1dZpOS1LuTmNjIzt37mTPnj1079693V5b19mISELk5+fTq1cvtm7dSkNDQ0Lfu76+nvz8/IS+Z6rKysqic+fODBw48Kh3/DwRChsRSZiioiKKiooS/r7l5eWMHj064e8r/6BpNBERCZzCRkREAqewERGRwClsREQkcAobEREJnMJGREQCp7AREZHAJX3YmNlYM3vSzFaa2RtmtszMPh12XSIiEr+kDhszGwwsBHYCp7n7acAvgYfN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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Modify some parameters.\n",
    "nt = 40  # number of time step to compute\n",
    "rho_light = 5.0  # car density at the stoplight\n",
    "\n",
    "# Compute the initial traffic density.\n",
    "rho0 = rho_green_light(x, rho_light)\n",
    "\n",
    "# Plot the initial traffic density.\n",
    "fig = pyplot.figure(figsize=(6.0, 4.0))\n",
    "pyplot.xlabel(r'$x$')\n",
    "pyplot.ylabel(r'$\\rho$')\n",
    "pyplot.grid()\n",
    "line = pyplot.plot(x, rho0,\n",
    "                   color='C0', linestyle='-', linewidth=2)[0]\n",
    "pyplot.hlines(rho_max / 2.0, 0.0, L,\n",
    "              label=r'$\\rho_{max} / 2$',\n",
    "              color='black', linestyle='--', linewidth=2)\n",
    "pyplot.legend()\n",
    "pyplot.xlim(0.0, L)\n",
    "pyplot.ylim(-0.5, 11.0)\n",
    "fig.tight_layout()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Compute the traffic density at all time steps.\n",
    "rho_hist = ftbs(rho0, nt, dt, dx, rho0[0], u_max, rho_max)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<video width=\"432\" height=\"288\" controls autoplay loop>\n",
       "  <source type=\"video/mp4\" src=\"data:video/mp4;base64,AAAAHGZ0eXBNNFYgAAACAGlzb21pc28yYXZjMQAAAAhmcmVlAABiuW1kYXQAAAKuBgX//6rcRem9\n",
       "5tlIt5Ys2CDZI+7veDI2NCAtIGNvcmUgMTQ4IHIyNjQzIDVjNjU3MDQgLSBILjI2NC9NUEVHLTQg\n",
       "QVZDIGNvZGVjIC0gQ29weWxlZnQgMjAwMy0yMDE1IC0gaHR0cDovL3d3dy52aWRlb2xhbi5vcmcv\n",
       "eDI2NC5odG1sIC0gb3B0aW9uczogY2FiYWM9MSByZWY9MyBkZWJsb2NrPTE6MDowIGFuYWx5c2U9\n",
       "MHgzOjB4MTEzIG1lPWhleCBzdWJtZT03IHBzeT0xIHBzeV9yZD0xLjAwOjAuMDAgbWl4ZWRfcmVm\n",
       "PTEgbWVfcmFuZ2U9MTYgY2hyb21hX21lPTEgdHJlbGxpcz0xIDh4OGRjdD0xIGNxbT0wIGRlYWR6\n",
       "b25lPTIxLDExIGZhc3RfcHNraXA9MSBjaHJvbWFfcXBfb2Zmc2V0PS0yIHRocmVhZHM9OSBsb29r\n",
       "YWhlYWRfdGhyZWFkcz0xIHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFj\n",
       "ZWQ9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTMgYl9weXJh\n",
       "bWlkPTIgYl9hZGFwdD0xIGJfYmlhcz0wIGRpcmVjdD0xIHdlaWdodGI9MSBvcGVuX2dvcD0wIHdl\n",
       "aWdodHA9MiBrZXlpbnQ9MjUwIGtleWludF9taW49MTAgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVz\n",
       "aD0wIHJjX2xvb2thaGVhZD00MCByYz1jcmYgbWJ0cmVlPTEgY3JmPTIzLjAgcWNvbXA9MC42MCBx\n",
       "cG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IGlwX3JhdGlvPTEuNDAgYXE9MToxLjAwAIAAABspZYiE\n",
       "ABD//veBvzLLXyK6yXH5530srM885F1+3+e4/zANuY1mmMiBX1pQXKcOCzJW0vIgKroRGtyd1ncS\n",
       "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\n",
       "\">\n",
       "  Your browser does not support the video tag.\n",
       "</video>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Create an animation of the traffic density.\n",
    "anim = animation.FuncAnimation(fig, update_plot,\n",
    "                               frames=nt, fargs=(rho_hist,),\n",
    "                               interval=100)\n",
    "# Display the animation.\n",
    "HTML(anim.to_html5_video())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Phew!  It works! Try this out yourself with different initial conditions. \n",
    "\n",
    "Also, you can easily create a new function `ftfs` to do a forward-time/forward-space scheme, which is stable for negative wave speeds. Unfortunately, forward in space is unstable for positive wave speeds.  If you don't want it blowing up, make sure the wave speed is negative everywhere: $u_{\\rm wave} = \\frac{\\partial F}{\\partial \\rho} < 0 \\ \\forall \\ x$.\n",
    "\n",
    "Look at that solution again, and you'll get some nice insights of the real physical problem. See how on the trailing edge, a shock is developing? In the context of the traffic flow problem, a shock is a sign of a traffic jam: a region where traffic is heavy and slow next to a region that is free of cars. In the initial condition, the cars in the rear end of the triangle see a mostly empty road (traffic density is low!).  They see an empty road and speed up, accordingly.  The cars in the peak of the triangle are moving pretty slowly because traffic density is higher there.  Eventually the cars that started in the rear will catch up with the rest and form a traffic jam."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Beware the CFL!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Lesson 2 of Module 2](https://nbviewer.jupyter.org/github/numerical-mooc/numerical-mooc/blob/master/lessons/02_spacetime/02_02_CFLCondition.ipynb) discusses the CFL condition for the linear convection equation. To refresh your memory, for a constant wave speed $u_{\\rm wave} = c$:\n",
    "\n",
    "$$\n",
    "\\begin{equation}\n",
    "\\sigma = c\\frac{\\Delta t}{\\Delta x} < 1\n",
    "\\end{equation}\n",
    "$$\n",
    "\n",
    "What happens for non-linear equations? The wave speed is space- and time-dependent, $u_{\\rm wave} = u_{\\rm wave}(x,t)$, and the CFL condition needs to apply for every point in space, at every instant of time. We just need $\\sigma>1$ in one spot, for the whole solution to blow up! \n",
    "\n",
    "Let's generalize the CFL condition to\n",
    "\n",
    "$$\n",
    "\\begin{equation}\n",
    "\\sigma = \\max\\left[ \\left| u_{\\rm wave} \\right| \\frac{\\Delta t}{\\Delta x} \\right] < 1\n",
    "\\end{equation}\n",
    "$$\n",
    "\n",
    "which in our case is\n",
    "\n",
    "$$\n",
    "\\begin{equation}\n",
    "\\sigma = \\max\\left[ u_{\\rm max} \\left| 1-\\frac{2 \\rho}{\\rho_{\\rm max}} \\right| \\frac{\\Delta t}{\\Delta x} \\right] < 1\n",
    "\\end{equation}\n",
    "$$\n",
    "\n",
    "Here, the closer $\\rho$ is to zero, the more likely it is to be unstable."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Green light and CFL"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We know that the green-light problem with density at the stop light $\\rho = \\rho_{\\rm light} = 4$ is stable using a forward-time/backward -space scheme. Earlier, we used $u_{\\rm max} = 1$, and $\\Delta t/\\Delta x=1$, which gives a CFL $= 1$, when $\\rho = 0$. \n",
    "\n",
    "What if we change the conditions slightly, say $u_{\\rm max} = 1.1$? "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<video width=\"432\" height=\"288\" controls autoplay loop>\n",
       "  <source type=\"video/mp4\" src=\"data:video/mp4;base64,AAAAHGZ0eXBNNFYgAAACAGlzb21pc28yYXZjMQAAAAhmcmVlAABuCm1kYXQAAAKuBgX//6rcRem9\n",
       "5tlIt5Ys2CDZI+7veDI2NCAtIGNvcmUgMTQ4IHIyNjQzIDVjNjU3MDQgLSBILjI2NC9NUEVHLTQg\n",
       "QVZDIGNvZGVjIC0gQ29weWxlZnQgMjAwMy0yMDE1IC0gaHR0cDovL3d3dy52aWRlb2xhbi5vcmcv\n",
       "eDI2NC5odG1sIC0gb3B0aW9uczogY2FiYWM9MSByZWY9MyBkZWJsb2NrPTE6MDowIGFuYWx5c2U9\n",
       "MHgzOjB4MTEzIG1lPWhleCBzdWJtZT03IHBzeT0xIHBzeV9yZD0xLjAwOjAuMDAgbWl4ZWRfcmVm\n",
       "PTEgbWVfcmFuZ2U9MTYgY2hyb21hX21lPTEgdHJlbGxpcz0xIDh4OGRjdD0xIGNxbT0wIGRlYWR6\n",
       "b25lPTIxLDExIGZhc3RfcHNraXA9MSBjaHJvbWFfcXBfb2Zmc2V0PS0yIHRocmVhZHM9OSBsb29r\n",
       "YWhlYWRfdGhyZWFkcz0xIHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFj\n",
       "ZWQ9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTMgYl9weXJh\n",
       "bWlkPTIgYl9hZGFwdD0xIGJfYmlhcz0wIGRpcmVjdD0xIHdlaWdodGI9MSBvcGVuX2dvcD0wIHdl\n",
       "aWdodHA9MiBrZXlpbnQ9MjUwIGtleWludF9taW49MTAgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVz\n",
       "aD0wIHJjX2xvb2thaGVhZD00MCByYz1jcmYgbWJ0cmVlPTEgY3JmPTIzLjAgcWNvbXA9MC42MCBx\n",
       "cG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IGlwX3JhdGlvPTEuNDAgYXE9MToxLjAwAIAAABp4ZYiE\n",
       "AD///vdonwKbWkN6gOSVxSXbT4H/rBB7f57jFEBQqEfPgvWIZ595spw4LMlhy8JlZkbaZFJrOwFl\n",
       "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\n",
       "\">\n",
       "  Your browser does not support the video tag.\n",
       "</video>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Set parameters.\n",
    "rho_light = 4.0\n",
    "u_max = 1.1\n",
    "\n",
    "# Compute the initial traffic density.\n",
    "rho0 = rho_green_light(x, rho_light)\n",
    "\n",
    "# Compute the traffic density at all time steps.\n",
    "rho_hist = ftbs(rho0, nt, dt, dx, rho0[0], u_max, rho_max)\n",
    "\n",
    "# Create an animation of the traffic density.\n",
    "anim = animation.FuncAnimation(fig, update_plot,\n",
    "                               frames=nt, fargs=(rho_hist,),\n",
    "                               interval=100)\n",
    "# Display the video.\n",
    "HTML(anim.to_html5_video())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "That failed miserably! Only by changing $u_{\\rm max}$ to $1.1$, even an algorithm that we know is stable for this problem, fails. Since we kept $\\Delta t/\\Delta x=1$, the CFL number for $\\rho=0$ is $1.1$. See where the instability begins? Beware the CFL!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## References"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* Neville D. Fowkes and John J. Mahony, *\"An Introduction to Mathematical Modelling,\"* Wiley & Sons, 1994. Chapter 14: Traffic Flow.\n",
    "\n",
    "* M. J. Lighthill and G. B. Whitham (1955), On kinematic waves. II. Theory of traffic flow and long crowded roads, _Proc. Roy. Soc. A_, Vol. 229, pp. 317–345. [PDF from amath.colorado.edu](https://amath.colorado.edu/sites/default/files/2013/09/1710796241/PRSA_Lighthill_1955.pdf), checked Oct. 14, 2014. [Original source](http://rspa.royalsocietypublishing.org/content/229/1178/317.short) on the Royal Society site."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "###### The cell below loads the style of the notebook."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<link href='http://fonts.googleapis.com/css?family=Alegreya+Sans:100,300,400,500,700,800,900,100italic,300italic,400italic,500italic,700italic,800italic,900italic' rel='stylesheet' type='text/css'>\n",
       "<link href='http://fonts.googleapis.com/css?family=Arvo:400,700,400italic' rel='stylesheet' type='text/css'>\n",
       "<link href='http://fonts.googleapis.com/css?family=PT+Mono' rel='stylesheet' type='text/css'>\n",
       "<link href='http://fonts.googleapis.com/css?family=Shadows+Into+Light' rel='stylesheet' type='text/css'>\n",
       "<link href='http://fonts.googleapis.com/css?family=Nixie+One' rel='stylesheet' type='text/css'>\n",
       "<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro' rel='stylesheet' type='text/css'>\n",
       "<style>\n",
       "\n",
       "@font-face {\n",
       "    font-family: \"Computer Modern\";\n",
       "    src: url('http://mirrors.ctan.org/fonts/cm-unicode/fonts/otf/cmunss.otf');\n",
       "}\n",
       "\n",
       "#notebook_panel { /* main background */\n",
       "    background: rgb(245,245,245);\n",
       "}\n",
       "\n",
       "div.cell { /* set cell width */\n",
       "    width: 750px;\n",
       "}\n",
       "\n",
       "div #notebook { /* centre the content */\n",
       "    background: #fff; /* white background for content */\n",
       "    width: 1000px;\n",
       "    margin: auto;\n",
       "    padding-left: 0em;\n",
       "}\n",
       "\n",
       "#notebook li { /* More space between bullet points */\n",
       "    margin-top:0.8em;\n",
       "}\n",
       "\n",
       "/* draw border around running cells */\n",
       "div.cell.border-box-sizing.code_cell.running { \n",
       "    border: 1px solid #111;\n",
       "}\n",
       "\n",
       "/* Put a solid color box around each cell and its output, visually linking them*/\n",
       "div.cell.code_cell {\n",
       "    background-color: rgb(256,256,256); \n",
       "    border-radius: 0px; \n",
       "    padding: 0.5em;\n",
       "    margin-left:1em;\n",
       "    margin-top: 1em;\n",
       "}\n",
       "\n",
       "div.text_cell_render{\n",
       "    font-family: 'Alegreya Sans' sans-serif;\n",
       "    line-height: 140%;\n",
       "    font-size: 125%;\n",
       "    font-weight: 400;\n",
       "    width:600px;\n",
       "    margin-left:auto;\n",
       "    margin-right:auto;\n",
       "}\n",
       "\n",
       "\n",
       "/* Formatting for header cells */\n",
       ".text_cell_render h1 {\n",
       "    font-family: 'Nixie One', serif;\n",
       "    font-style:regular;\n",
       "    font-weight: 400;    \n",
       "    font-size: 45pt;\n",
       "    line-height: 100%;\n",
       "    color: rgb(0,51,102);\n",
       "    margin-bottom: 0.5em;\n",
       "    margin-top: 0.5em;\n",
       "    display: block;\n",
       "}\n",
       "\n",
       ".text_cell_render h2 {\n",
       "    font-family: 'Nixie One', serif;\n",
       "    font-weight: 400;\n",
       "    font-size: 30pt;\n",
       "    line-height: 100%;\n",
       "    color: rgb(0,51,102);\n",
       "    margin-bottom: 0.1em;\n",
       "    margin-top: 0.3em;\n",
       "    display: block;\n",
       "}\t\n",
       "\n",
       ".text_cell_render h3 {\n",
       "    font-family: 'Nixie One', serif;\n",
       "    margin-top:16px;\n",
       "    font-size: 22pt;\n",
       "    font-weight: 600;\n",
       "    margin-bottom: 3px;\n",
       "    font-style: regular;\n",
       "    color: rgb(102,102,0);\n",
       "}\n",
       "\n",
       ".text_cell_render h4 {    /*Use this for captions*/\n",
       "    font-family: 'Nixie One', serif;\n",
       "    font-size: 14pt;\n",
       "    text-align: center;\n",
       "    margin-top: 0em;\n",
       "    margin-bottom: 2em;\n",
       "    font-style: regular;\n",
       "}\n",
       "\n",
       ".text_cell_render h5 {  /*Use this for small titles*/\n",
       "    font-family: 'Nixie One', sans-serif;\n",
       "    font-weight: 400;\n",
       "    font-size: 16pt;\n",
       "    color: rgb(163,0,0);\n",
       "    font-style: italic;\n",
       "    margin-bottom: .1em;\n",
       "    margin-top: 0.8em;\n",
       "    display: block;\n",
       "}\n",
       "\n",
       ".text_cell_render h6 { /*use this for copyright note*/\n",
       "    font-family: 'PT Mono', sans-serif;\n",
       "    font-weight: 300;\n",
       "    font-size: 9pt;\n",
       "    line-height: 100%;\n",
       "    color: grey;\n",
       "    margin-bottom: 1px;\n",
       "    margin-top: 1px;\n",
       "}\n",
       "\n",
       ".CodeMirror{\n",
       "    font-family: \"Source Code Pro\";\n",
       "    font-size: 90%;\n",
       "}\n",
       "\n",
       ".alert-box {\n",
       "    padding:10px 10px 10px 36px;\n",
       "    margin:5px;\n",
       "}\n",
       "\n",
       ".success {\n",
       "    color:#666600;\n",
       "    background:rgb(240,242,229);\n",
       "}\n",
       "</style>\n",
       "\n",
       "<script>\n",
       "    MathJax.Hub.Config({\n",
       "                        TeX: {\n",
       "                            extensions: [\"AMSmath.js\"],\n",
       "                            equationNumbers: { autoNumber: \"AMS\", useLabelIds: true}\n",
       "                            },\n",
       "                        tex2jax: {\n",
       "                            inlineMath: [ ['$','$'], [\"\\\\(\",\"\\\\)\"] ],\n",
       "                            displayMath: [ ['$$','$$'], [\"\\\\[\",\"\\\\]\"] ]\n",
       "                            },\n",
       "                        displayAlign: 'center', // Change this to 'center' to center equations.\n",
       "                        \"HTML-CSS\": {\n",
       "                            styles: {'.MathJax_Display': {\"margin\": 4}}\n",
       "                            }\n",
       "                        });\n",
       "    MathJax.Hub.Queue(\n",
       "                      [\"resetEquationNumbers\", MathJax.InputJax.TeX],\n",
       "                      [\"PreProcess\", MathJax.Hub],\n",
       "                      [\"Reprocess\", MathJax.Hub]\n",
       "                     );\n",
       "</script>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.core.display import HTML\n",
    "css_file = '../../styles/numericalmoocstyle.css'\n",
    "HTML(open(css_file, 'r').read())"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (MOOC)",
   "language": "python",
   "name": "py36-mooc"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}