diff --git a/Amiya Project/Final Version/Rayleigh Benard Convection - 4 - notebook.ipynb b/Amiya Project/Final Version/Rayleigh Benard Convection - 4 - notebook.ipynb new file mode 100644 index 0000000..8ebdd10 --- /dev/null +++ b/Amiya Project/Final Version/Rayleigh Benard Convection - 4 - notebook.ipynb @@ -0,0 +1,541 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Rayleigh-Benard Convection" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![alt text](images/Benard cells 3D.jpg)\n", + "\n", + "Natural convection is a mechanism where motion is induced in a fluid, not \n", + "through artificial means but by the effects of bouyancy. One of the most commonly studied convection phenomenon, is the Rayleigh-Benard convection. When a thin layer of fluid is heated from below, once the temperature difference, between the top and bottom fluid layers, grows large enough, convection cells, also called Benard cells, form within the fluid. As a result, some interesting patterns can be observed in the fluid.\n", + "\n", + "![alt text](images/Bénard_cells_convection.ogv.jpg)\n", + "\n", + "The cells are named after, Henri Benard, who conducted some of the earliest experiments on convection during the 1900s. Inspired by Benard's experiments, in 1916, Baron Rayleigh, John William Strutt, approached the problem his own way. Rayleigh was more interested in the stability aspect of Benard's problem. He showed that when the temperature gradient is high enough, instability would occur, leading to the formation of Benard cells. This behaviour is governed by the Rayleigh number. A non dimensional parameter of fluids, that relates the fluids rate of expansion due to heating, with the fluids viscosity. When this exceeds a certain critical value, the thermal energy within the fluid becomes strong enough to overcome the viscous forces, leading to the onset of convection.\n", + "\n", + "$$Ra = \\frac{\\alpha \\Delta Tgh^3}{\\nu D }$$\n", + "\n", + "Where,\n", + " $$\\alpha = thermal\\ expansion\\ coefficient\\ $$ \n", + " $$\\nu = kinematic\\ viscosity\\$$\n", + " $$D = thermal\\ diffusivity\\$$\n", + "\n", + "\n", + " \n", + "Experimental analysis has shown that the critical number is dependant on the boundary conditions of the problem. For example, for a case where a fluid is placed between and plate and open air, the critical value is less than if it were to be placed between to rigid plates. For this case, we will be studying the latter case. It is easier to keep the temperature of the colder surface constant and uniform with these conditions. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Problem Setup" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this case, we will be considering a layer of fluid placed between to rigid plates.\n", + "\n", + "![alt text](images/Set-up.jpg)\n", + "\n", + "The length of the fluid is assumed to be sufficiently larger than the height, so that it can be considered infinite. Benard's original experiments, used a height 1 mm and a length of 20 cm.(Benard cells and Taylor Vortices)\n", + "\n", + "There are four boundary conditions. Two on each of the rigid plates. The temperatures at the plates are assumed to be constant and the no slip condition is applied.\n", + "\n", + "$$T_{(x,t)}|_{y=0} = T_{o}$$\n", + "$$T_{(x,t)}|_{y=h} = T_{1}$$\n", + "$$u_{(x,t)}|_{y=0} = 0$$\n", + "$$u_{(x,t)}|_{y=h} = 0$$\n", + "\n", + "For initial conditions, the fluid is at rest and the temperature is assumed to be linearly distributed.\n", + "\n", + "$$T_{(x,t)}|_{t=0} = T_{o} + \\frac{y}{h}(T_{1}-T{o})$$\n", + "$$u_{(x,t)}|_{t=0} = 0$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Governing Equations" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The governing equations for this case, are derived by applying the Boussinesq approximation to the Navier-Stokes equations. The Boussinesq approximation neglects all density changes in the momentum and continuity equations, except for the gravity term. The assumption is, that the density changes are small compared to the velocity gradients. The gravitational constant is, however, strong enough to make it relevant.\n", + "\n", + "$$\\nabla \\cdot u = 0$$\n", + "$$\\frac{\\partial u}{\\partial t} + u\\cdot \\nabla u = -\\frac{1}{\\rho_{o}}\\nabla p + \\frac{\\rho}{\\rho_{o}}g + \\nu\\nabla^2u$$\n", + "\n", + "Under the same assumption, the density can be shown to have a linear dependancy on the temperature.\n", + "\n", + "$$\\rho = \\rho_{o}(1-\\alpha(T-T_{o})$$\n", + "\n", + "And finally, the thermal energy equation can be approximated to a relatively familiar form.\n", + "\n", + "$$\\frac{\\partial T}{\\partial t} + u\\cdot \\nabla T = D\\nabla^2T$$\n", + "\n", + "Where the thermal diffusivity, $$D = \\frac{k}{\\rho c}$$\n", + "\n", + "\n", + "Also, for this particular case, I will be modelling water. For temperatures between 0 and 370 degrees C, the viscosity of water can be found using the following relationship.\n", + "\n", + "$$\\nu = \\frac{1}{rho}x2.414x10^{-5}x10^{\\frac{247.8}{T-140}}$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Discretization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this problem, I have decided to apply a forward-time central-space discretization scheme. As the boundary conditions for the pressure, depend on the fluid velocity, which is in turn dependant on the pressure, they are difficult to uncouple. One way to decouple the pressure and velocity terms, is by using Chorin's projection method. This is a two step process, not unlike the MacCormack method.\n", + "\n", + "An intermediate velocity term is first calcualted, free of the pressure gradient. \n", + "\n", + "$$\\frac{\\partial u}{\\partial t} + u\\cdot \\nabla u = \\frac{\\rho}{\\rho_{o}}g + \\nu\\nabla^2u$$\n", + "\n", + "This is then used to calculate the pressure gradient for the next time step, which calcualates the next iteration of the velocity field. To find the intermediate velocity, 'u_star', we discretize the above equation using forward-time central space scheme.\n", + "\n", + "$$u_{i,j}^{*} = u_{I,j}^{n} + dt(- \\frac{u_{i,j}^{n}}{2\\delta}(u_{i+1,j}^{n} - u_{i-1,j}^{n} + u_{i,j+1}^{n} - u_{i,j-1}^{n}) + \\frac{\\nu_{i,j}}{\\delta^2}(u_{i+1,j}^{n} + u_{i-1,j}^{n} + u_{i,j+1}^{n} + u_{i,j-1}^{n} - 4u_{i,j}^{n}))$$\n", + "\n", + "Where,\n", + "$$\\delta = dx = dy$$\n", + "\n", + "On taking the divergence of the momentum equation and using the continuity equation, we end up with a Poisson's equation, relating the pressure with u_star.\n", + "\n", + "$$-\\nabla^2 p = -\\frac{\\rho_{o}}{dt}\\nabla \\cdot u^{*}$$\n", + "\n", + "In discretized form,\n", + "\n", + "$$p_{i,j}^{n+1} = \\frac{1}{4}(p_{i+1,j}^{n} + p_{i-1,j}^{n} + p_{i,j+1}^{n} + p_{i,j-1}^{n} - \\frac{\\rho_{o}}{dt}\\delta u_{i,j}^{*})$$\n", + "\n", + "This equation can be solved using the iterative method learned in module 5. Once the pressure distribution is found, we are finally ready to calculate the actual velocity and the temperature for the next time step.\n", + "\n", + "$$u_{i,j}^{n+1} = u_{i,j}^{n} + dt(-\\frac{u_{i,j}^{n}}{2\\delta}(u_{i+1,j}^{n} - u_{i-1,j}^{n} + u_{i,j+1}^{n} - u_{i,j-1}^{n}) - \\frac{1}{2\\rho_{o}\\delta}(p_{i+1,j}^{n} - p_{i-1,j}^{n} + p_{i,j+1}^{n} - p_{i,j-1}^{n}) + \\frac{\\nu_{i,j}}{\\delta^2}(u_{i+1,j}^{n} + u_{i-1,j}^{n} + u_{i,j+1}^{n} + u_{i,j-1}^{n} - 4u_{i,j}^{n})$$\n", + "\n", + "$$T_{i,j}^{n+1} = T_{i,j}^{n} + dt(-\\frac{u_{i,j}^{n}}{2\\delta}(T_{i+1,j}^{n} - T_{i-1,j}^{n} + T_{i,j+1}^{n} - T_{i,j-1}^{n}) + \\frac{k}{c\\rho_{i,j}\\delta^2}(T_{i+1,j}^{n} + T_{i-1,j}^{n} + T_{i,j+1}^{n} + T_{i,j-1}^{n} - 4T_{i,j}^{n})$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Numerical Simulation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We start by importing our usual libraries, with the addition of the laplace_helper provided for module 5." + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from mpl_toolkits.mplot3d import Axes3D\n", + "%matplotlib inline\n", + "from matplotlib import rcParams, cm\n", + "rcParams['font.family'] = 'serif'\n", + "rcParams['font.size'] = 16\n", + "from laplace_helper import L2_rel_error" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Setting up the problem." + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "delT = 120.92877677020469 Tl = 140.9287767702047\n" + ] + } + ], + "source": [ + "##Domain setup\n", + "L = 1 #Domain Length\n", + "H = 0.001 #Domain Height\n", + "\n", + "nxy = 51 #Grid points for x and y\n", + "nt = 3000 #Time steps\n", + "\n", + "dxy = L/(nxy-1) #Grid spacing for x and y\n", + "\n", + "x = np.linspace(0,L,nxy)\n", + "y = np.linspace(0,H,nxy)\n", + "\n", + "\n", + "##Fluid Properties\n", + "alpha = 207*10**(-6) #Volume expansion coefficient of water @ 20 C\n", + "k = 0.6 #Thermal conductivity of water @ 20 C\n", + "\n", + "ReC = 1708 #Critical Rayleigh number for two rigid body boundary condition\n", + "g = 9.81\n", + "D = 1.43E-7 #Thermal diffusivity of water\n", + "c = k/D\n", + "rho_i = 1000 #Density of water @ 20 C\n", + "\n", + "\n", + "\n", + "\n", + "##Initial Parameters\n", + "\n", + "\n", + "To = 20 #Temperature of colder surface\n", + "vo = 2.414*10**(-5) * 10**(247.8/(To + 273 - 140)) / rho_i #kinematic viscosity of water at 20 C\n", + "delT = (ReC*vo*1.43*10**(-7))/(alpha*g*H**3) #Critical temperature gradient\n", + "Th = 70 #Temperature of hotter surface\n", + "T = np.ones((nxy, nxy))*(To + (H-ya)/H*(Th-To)) #Initial temperature distribution\n", + "\n", + "\n", + "rho = np.zeros((nxy,nxy), dtype=float)\n", + "rho = rho_i*(1-alpha*(T - To)) #Density of fluid body\n", + "\n", + "\n", + "v = np.ones((nxy,nxy))*2.414*10**(-5) * 10**(247.8/(T + 273 - 140)) / rho #kinematic viscosity of water\n", + "\n", + "ya = np.ones((nxy,nxy))\n", + "for i in range(nxy):\n", + " ya[:,i] = y\n", + "\n", + "p = np.zeros((nxy,nxy), dtype=float)\n", + "p[:,:] = rho[:,:] * (H-ya[:,:]) * g #Hydrostatic ressure distribution\n", + "\n", + "u = np.zeros((nxy,nxy), dtype=float) #Fluid velocity\n", + "\n", + "print('delT =',delT, 'Tl =',To+delT)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dt = 0.001\n" + ] + } + ], + "source": [ + "# stability\n", + "sigma = 0.00005\n", + "#dt = sigma*min(dxy,dxy)**2/D\n", + "dt = 0.001\n", + "\n", + "print('dt =',dt)" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dxy = 0.02\n" + ] + } + ], + "source": [ + "print('dxy =', dxy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Solving the Poisson Equation\n", + "The poisson equation solver from module 5, has been slightly modified to work for this problem. The initial, steady-state pressure field is used to initialize the solver." + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def poisson_IG(p, nxy, dxy, x, y, rho_i, u, dt):\n", + " '''Initialize the Poisson problem initial guess and other variables\n", + " Parameters:\n", + " ----------\n", + " nxy : int\n", + " number of mesh points in x and y\n", + " X : 2D array of floats\n", + " X-position of mesh\n", + " Y : 2D array of floats\n", + " Y-position of mesh\n", + " \n", + " Returns:\n", + " -------\n", + " p_i: 2D array of floats\n", + " initial guess of p\n", + " b : 2D array of floats\n", + " forcing function\n", + " dx : float\n", + " mesh size in x direction\n", + " dy : float\n", + " mesh size in y direction\n", + " '''\n", + "\n", + "\n", + " # Mesh\n", + " X,Y = np.meshgrid(x,y)\n", + "\n", + " # Intermidiate velocity\n", + " b = (rho_i/dt) * (u[2:,1:-1] - u[:-2,1:-1] + u[1:-1,2:] - u[1:-1,:-2])\n", + "\n", + " # Initialize\n", + " p_i = p.copy()\n", + "\n", + " return X, Y, p_i, b\n" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def poisson_2d(p, b, dxy, l2_target):\n", + " '''Performs Jacobi relaxation\n", + " \n", + " Parameters:\n", + " ----------\n", + " p : 2D array of floats\n", + " Initial guess\n", + " b : 2D array of floats\n", + " Source term\n", + " dxy: float\n", + " Mesh spacing in x and y direction\n", + " l2_target: float\n", + " Target difference between two consecutive iterates\n", + " \n", + " Returns:\n", + " -------\n", + " p: 2D array of float\n", + " Distribution after relaxation\n", + " '''\n", + "\n", + " l2_norm = 1\n", + " iterations = 0\n", + " l2_conv = []\n", + " \n", + " while l2_norm > l2_target:\n", + "\n", + " pd = p.copy()\n", + "\n", + " p[1:-1,1:-1] = 1/4*\\\n", + " ((pd[1:-1,2:]+pd[1:-1,:-2]) +\\\n", + " (pd[2:,1:-1] + pd[:-2,1:-1]) -\\\n", + " b*dxy)\n", + " \n", + " # BCs are automatically enforced\n", + " \n", + " l2_norm = L2_rel_error(pd,p)\n", + " iterations += 1\n", + " l2_conv.append(l2_norm)\n", + " \n", + " return p" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Numerical Scheme\n", + "\n", + "Creating the function to solve the forward-time backwards space scheme" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def ftcs(T, To, Th, u, p, rho, rho_i, alpha, v, k, c, g, ya, H, delT, nt, dt, dxy, nxy, x, y):\n", + " \n", + " for n in range(nt):\n", + "\n", + " un = u.copy()\n", + " u_star = un.copy()\n", + " Tn = T.copy()\n", + " pn = p.copy()\n", + " vn = v.copy()\n", + " \n", + " #Calculating an intermediate velocity\n", + " u_star[1:-1,1:-1] = un[1:-1,1:-1] + dt*(-u[1:-1,1:-1]/(2*dxy) * (u[2:,1:-1] - u[:-2,1:-1] + u[1:-1,2:] - un[1:-1,:-2])\\\n", + " + v[1:-1,1:-1]/(dxy**2) * (un[2:,1:-1] + un[:-2,1:-1] + un[1:-1,2:] + un[1:-1,:-2] - 4*un[1:-1,1:-1])\\\n", + " + rho[1:-1,1:-1]/rho_i * g)\n", + " u_star[-1,:] = 0 #Top Boundary\n", + " u_star[0,:] = 0 #Bottom Boundary\n", + " \n", + " #Solving the poisson equation\n", + " X, Y, ps, b = poisson_IG(p, nxy, dxy, x, y, rho_i, u_star, dt)\n", + " p = poisson_2d(ps, b, dxy, 2e-4)\n", + " \n", + " #Actual velocity for next time step\n", + " u[1:-1,1:-1] = u_star[1:-1,1:-1] - dt/(2*dxy)*(p[2:,1:-1] - p[:-2,1:-1] + p[1:-1,2:] - p[1:-1,:-2])\n", + " \n", + " u[-1,:] = 0 #Top Boundary\n", + " u[0,:] = 0 #Bottom Boundary\n", + " \n", + " T[1:-1,1:-1] = T[1:-1,1:-1] + dt*(-u[1:-1,1:-1]/(2*dxy) * (T[2:,1:-1]-T[:-2,1:-1]+T[1:-1,2:]-T[1:-1,:-2])\\\n", + " + k/(rho[1:-1,1:-1]*c*dxy**2) * (T[2:,1:-1] + T[:-2,1:-1] + T[1:-1,2:] + T[1:-1,:-2]\\\n", + " -4*T[1:-1,1:-1]))\n", + " \n", + " T[0,:] = Th #Bottom Boundary\n", + " T[-1,:] = To #top Boundary\n", + " \n", + " rho[1:-1,1:-1] = rho_i*(1- alpha*(T[1:-1,1:-1] - To))\n", + " \n", + " v[1:-1,1:-1] = 2.414*10**(-5) * 10**(247.8/(T[1:-1,1:-1] + 273 - 140)) / rho[1:-1,1:-1]\n", + " \n", + " return p, u, T" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\amiya\\Documents\\GitHub\\assignment-bank-2015\\Amiya Project\\laplace_helper.py:17: RuntimeWarning: overflow encountered in square\n", + " return numpy.sqrt(numpy.sum((p - pn)**2)/numpy.sum(pn**2))\n", + "C:\\Users\\amiya\\Documents\\GitHub\\assignment-bank-2015\\Amiya Project\\laplace_helper.py:17: RuntimeWarning: invalid value encountered in double_scalars\n", + " return numpy.sqrt(numpy.sum((p - pn)**2)/numpy.sum(pn**2))\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:12: RuntimeWarning: overflow encountered in multiply\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:29: RuntimeWarning: invalid value encountered in subtract\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:29: RuntimeWarning: invalid value encountered in add\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:21: RuntimeWarning: invalid value encountered in subtract\n" + ] + } + ], + "source": [ + "p, u, T = ftcs(T, To, Th, u, p, rho, rho_i, alpha, v, k, c, g, ya, H, delT, nt, dt, dxy, nxy, x, y)" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8,5))\n", + "plt.contourf(x,y,T,50,cmap=cm.viridis)\n", + "plt.xlabel('$x$')\n", + "plt.ylabel('$y$')\n", + "plt.colorbar();\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### References\n", + "\n", + "[1] - Koschmieder, E. L. Bénard Cells and Taylor Vortices. Cambridge: Cambridge UP, 1993. Print. \n", + "[2] - Sandberg, M., Berg, N. and Johnsson G. Rayleigh-Benard convection. Royal Institute of Technology, 2011\n", + "[3] Devendran, D. and Corona, E. Computational Fluid Dynamics Reading Group: Projection Methods\n", + "[4] Thermal instabilities: Benard convection" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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.5.1" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/Amiya Project/Final Version/images/Benard cells 3D.jpg b/Amiya Project/Final Version/images/Benard cells 3D.jpg new file mode 100644 index 0000000..fa1090a Binary files /dev/null and b/Amiya Project/Final Version/images/Benard cells 3D.jpg differ diff --git a/Amiya Project/Final Version/images/Benard cellsjpg.JPG b/Amiya Project/Final Version/images/Benard cellsjpg.JPG new file mode 100644 index 0000000..a763be5 Binary files /dev/null and b/Amiya Project/Final Version/images/Benard cellsjpg.JPG differ diff --git "a/Amiya Project/Final Version/images/B\303\251nard_cells_convection.ogv.jpg" "b/Amiya Project/Final Version/images/B\303\251nard_cells_convection.ogv.jpg" new file mode 100644 index 0000000..cd80bde Binary files /dev/null and "b/Amiya Project/Final Version/images/B\303\251nard_cells_convection.ogv.jpg" differ diff --git a/Amiya Project/Final Version/images/Set-up.jpg b/Amiya Project/Final Version/images/Set-up.jpg new file mode 100644 index 0000000..2b0c064 Binary files /dev/null and b/Amiya Project/Final Version/images/Set-up.jpg differ diff --git a/Amiya Project/Final Version/laplace_helper.py b/Amiya Project/Final Version/laplace_helper.py new file mode 100644 index 0000000..60c3cb3 --- /dev/null +++ b/Amiya Project/Final Version/laplace_helper.py @@ -0,0 +1,64 @@ +import numpy +from matplotlib import pyplot, cm +from mpl_toolkits.mplot3d import Axes3D + +def L2_rel_error(p, pn): + ''' Compute the relative L2 norm of the difference + Parameters: + ---------- + p : array of float + array 1 + pn: array of float + array 2 + Returns: + ------- + Relative L2 norm of the difference + ''' + return numpy.sqrt(numpy.sum((p - pn)**2)/numpy.sum(pn**2)) + +def plot_3D(x, y, p, elev=30, azi=45): + '''Creates 3D projection plot with appropriate limits and viewing angle + + Parameters: + ---------- + x: array of float + nodal coordinates in x + y: array of float + nodal coordinates in y + p: 2D array of float + calculated potential field + + ''' + fig = pyplot.figure(figsize=(11,7), dpi=100) + ax = fig.gca(projection='3d') + X,Y = numpy.meshgrid(x,y) + surf = ax.plot_surface(X,Y,p[:], rstride=1, cstride=1, cmap=cm.viridis, + linewidth=0, antialiased=False) + + ax.set_xlabel('$x$') + ax.set_ylabel('$y$') + ax.set_zlabel('$z$') + ax.view_init(elev,azi) + +def p_analytical(x, y): + '''Returns the analytical solution for the given Laplace Problem on a grid + with coordinates x and y + + Parameters: + ---------- + xL array of float + Nodal coordinates in x + y: array of float + Nodal coordinates in y + + Returns: + ------- + pxy: 2D array of float + Potential distribution analytical solution + + ''' + X, Y = numpy.meshgrid(x,y) + pxy = numpy.sinh(1.5*numpy.pi*Y / x[-1]) /\ + (numpy.sinh(1.5*numpy.pi*y[-1]/x[-1]))*numpy.sin(1.5*numpy.pi*X/x[-1]) + + return pxy diff --git a/Amiya Project/Final Version/multigrid_helper.py b/Amiya Project/Final Version/multigrid_helper.py new file mode 100644 index 0000000..39d4fec --- /dev/null +++ b/Amiya Project/Final Version/multigrid_helper.py @@ -0,0 +1,108 @@ +import numpy +from numba import autojit + +@autojit(nopython=True) +def poisson1d_GS_SingleItr(nx, dx, p, b): + ''' + Gauss-Seidel method for 1D Poisson eq. with Dirichlet BCs at both + ends. Only a single iteration is executed. **blitz** is used. + + Parameters: + ---------- + nx: int, number of grid points in x direction + dx: float, grid spacing in x + p: 1D array of float, approximated soln. in last iteration + b: 1D array of float, 0th-order derivative term in Poisson eq. + + Returns: + ------- + p: 1D array of float, approximated soln. in current iteration + ''' + + for i in range(1,len(p)-1): + p[i] = 0.5 * (p[i+1] + p[i-1] - dx**2 * b[i]) + + return p + + + +def RMS(p): + ''' + Return the root mean square of p. + + Parameters: + ---------- + p: array + + Returns: + ------- + Root mean square of p + ''' + return numpy.sqrt(numpy.sum(p**2) / p.size) + + + +def residual(dx, pn, b, r): + ''' + Calculate the residual for the 1D Poisson equation. + + Parameters: + ---------- + pn: 1D array, approximated solution at a certain iteration n + b: 1D array, the b(x) in the Poisson eq. + + Return: + ---------- + The residual r + ''' + + # r[0] = 0 + r[1:-1] = b[1:-1] - (pn[:-2] - 2 * pn[1:-1] + pn[2:]) / dx**2 + # r[-1] = 0 + + return r + + + +def full_weighting_1d(vF, vC): + ''' + Transfer a vector on a fine grid to a coarse grid with full weighting + . The number of elements (not points) of the coarse grid is + half of that of the fine grid. + + Parameters: + ---------- + vF: 1D numpy array, the vector on the fine grid + vC: 1D numpy array, the vector on the coarse grid, + size(vC) = (size(vF) + 1) / 2 + + Output: vC + ''' + + vC[0] = vF[0] + vC[1:-1] = 0.25 * (vF[1:-3:2] + 2. * vF[2:-2:2] + vF[3:-1:2]) + vC[-1] = vF[-1] + + return vC + + + +def interpolation_1d(vC, vF): + ''' + Transfer a vector on a coarse grid to a fine grid by linear + interpolation. The number of elements (not points) of the coarse + grid is a half of that of the fine grid. + + Parameters: + ---------- + vC: 1D numpy array, the vector on the coarse grid, + vF: 1D numpy array, the vector on the fine grid + size(vF) = size(vC) * 2 - 1 + + Output: vF + ''' + + vF[::2] = vC[:]; + vF[1:-1:2] = 0.5 * (vC[:-1] + vC[1:]) + + return vF diff --git a/Amiya Project/Rayleigh Benard Convection - 2.ipynb b/Amiya Project/Rayleigh Benard Convection - 2.ipynb new file mode 100644 index 0000000..4ecf9d4 --- /dev/null +++ b/Amiya Project/Rayleigh Benard Convection - 2.ipynb @@ -0,0 +1,296 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 173, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "from matplotlib import rcParams, cm\n", + "rcParams['font.family'] = 'serif'\n", + "rcParams['font.size'] = 16" + ] + }, + { + "cell_type": "code", + "execution_count": 174, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "delT = 120.36236563779158 Tl = 140.36236563779158\n", + "1.0054144180571545e-06\n" + ] + } + ], + "source": [ + "H = 0.25\n", + "L = 1\n", + "\n", + "alpha = 207*10**(-6) #Volume expansion coefficient of water @ 20 C\n", + "k = 0.6 #Thermal conductivity of water @ 20 C\n", + "\n", + "#ReC = 1100.65 #Critical Rayleigh number for one free and one rigid boundary condition\n", + "ReC = 1708 #Critical Rayleigh number for two rigid body boundary condition\n", + "g = 9.81\n", + "D = 1.43E-7 #Thermal diffusivity of water\n", + "rho_i = 1000 #Density of water @ 20 C\n", + "\n", + "L = 100\n", + "H = 0.001\n", + "\n", + "nxy = 101\n", + "nt = 6000\n", + "\n", + "dxy = L/(nxy-1)\n", + "\n", + "x = np.linspace(0,L,nxy)\n", + "y = np.linspace(0,H,nxy)\n", + "ya = np.ones((nxy,nxy))\n", + "for i in range(nxy):\n", + " ya[:,i] = y\n", + "#Change to Kelivin?\n", + "To = 20\n", + "vo = 2.414*10**(-5) * 10**(247.8/(To + 273 - 140)) / rho_i #initial kinematic viscosity of water\n", + "delT = (1700*vo*1.43*10**(-7))/(alpha*g*H**3)\n", + "Ti = np.ones((nxy, nxy))*(To + (H-ya)/H*(70-To))\n", + "Ti[-1,:] = To + 50\n", + "\n", + "rho = np.ones((nxy,nxy), dtype=float)*rho_i\n", + "rho[0,:] = rho_i*(1-alpha*(Ti[0,:] - To))\n", + "\n", + "v = np.ones((nxy,nxy))*2.414*10**(-5) * 10**(247.8/(Ti + 273 - 140)) / rho #kinematic viscosity of water\n", + "\n", + "pi = np.zeros((nxy,nxy), dtype=float)\n", + "pi[:,:] = rho[:,:] * (H-ya[:,:]) * g\n", + "\n", + "ui = np.zeros((nxy,nxy), dtype=float)\n", + "\n", + "print('delT =',delT, 'Tl =',20+delT)\n", + "print(vo)\n", + "#print('x =', x, 'y =', y)" + ] + }, + { + "cell_type": "code", + "execution_count": 175, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.001\n" + ] + } + ], + "source": [ + "# stability\n", + "sigma = 0.00005\n", + "#dt = sigma*min(dxy,dxy)**2/D\n", + "dt = 0.001\n", + "\n", + "print(dt)" + ] + }, + { + "cell_type": "code", + "execution_count": 176, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.0\n" + ] + } + ], + "source": [ + "print(dxy)" + ] + }, + { + "cell_type": "code", + "execution_count": 177, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def ftcs(T, To, u, p, rho, rho_i, alpha, v, D, g, ya, H,delT, nt, dt, dxy):\n", + " \n", + " for n in range(nt):\n", + "\n", + " un = u.copy()\n", + " Tn = T.copy()\n", + " pn = p.copy()\n", + " vn = v.copy()\n", + " T[1:-1,1:-1] = Tn[1:-1,1:-1] + dt*((un[1:-1,1:-1]/dxy)*(Tn[2:,1:-1]\\\n", + " + Tn[1:-1,2:] - (2*Tn[1:-1,1:-1])) + \n", + " (D/dxy**2)*(Tn[2:,1:-1] + Tn[:-2,1:-1] + Tn[1:-1,2:]\\\n", + " + Tn[1:-1,:-2] - (4*Tn[1:-1,1:-1])))\n", + " \n", + " T[0,:] = To + 50 #Bottom Boundary\n", + " T[-1,:] = To #top Boundary\n", + " \n", + " rho[1:-1,1:-1] = rho_i*(1- alpha*(T[1:-1,1:-1] - 20))\n", + " p[1:-1,1:-1] = rho[1:-1,1:-1]*(H-ya[1:-1,1:-1]) * g\n", + " \n", + " v[1:-1,1:-1] = 2.414*10**(-5) * 10**(247.8/(T[1:-1,1:-1] + 273 - 140)) / rho[1:-1,1:-1]\n", + " \n", + " u[1:-1,1:-1] = un[1:-1,1:-1] + dt*(-(1/rho_i)*(p[2:,1:-1] + p[1:-1,2:] - 2*p[1:-1,1:-1]) + (rho[1:-1,1:-1]*g/rho_i)\\\n", + " + (1/dxy)*(u[1:-1,1:-1]*0.5*(u[2:,1:-1] - u[:-2,1:-1] \\\n", + " + u[1:-1,2:] - u[1:-1,:-2]) \\\n", + " + (v[1:-1,1:-1]/dxy)*(u[2:,1:-1] + u[:-2,1:-1] + u[1:-1,2:] + u[1:-1,:-2] - 4*u[1:-1,1:-1])))\n", + " \n", + " #del u = 0\n", + " u[1:,1:] = 0.5*(u[:-1,1:] + u[1:,:-1])\n", + " \n", + " u[-1,:] = 0 #Top Boundary\n", + " u[0,:] = 0 #Bottom Boundary\n", + "\n", + " \n", + " return u, T" + ] + }, + { + "cell_type": "code", + "execution_count": 178, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "u, T = ftcs(Ti,To,ui,pi,rho,rho_i,alpha,v,D,g,ya,H,delT,nt,dt,dxy)" + ] + }, + { + "cell_type": "code", + "execution_count": 179, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8,5))\n", + "plt.contourf(x,y,T,20,cmap=cm.viridis)\n", + "plt.xlabel('$x$')\n", + "plt.ylabel('$y$')\n", + "plt.colorbar();\n" + ] + }, + { + "cell_type": "code", + "execution_count": 180, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 70. 70. 70. ..., 70. 70. 70. ]\n", + " [ 69.5 69.49999999 69.48489334 ..., 69.46914298 69.47011913\n", + " 69.5 ]\n", + " [ 69. 68.98489332 68.9546724 ..., 68.90788283 68.91561358\n", + " 69. ]\n", + " ..., \n", + " [ 21. 20.96881866 20.90692777 ..., 20.37500004 20.62500001\n", + " 21. ]\n", + " [ 20.5 20.46981245 20.41480439 ..., 20.12500001 20.25000001\n", + " 20.5 ]\n", + " [ 20. 20. 20. ..., 20. 20. 20. ]]\n" + ] + } + ], + "source": [ + "print(T)" + ] + }, + { + "cell_type": "code", + "execution_count": 181, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0. 0. 0. ..., 0. 0. 0. ]\n", + " [ 0. 0. 0.00485479 ..., 0.00970978 0.00970978\n", + " 0.00970973]\n", + " [ 0. 0.00485479 0.01456496 ..., 0.02913091 0.02913086\n", + " 0.02427588]\n", + " ..., \n", + " [ 0. 0.00980624 0.02941929 ..., 1.79855969 1.80774826\n", + " 1.80654397]\n", + " [ 0. 0.00980726 0.02942231 ..., 1.80633264 1.81605858\n", + " 1.81538929]\n", + " [ 0. 0. 0. ..., 0. 0. 0. ]]\n" + ] + } + ], + "source": [ + "print(ui)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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.5.1" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/Amiya Project/Rayleigh Benard Convection - 3.ipynb b/Amiya Project/Rayleigh Benard Convection - 3.ipynb new file mode 100644 index 0000000..ba7b9d8 --- /dev/null +++ b/Amiya Project/Rayleigh Benard Convection - 3.ipynb @@ -0,0 +1,326 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "from matplotlib import rcParams, cm\n", + "rcParams['font.family'] = 'serif'\n", + "rcParams['font.size'] = 16" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "delT = 120.36236563779158 Tl = 140.36236563779158\n", + "1.0054144180571545e-06\n" + ] + } + ], + "source": [ + "H = 0.25\n", + "L = 1\n", + "\n", + "alpha = 207*10**(-6) #Volume expansion coefficient of water @ 20 C\n", + "k = 0.6 #Thermal conductivity of water @ 20 C\n", + "\n", + "#ReC = 1100.65 #Critical Rayleigh number for one free and one rigid boundary condition\n", + "ReC = 1708 #Critical Rayleigh number for two rigid body boundary condition\n", + "g = 9.81\n", + "D = 1.43E-7 #Thermal diffusivity of water\n", + "c = k/D\n", + "rho_i = 1000 #Density of water @ 20 C\n", + "\n", + "L = 1\n", + "H = 0.001\n", + "\n", + "nxy = 101\n", + "nt = 6000\n", + "\n", + "dxy = H/(nxy-1)\n", + "\n", + "x = np.linspace(0,L,nxy)\n", + "y = np.linspace(0,H,nxy)\n", + "ya = np.ones((nxy,nxy))\n", + "for i in range(nxy):\n", + " ya[:,i] = y\n", + "#Change to Kelivin?\n", + "To = 20\n", + "vo = 2.414*10**(-5) * 10**(247.8/(To + 273 - 140)) / rho_i #initial kinematic viscosity of water\n", + "delT = (1700*vo*1.43*10**(-7))/(alpha*g*H**3)\n", + "Ti = np.ones((nxy, nxy))*(To + (H-ya)/H*(70-To))\n", + "Ti[-1,:] = To + 50\n", + "\n", + "rho = np.ones((nxy,nxy), dtype=float)*rho_i\n", + "rho[0,:] = rho_i*(1-alpha*(Ti[0,:] - To))\n", + "\n", + "v = np.ones((nxy,nxy))*2.414*10**(-5) * 10**(247.8/(Ti + 273 - 140)) / rho #kinematic viscosity of water\n", + "\n", + "pi = np.zeros((nxy,nxy), dtype=float)\n", + "pi[:,:] = rho[:,:] * (H-ya[:,:]) * g\n", + "\n", + "ui = np.zeros((nxy,nxy), dtype=float)\n", + "\n", + "print('delT =',delT, 'Tl =',20+delT)\n", + "print(vo)\n", + "#print('x =', x, 'y =', y)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.001\n" + ] + } + ], + "source": [ + "# stability\n", + "sigma = 0.00005\n", + "#dt = sigma*min(dxy,dxy)**2/D\n", + "dt = 0.001\n", + "\n", + "print(dt)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1e-05\n" + ] + } + ], + "source": [ + "print(dxy)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def ftcs(T, To, u, p, rho, rho_i, alpha, v, k, c, g, ya, H,delT, nt, dt, dxy):\n", + " \n", + " for n in range(nt):\n", + "\n", + " un = u.copy()\n", + " Tn = T.copy()\n", + " pn = p.copy()\n", + " vn = v.copy()\n", + " T[1:-1,1:-1] = Tn[1:-1,1:-1] + dt*(((un[1:-1,1:-1]/(2*dxy))*(Tn[2:,1:-1]\\\n", + " - Tn[:-2,1:-1] + Tn[1:-1,2:] + Tn[1:-1,:-2])) + \n", + " (k/(rho[1:-1,1:-1]*c*dxy**2))*(Tn[2:,1:-1] + Tn[:-2,1:-1] + Tn[1:-1,2:]\\\n", + " + Tn[1:-1,:-2] - (4*Tn[1:-1,1:-1])))\n", + " \n", + " T[0,:] = To + 50 #Bottom Boundary\n", + " T[-1,:] = To #top Boundary\n", + " \n", + " rho[1:-1,1:-1] = rho_i*(1- alpha*(T[1:-1,1:-1] - To))\n", + " \n", + " v[1:-1,1:-1] = 2.414*10**(-5) * 10**(247.8/(T[1:-1,1:-1] + 273 - 140)) / rho[1:-1,1:-1]\n", + " \n", + " p[1:-1,1:-1] = pn[1:-1,1:-1] + (1/(v[1:-1,1:-1]*(T[1:-1,1:-1]-Tn[1:-1,1:-1]))*\\\n", + " ((un[1:-1,1:-1]/dxy**2 * (u[2:,1:-1] + u[:-2,1:-1] + u[1:-1,2:] + u[1:-1,:-2] - 4*u[1:-1,1:-1]))))\n", + " \n", + " u[1:-1,1:-1] = un[1:-1,1:-1] + dt*(-(0.5/rho_i)*(p[2:,1:-1] - p[:-2,1:-1] + p[1:-1,2:] - p[1:-1,:-2])\\\n", + " + (rho[1:-1,1:-1]*g/rho_i)\\\n", + " + (1/dxy)*(u[1:-1,1:-1]*0.5*(u[2:,1:-1] - u[:-2,1:-1] \\\n", + " + u[1:-1,2:] - u[1:-1,:-2]) \\\n", + " + (v[1:-1,1:-1]/dxy)*(u[2:,1:-1] + u[:-2,1:-1] + u[1:-1,2:] + u[1:-1,:-2] - 4*u[1:-1,1:-1])))\n", + " \n", + " #del u = 0\n", + " #u[1:,1:] = 0.5*(u[:-1,1:] + u[1:,:-1])\n", + " \n", + " u[-1,:] = 0 #Top Boundary\n", + " u[0,:] = 0 #Bottom Boundary\n", + "\n", + " \n", + " return u, T" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:20: RuntimeWarning: divide by zero encountered in true_divide\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:20: RuntimeWarning: invalid value encountered in multiply\n" + ] + } + ], + "source": [ + "u, T = ftcs(Ti,To,ui,pi,rho,rho_i,alpha,v,k,c,g,ya,H,delT,nt,dt,dxy)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n/j+nWIY/tUH8iAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8,5))\n", + "plt.contourf(x,y,T,20,cmap=cm.viridis)\n", + "plt.xlabel('$x$')\n", + "plt.ylabel('$y$')\n", + "plt.colorbar();\n" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 70. 70. 70. ..., 70. 70. 70. ]\n", + " [ 69.5 nan nan ..., nan nan 69.5]\n", + " [ 69. nan nan ..., nan nan 69. ]\n", + " ..., \n", + " [ 21. nan nan ..., nan nan 21. ]\n", + " [ 20.5 nan nan ..., nan nan 20.5]\n", + " [ 20. 20. 20. ..., 20. 20. 20. ]]\n" + ] + } + ], + "source": [ + "print(T)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0. 0. 0. ..., 0. 0. 0.]\n", + " [ 0. nan nan ..., nan nan 0.]\n", + " [ 0. nan nan ..., nan nan 0.]\n", + " ..., \n", + " [ 0. nan nan ..., nan nan 0.]\n", + " [ 0. nan nan ..., nan nan 0.]\n", + " [ 0. 0. 0. ..., 0. 0. 0.]]\n" + ] + } + ], + "source": [ + "print(ui)" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 9.7084665 9.7084665 9.7084665 ..., 9.7084665 9.7084665 9.7084665]\n", + " [ 9.7119 nan nan ..., nan nan 9.7119 ]\n", + " [ 9.6138 nan nan ..., nan nan 9.6138 ]\n", + " ..., \n", + " [ 0.1962 nan nan ..., nan nan 0.1962 ]\n", + " [ 0.0981 nan nan ..., nan nan 0.0981 ]\n", + " [ 0. 0. 0. ..., 0. 0. 0. ]]\n" + ] + } + ], + "source": [ + "print(pi)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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.5.1" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/Amiya Project/Rayleigh Benard Convection - 4 - corrector-explicit-poisson.ipynb b/Amiya Project/Rayleigh Benard Convection - 4 - corrector-explicit-poisson.ipynb new file mode 100644 index 0000000..866e84d --- /dev/null +++ b/Amiya Project/Rayleigh Benard Convection - 4 - corrector-explicit-poisson.ipynb @@ -0,0 +1,497 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 135, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from mpl_toolkits.mplot3d import Axes3D\n", + "%matplotlib inline\n", + "from matplotlib import rcParams, cm\n", + "rcParams['font.family'] = 'serif'\n", + "rcParams['font.size'] = 16\n", + "from laplace_helper import L2_rel_error" + ] + }, + { + "cell_type": "code", + "execution_count": 136, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "delT = 120.92877677020469 Tl = 140.9287767702047\n", + "[[ 4.05457457e-07 4.05457457e-07 4.05457457e-07 ..., 4.05457457e-07\n", + " 4.05457457e-07 4.05457457e-07]\n", + " [ 4.11052677e-07 4.11052677e-07 4.11052677e-07 ..., 4.11052677e-07\n", + " 4.11052677e-07 4.11052677e-07]\n", + " [ 4.16782828e-07 4.16782828e-07 4.16782828e-07 ..., 4.16782828e-07\n", + " 4.16782828e-07 4.16782828e-07]\n", + " ..., \n", + " [ 9.58576501e-07 9.58576501e-07 9.58576501e-07 ..., 9.58576501e-07\n", + " 9.58576501e-07 9.58576501e-07]\n", + " [ 9.81562783e-07 9.81562783e-07 9.81562783e-07 ..., 9.81562783e-07\n", + " 9.81562783e-07 9.81562783e-07]\n", + " [ 1.00541442e-06 1.00541442e-06 1.00541442e-06 ..., 1.00541442e-06\n", + " 1.00541442e-06 1.00541442e-06]]\n" + ] + } + ], + "source": [ + "H = 0.25\n", + "L = 1\n", + "\n", + "alpha = 207*10**(-6) #Volume expansion coefficient of water @ 20 C\n", + "k = 0.6 #Thermal conductivity of water @ 20 C\n", + "\n", + "#ReC = 1100.65 #Critical Rayleigh number for one free and one rigid boundary condition\n", + "ReC = 1708 #Critical Rayleigh number for two rigid body boundary condition\n", + "g = 9.81\n", + "D = 1.43E-7 #Thermal diffusivity of water\n", + "c = k/D\n", + "rho_i = 1000 #Density of water @ 20 C\n", + "\n", + "L = 1\n", + "H = 0.001\n", + "\n", + "nxy = 51\n", + "nt = 3000\n", + "\n", + "dxy = H/(nxy-1)\n", + "\n", + "x = np.linspace(0,L,nxy)\n", + "y = np.linspace(0,H,nxy)\n", + "ya = np.ones((nxy,nxy))\n", + "for i in range(nxy):\n", + " ya[:,i] = y\n", + "#Change to Kelivin?\n", + "To = 20\n", + "vo = 2.414*10**(-5) * 10**(247.8/(To + 273 - 140)) / rho_i #initial kinematic viscosity of water\n", + "delT = (ReC*vo*1.43*10**(-7))/(alpha*g*H**3)\n", + "T = np.ones((nxy, nxy))*(To + (H-ya)/H*(70-To))\n", + "#Ti[-1,:] = To + 50\n", + "\n", + "rho = np.zeros((nxy,nxy), dtype=float)\n", + "rho = rho_i*(1-alpha*(T - To))\n", + "\n", + "v = np.ones((nxy,nxy))*2.414*10**(-5) * 10**(247.8/(T + 273 - 140)) / rho #kinematic viscosity of water\n", + "\n", + "p = np.zeros((nxy,nxy), dtype=float)\n", + "p[:,:] = rho[:,:] * (H-ya[:,:]) * g\n", + "\n", + "u = np.zeros((nxy,nxy), dtype=float)\n", + "\n", + "print('delT =',delT, 'Tl =',To+delT)\n", + "print(v)\n", + "#print('x =', x, 'y =', y)" + ] + }, + { + "cell_type": "code", + "execution_count": 137, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.001\n" + ] + } + ], + "source": [ + "# stability\n", + "sigma = 0.00005\n", + "#dt = sigma*min(dxy,dxy)**2/D\n", + "dt = 0.001\n", + "\n", + "print(dt)" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2e-05\n" + ] + } + ], + "source": [ + "print(dxy)" + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def poisson_IG(nxy, dxy, x, y, rho_i, u, dt):\n", + " '''Initialize the Poisson problem initial guess and other variables\n", + " Parameters:\n", + " ----------\n", + " nx : int\n", + " number of mesh points in x\n", + " ny : int\n", + " number of mesh points in y\n", + " xmax: float\n", + " maximum value of x in mesh\n", + " xmin: float\n", + " minimum value of x in mesh\n", + " ymax: float\n", + " maximum value of y in mesh\n", + " ymin: float\n", + " minimum value of y in mesh\n", + " \n", + " Returns:\n", + " -------\n", + " X : 2D array of floats\n", + " X-position of mesh\n", + " Y : 2D array of floats\n", + " Y-position of mesh\n", + " p_i: 2D array of floats\n", + " initial guess of p\n", + " b : 2D array of floats\n", + " forcing function\n", + " dx : float\n", + " mesh size in x direction\n", + " dy : float\n", + " mesh size in y direction\n", + " '''\n", + "\n", + "\n", + " # Mesh\n", + " X,Y = np.meshgrid(x,y)\n", + "\n", + " # Source\n", + " b = (rho_i/dt) * (u[2:,1:-1] - u[:-2,1:-1] + u[1:-1,2:] - u[1:-1,:-2])\n", + "\n", + " # Initialize\n", + " p_i = np.zeros((nxy,nxy))\n", + "\n", + " return X, Y, p_i, b\n" + ] + }, + { + "cell_type": "code", + "execution_count": 140, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def poisson_2d(p, b, dxy, l2_target):\n", + " '''Performs Jacobi relaxation\n", + " \n", + " Parameters:\n", + " ----------\n", + " p : 2D array of floats\n", + " Initial guess\n", + " b : 2D array of floats\n", + " Source term\n", + " dx: float\n", + " Mesh spacing in x direction\n", + " dy: float\n", + " Mesh spacing in y direction\n", + " l2_target: float\n", + " Target difference between two consecutive iterates\n", + " \n", + " Returns:\n", + " -------\n", + " p: 2D array of float\n", + " Distribution after relaxation\n", + " '''\n", + "\n", + " l2_norm = 1\n", + " iterations = 0\n", + " l2_conv = []\n", + " \n", + " while l2_norm > l2_target:\n", + "\n", + " pd = p.copy()\n", + "\n", + " p[1:-1,1:-1] = 1/4*\\\n", + " ((pd[1:-1,2:]+pd[1:-1,:-2]) +\\\n", + " (pd[2:,1:-1] + pd[:-2,1:-1]) -\\\n", + " b*dxy)\n", + " \n", + " # BCs are automatically enforced\n", + " \n", + " l2_norm = L2_rel_error(pd,p)\n", + " iterations += 1\n", + " l2_conv.append(l2_norm)\n", + " \n", + " return p" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def ftcs(T, To, u, p, rho, rho_i, alpha, v, k, c, g, ya, H, delT, nt, dt, dxy, nxy, x, y):\n", + " \n", + " for n in range(nt):\n", + "\n", + " un = u.copy()\n", + " u_star = un.copy()\n", + " Tn = T.copy()\n", + " pn = p.copy()\n", + " vn = v.copy()\n", + " \n", + " u_star[1:-1,1:-1] = un[1:-1,1:-1] + dt*(-u[1:-1,1:-1]/(2*dxy) * (u[2:,1:-1] - u[:-2,1:-1] + u[1:-1,2:] - un[1:-1,:-2])\\\n", + " + v[1:-1,1:-1]/(dxy**2) * (un[2:,1:-1] + un[:-2,1:-1] + un[1:-1,2:] + un[1:-1,:-2] - 4*un[1:-1,1:-1])\\\n", + " + rho[1:-1,1:-1]/rho_i * g)\n", + " #(1/(rho_i*dxy))*(pn[2:,1:-1]-pn[-2,1:-1]\\\n", + " # +pn[1:-1,2:]-pn[1:-1,:-2])\n", + " u_star[-1,:] = 0 #Top Boundary\n", + " u_star[0,:] = 0 #Bottom Boundary\n", + " \n", + " X, Y, ps, b = poisson_IG(nxy, dxy, x, y, rho_i, u_star, dt)\n", + " p = poisson_2d(ps, b, dxy, 2e-4)\n", + " \n", + " \n", + " u[1:-1,1:-1] = u_star[1:-1,1:-1] - dt/(2*dxy)*(p[2:,1:-1] - p[:-2,1:-1] + p[1:-1,2:] - p[1:-1,:-2])\n", + " \n", + " u[-1,:] = 0 #Top Boundary\n", + " u[0,:] = 0 #Bottom Boundary\n", + " \n", + " T[1:-1,1:-1] = T[1:-1,1:-1] + dt*(-u[1:-1,1:-1]/(2*dxy) * (T[2:,1:-1]-T[:-2,1:-1]+T[1:-1,2:]-T[1:-1,:-2])\\\n", + " + k/(rho[1:-1,1:-1]*c*dxy**2) * (T[2:,1:-1] + T[:-2,1:-1] + T[1:-1,2:] + T[1:-1,:-2]\\\n", + " -4*T[1:-1,1:-1]))\n", + " \n", + " T[0,:] = To + 50 #Bottom Boundary\n", + " T[-1,:] = To #top Boundary\n", + " \n", + " rho[1:-1,1:-1] = rho_i*(1- alpha*(T[1:-1,1:-1] - To))\n", + " \n", + " v[1:-1,1:-1] = 2.414*10**(-5) * 10**(247.8/(T[1:-1,1:-1] + 273 - 140)) / rho[1:-1,1:-1]\n", + " \n", + " \n", + " #del u = 0\n", + " #u[1:,1:] = 0.5*(u[:-1,1:] + u[1:,:-1])\n", + " \n", + " \n", + "\n", + " \n", + " return p, u, T" + ] + }, + { + "cell_type": "code", + "execution_count": 142, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\amiya\\Documents\\GitHub\\assignment-bank-2015\\Amiya Project\\laplace_helper.py:17: RuntimeWarning: overflow encountered in square\n", + " return numpy.sqrt(numpy.sum((p - pn)**2)/numpy.sum(pn**2))\n", + "C:\\Users\\amiya\\Documents\\GitHub\\assignment-bank-2015\\Amiya Project\\laplace_helper.py:17: RuntimeWarning: invalid value encountered in double_scalars\n", + " return numpy.sqrt(numpy.sum((p - pn)**2)/numpy.sum(pn**2))\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:26: RuntimeWarning: overflow encountered in multiply\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:11: RuntimeWarning: overflow encountered in multiply\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:11: RuntimeWarning: invalid value encountered in add\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:39: RuntimeWarning: invalid value encountered in subtract\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:39: RuntimeWarning: invalid value encountered in add\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:21: RuntimeWarning: invalid value encountered in subtract\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:26: RuntimeWarning: invalid value encountered in subtract\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:26: RuntimeWarning: invalid value encountered in add\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:26: RuntimeWarning: invalid value encountered in multiply\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:11: RuntimeWarning: invalid value encountered in multiply\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:39: RuntimeWarning: overflow encountered in multiply\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:26: RuntimeWarning: overflow encountered in true_divide\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:11: RuntimeWarning: overflow encountered in true_divide\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:11: RuntimeWarning: invalid value encountered in subtract\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:21: RuntimeWarning: invalid value encountered in add\n" + ] + } + ], + "source": [ + "p, u, T = ftcs(T, To, u, p, rho, rho_i, alpha, v, k, c, g, ya, H, delT, nt, dt, dxy, nxy, x, y)" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0. 0. 0. ..., 0. 0. 0.]\n", + " [ 0. nan nan ..., nan nan 0.]\n", + " [ 0. nan nan ..., nan nan 0.]\n", + " ..., \n", + " [ 0. nan nan ..., nan nan 0.]\n", + " [ 0. nan nan ..., nan nan 0.]\n", + " [ 0. 0. 0. ..., 0. 0. 0.]]\n" + ] + } + ], + "source": [ + "print(u)" + ] + }, + { + "cell_type": "code", + "execution_count": 144, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0. 0. 0. ..., 0. 0. 0.]\n", + " [ 0. nan nan ..., nan nan 0.]\n", + " [ 0. nan nan ..., nan nan 0.]\n", + " ..., \n", + " [ 0. nan nan ..., nan nan 0.]\n", + " [ 0. nan nan ..., nan nan 0.]\n", + " [ 0. 0. 0. ..., 0. 0. 0.]]\n" + ] + } + ], + "source": [ + "print(p)" + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8,5))\n", + "plt.contourf(x,y,T,50,cmap=cm.viridis)\n", + "plt.xlabel('$x$')\n", + "plt.ylabel('$y$')\n", + "plt.colorbar();\n" + ] + }, + { + "cell_type": "code", + "execution_count": 146, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 70. 70. 70. ..., 70. 70. 70.]\n", + " [ 69. nan nan ..., nan nan 69.]\n", + " [ 68. nan nan ..., nan nan 68.]\n", + " ..., \n", + " [ 22. nan nan ..., nan nan 22.]\n", + " [ 21. nan nan ..., nan nan 21.]\n", + " [ 20. 20. 20. ..., 20. 20. 20.]]\n" + ] + } + ], + "source": [ + "print(T)" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'ui' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mui\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mNameError\u001b[0m: name 'ui' is not defined" + ] + } + ], + "source": [ + "print(ui)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "print(pi)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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.5.1" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/Amiya Project/Rayleigh Benard Convection - 4 - corrector-explicit.ipynb b/Amiya Project/Rayleigh Benard Convection - 4 - corrector-explicit.ipynb new file mode 100644 index 0000000..d5cd691 --- /dev/null +++ b/Amiya Project/Rayleigh Benard Convection - 4 - corrector-explicit.ipynb @@ -0,0 +1,353 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "from matplotlib import rcParams, cm\n", + "rcParams['font.family'] = 'serif'\n", + "rcParams['font.size'] = 16" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "delT = 120.92877677020469 Tl = 140.9287767702047\n", + "[[ 4.05457457e-07 4.05457457e-07 4.05457457e-07 ..., 4.05457457e-07\n", + " 4.05457457e-07 4.05457457e-07]\n", + " [ 4.04055450e-07 4.04055450e-07 4.04055450e-07 ..., 4.04055450e-07\n", + " 4.04055450e-07 4.04055450e-07]\n", + " [ 4.06883369e-07 4.06883369e-07 4.06883369e-07 ..., 4.06883369e-07\n", + " 4.06883369e-07 4.06883369e-07]\n", + " ..., \n", + " [ 9.81359599e-07 9.81359599e-07 9.81359599e-07 ..., 9.81359599e-07\n", + " 9.81359599e-07 9.81359599e-07]\n", + " [ 9.93275020e-07 9.93275020e-07 9.93275020e-07 ..., 9.93275020e-07\n", + " 9.93275020e-07 9.93275020e-07]\n", + " [ 1.00541442e-06 1.00541442e-06 1.00541442e-06 ..., 1.00541442e-06\n", + " 1.00541442e-06 1.00541442e-06]]\n" + ] + } + ], + "source": [ + "H = 0.25\n", + "L = 1\n", + "\n", + "alpha = 207*10**(-6) #Volume expansion coefficient of water @ 20 C\n", + "k = 0.6 #Thermal conductivity of water @ 20 C\n", + "\n", + "#ReC = 1100.65 #Critical Rayleigh number for one free and one rigid boundary condition\n", + "ReC = 1708 #Critical Rayleigh number for two rigid body boundary condition\n", + "g = 9.81\n", + "D = 1.43E-7 #Thermal diffusivity of water\n", + "c = k/D\n", + "rho_i = 1000 #Density of water @ 20 C\n", + "\n", + "L = 1\n", + "H = 0.001\n", + "\n", + "nxy = 101\n", + "nt = 6000\n", + "\n", + "dxy = H/(nxy-1)\n", + "\n", + "x = np.linspace(0,L,nxy)\n", + "y = np.linspace(0,H,nxy)\n", + "ya = np.ones((nxy,nxy))\n", + "for i in range(nxy):\n", + " ya[:,i] = y\n", + "#Change to Kelivin?\n", + "To = 20\n", + "vo = 2.414*10**(-5) * 10**(247.8/(To + 273 - 140)) / rho_i #initial kinematic viscosity of water\n", + "delT = (ReC*vo*1.43*10**(-7))/(alpha*g*H**3)\n", + "Ti = np.ones((nxy, nxy))*(To + (H-ya)/H*(70-To))\n", + "#Ti[-1,:] = To + 50\n", + "\n", + "rho = np.ones((nxy,nxy), dtype=float)*rho_i\n", + "rho[0,:] = rho_i*(1-alpha*(Ti[0,:] - To))\n", + "\n", + "v = np.ones((nxy,nxy))*2.414*10**(-5) * 10**(247.8/(Ti + 273 - 140)) / rho #kinematic viscosity of water\n", + "\n", + "pi = np.zeros((nxy,nxy), dtype=float)\n", + "pi[:,:] = rho[:,:] * (H-ya[:,:]) * g\n", + "\n", + "ui = np.zeros((nxy,nxy), dtype=float)\n", + "\n", + "print('delT =',delT, 'Tl =',To+delT)\n", + "print(v)\n", + "#print('x =', x, 'y =', y)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.001\n" + ] + } + ], + "source": [ + "# stability\n", + "sigma = 0.00005\n", + "#dt = sigma*min(dxy,dxy)**2/D\n", + "dt = 0.001\n", + "\n", + "print(dt)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1e-05\n" + ] + } + ], + "source": [ + "print(dxy)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def ftcs(T, To, u, p, rho, rho_i, alpha, v, k, c, g, ya, H, delT, nt, dt, dxy, nxy):\n", + " \n", + " for n in range(nt):\n", + "\n", + " un = u.copy()\n", + " u_star = un.copy()\n", + " Tn = T.copy()\n", + " pn = p.copy()\n", + " vn = v.copy()\n", + " \n", + " u_star[1:-1,1:-1] = un[1:-1,1:-1] + dt*(-u[1:-1,1:-1]/(2*dxy) * (u[2:,1:-1] - u[:-2,1:-1] + u[1:-1,2:] - un[1:-1,:-2])\\\n", + " + v[1:-1,1:-1]/(dxy**2) * (un[2:,1:-1] + un[:-2,1:-1] + un[1:-1,2:] + un[1:-1,:-2] - 4*un[1:-1,1:-1])\\\n", + " + rho[1:-1,1:-1]/rho_i * g + (1/(rho_i*dxy))*(pn[2:,1:-1]-pn[-2,1:-1]\\\n", + " +pn[1:-1,2:]-pn[1:-1,:-2]))\n", + " \n", + " u_star[-1,:] = 0 #Top Boundary\n", + " u_star[0,:] = 0 #Bottom Boundary\n", + " \n", + " p[1:-1,1:-1] = pn[1:-1,1:-1] + 1/(2*dt*dxy) * (u_star[2:,1:-1] - u_star[:-2,1:-1] + u_star[1:-1,2:] - u_star[1:-1,:-2])\\\n", + " \n", + " \n", + " u[1:-1,1:-1] = u_star[1:-1,1:-1] - dt/(2*dxy)*(p[2:,1:-1] - p[:-2,1:-1] + p[1:-1,2:] - p[1:-1,:-2])\n", + " \n", + " u[-1,:] = 0 #Top Boundary\n", + " u[0,:] = 0 #Bottom Boundary\n", + " \n", + " T[1:-1,1:-1] = T[1:-1,1:-1] + dt*(-u[1:-1,1:-1]/(2*dxy) * (T[2:,1:-1]-T[:-2,1:-1]+T[1:-1,2:]-T[1:-1,:-2])\\\n", + " + k/(rho[1:-1,1:-1]*c*dxy**2) * (T[2:,1:-1] + T[:-2,1:-1] + T[1:-1,2:] + T[1:-1,:-2]\\\n", + " -4*T[1:-1,1:-1]))\n", + " \n", + " T[0,:] = To + 50 #Bottom Boundary\n", + " T[-1,:] = To #top Boundary\n", + " \n", + " rho[1:-1,1:-1] = rho_i*(1- alpha*(T[1:-1,1:-1] - To))\n", + " \n", + " v[1:-1,1:-1] = 2.414*10**(-5) * 10**(247.8/(T[1:-1,1:-1] + 273 - 140)) / rho[1:-1,1:-1]\n", + " \n", + " \n", + " #del u = 0\n", + " #u[1:,1:] = 0.5*(u[:-1,1:] + u[1:,:-1])\n", + " \n", + " \n", + "\n", + " \n", + " return u, T" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:11: RuntimeWarning: overflow encountered in multiply\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:16: RuntimeWarning: invalid value encountered in subtract\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:16: RuntimeWarning: invalid value encountered in add\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:16: RuntimeWarning: overflow encountered in multiply\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:18: RuntimeWarning: invalid value encountered in subtract\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:18: RuntimeWarning: invalid value encountered in add\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:18: RuntimeWarning: overflow encountered in multiply\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:23: RuntimeWarning: overflow encountered in true_divide\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:23: RuntimeWarning: overflow encountered in multiply\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:11: RuntimeWarning: overflow encountered in true_divide\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:11: RuntimeWarning: overflow encountered in subtract\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:11: RuntimeWarning: invalid value encountered in subtract\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:11: RuntimeWarning: overflow encountered in add\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:11: RuntimeWarning: invalid value encountered in add\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:11: RuntimeWarning: invalid value encountered in multiply\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:23: RuntimeWarning: invalid value encountered in subtract\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:23: RuntimeWarning: invalid value encountered in add\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:23: RuntimeWarning: invalid value encountered in multiply\n" + ] + } + ], + "source": [ + "u, T = ftcs(Ti,To,ui,pi,rho,rho_i,alpha,v,k,c,g,ya,H,delT,nt,dt,dxy,nxy)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n/j+nWIY/tUH8iAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8,5))\n", + "plt.contourf(x,y,T,20,cmap=cm.viridis)\n", + "plt.xlabel('$x$')\n", + "plt.ylabel('$y$')\n", + "plt.colorbar();\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 70. 70. 70. ..., 70. 70. 70. ]\n", + " [ 69.5 nan nan ..., nan nan 69.5]\n", + " [ 69. nan nan ..., nan nan 69. ]\n", + " ..., \n", + " [ 21. nan nan ..., nan nan 21. ]\n", + " [ 20.5 nan nan ..., nan nan 20.5]\n", + " [ 20. 20. 20. ..., 20. 20. 20. ]]\n" + ] + } + ], + "source": [ + "print(T)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0. 0. 0. ..., 0. 0. 0.]\n", + " [ 0. nan nan ..., nan nan 0.]\n", + " [ 0. nan nan ..., nan nan 0.]\n", + " ..., \n", + " [ 0. nan nan ..., nan nan 0.]\n", + " [ 0. nan nan ..., nan nan 0.]\n", + " [ 0. 0. 0. ..., 0. 0. 0.]]\n" + ] + } + ], + "source": [ + "print(ui)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 9.7084665 9.7084665 9.7084665 ..., 9.7084665 9.7084665 9.7084665]\n", + " [ 9.7119 nan nan ..., nan nan 9.7119 ]\n", + " [ 9.6138 nan nan ..., nan nan 9.6138 ]\n", + " ..., \n", + " [ 0.1962 nan nan ..., nan nan 0.1962 ]\n", + " [ 0.0981 nan nan ..., nan nan 0.0981 ]\n", + " [ 0. 0. 0. ..., 0. 0. 0. ]]\n" + ] + } + ], + "source": [ + "print(pi)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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.5.1" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/Amiya Project/Rayleigh Benard Convection - 4 - corrector.ipynb b/Amiya Project/Rayleigh Benard Convection - 4 - corrector.ipynb new file mode 100644 index 0000000..0dbc4f5 --- /dev/null +++ b/Amiya Project/Rayleigh Benard Convection - 4 - corrector.ipynb @@ -0,0 +1,490 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 88, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "from matplotlib import rcParams, cm\n", + "rcParams['font.family'] = 'serif'\n", + "rcParams['font.size'] = 16" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "delT = 120.92877677020469 Tl = 140.9287767702047\n", + "[[ 4.05457457e-07 4.05457457e-07 4.05457457e-07 ..., 4.05457457e-07\n", + " 4.05457457e-07 4.05457457e-07]\n", + " [ 4.04055450e-07 4.04055450e-07 4.04055450e-07 ..., 4.04055450e-07\n", + " 4.04055450e-07 4.04055450e-07]\n", + " [ 4.06883369e-07 4.06883369e-07 4.06883369e-07 ..., 4.06883369e-07\n", + " 4.06883369e-07 4.06883369e-07]\n", + " ..., \n", + " [ 9.81359599e-07 9.81359599e-07 9.81359599e-07 ..., 9.81359599e-07\n", + " 9.81359599e-07 9.81359599e-07]\n", + " [ 9.93275020e-07 9.93275020e-07 9.93275020e-07 ..., 9.93275020e-07\n", + " 9.93275020e-07 9.93275020e-07]\n", + " [ 1.00541442e-06 1.00541442e-06 1.00541442e-06 ..., 1.00541442e-06\n", + " 1.00541442e-06 1.00541442e-06]]\n" + ] + } + ], + "source": [ + "H = 0.25\n", + "L = 1\n", + "\n", + "alpha = 207*10**(-6) #Volume expansion coefficient of water @ 20 C\n", + "k = 0.6 #Thermal conductivity of water @ 20 C\n", + "\n", + "#ReC = 1100.65 #Critical Rayleigh number for one free and one rigid boundary condition\n", + "ReC = 1708 #Critical Rayleigh number for two rigid body boundary condition\n", + "g = 9.81\n", + "D = 1.43E-7 #Thermal diffusivity of water\n", + "c = k/D\n", + "rho_i = 1000 #Density of water @ 20 C\n", + "\n", + "L = 1\n", + "H = 0.001\n", + "\n", + "nxy = 101\n", + "nt = 6000\n", + "\n", + "dxy = H/(nxy-1)\n", + "\n", + "x = np.linspace(0,L,nxy)\n", + "y = np.linspace(0,H,nxy)\n", + "ya = np.ones((nxy,nxy))\n", + "for i in range(nxy):\n", + " ya[:,i] = y\n", + "#Change to Kelivin?\n", + "To = 20\n", + "vo = 2.414*10**(-5) * 10**(247.8/(To + 273 - 140)) / rho_i #initial kinematic viscosity of water\n", + "delT = (ReC*vo*1.43*10**(-7))/(alpha*g*H**3)\n", + "Ti = np.ones((nxy, nxy))*(To + (H-ya)/H*(70-To))\n", + "#Ti[-1,:] = To + 50\n", + "\n", + "rho = np.ones((nxy,nxy), dtype=float)*rho_i\n", + "rho[0,:] = rho_i*(1-alpha*(Ti[0,:] - To))\n", + "\n", + "v = np.ones((nxy,nxy))*2.414*10**(-5) * 10**(247.8/(Ti + 273 - 140)) / rho #kinematic viscosity of water\n", + "\n", + "pi = np.zeros((nxy,nxy), dtype=float)\n", + "pi[:,:] = rho[:,:] * (H-ya[:,:]) * g\n", + "\n", + "ui = np.zeros((nxy,nxy), dtype=float)\n", + "\n", + "print('delT =',delT, 'Tl =',To+delT)\n", + "print(v)\n", + "#print('x =', x, 'y =', y)" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.001\n" + ] + } + ], + "source": [ + "# stability\n", + "sigma = 0.00005\n", + "#dt = sigma*min(dxy,dxy)**2/D\n", + "dt = 0.001\n", + "\n", + "print(dt)" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1e-05\n" + ] + } + ], + "source": [ + "print(dxy)" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def constructMatrix(nxy):\n", + " \"\"\" Generate implicit matrix for 2D heat equation with Dirichlet in bottom and right and Neumann in top and left\n", + " Assumes dx = dy\n", + " \n", + " Parameters:\n", + " ----------\n", + " nx : int\n", + " number of discretization points in x\n", + " ny : int\n", + " number of discretization points in y\n", + " sigma: float\n", + " alpha*dt/dx\n", + " \n", + " Returns:\n", + " -------\n", + " A: 2D array of floats\n", + " Matrix of implicit 2D heat equation\n", + " \"\"\"\n", + " \n", + " A = np.zeros(((nxy)*(nxy-2),(nxy)*(nxy-2)))\n", + " \n", + " row_number = 0 # row counter\n", + " for j in range(1,nxy-1):\n", + " for i in range(nxy):\n", + " \n", + " if j==1: # Bottom boundary (Dirichlet)\n", + " A[row_number,row_number] = -4 # Set diagonal\n", + " A[row_number,row_number+1] = 1 # fetch i+1\n", + " A[row_number,row_number-1] = 1 # fetch i-1\n", + " A[row_number,row_number+nxy] = 1 # fetch j+1\n", + " \n", + " elif j==nxy-2: # Top boundary (Neumann)\n", + " A[row_number,row_number] = -4 # Set diagonal\n", + " A[row_number,row_number+1] = 1 # fetch i+1\n", + " A[row_number,row_number-1] = 1 # fetch i-1\n", + " A[row_number,row_number-(nxy)] = 1 # fetch j-1\n", + " \n", + " # Interior points\n", + " else:\n", + " A[row_number,row_number] = -4 # Set diagonal\n", + " A[row_number,row_number+1] = 1 # fetch i+1\n", + " A[row_number,row_number-1] = 1 # fetch i-1\n", + " A[row_number,row_number+nxy] = 1 # fetch j+1\n", + " A[row_number,row_number-(nxy)] = 1 # fetch j-1\n", + " \n", + " row_number += 1 # Jump to next row of the matrix!\n", + " \n", + " return A " + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def generateRHS(nxy, dxy, dt, u, rho_i):\n", + " \"\"\" Generates right-hand side for 2D implicit heat equation with Dirichlet in bottom and left and Neumann in top and right\n", + " Assumes dx=dy, Neumann BCs = 0, and constant Dirichlet BCs\n", + " \n", + " Paramenters:\n", + " -----------\n", + " nx : int\n", + " number of discretization points in x\n", + " ny : int\n", + " number of discretization points in y\n", + " sigma: float\n", + " alpha*dt/dx\n", + " T : array of float\n", + " Temperature in current time step\n", + " T_bc : float\n", + " Temperature in Dirichlet BC\n", + " \n", + " Returns:\n", + " -------\n", + " RHS : array of float\n", + " Right hand side of 2D implicit heat equation\n", + " \"\"\"\n", + " RHS = np.zeros((nxy)*(nxy-2))\n", + " \n", + " row_number = 0 # row counter\n", + " for j in range(1,nxy-1):\n", + " for i in range(nxy):\n", + " \n", + " if j==1: # Bottom boundary (Dirichlet)\n", + " RHS[row_number] = 0\n", + " \n", + " elif j==nxy-2: # Top boundary (Neumann)\n", + " RHS[row_number] = 0\n", + " \n", + " # Interior points\n", + " else:\n", + " RHS[row_number] = (rho_i*dxy/(2*dt))*(u[2:,1:-1]-u[:-2,1:-1] + u[1:-1,2:] - u[1:-1,:-2]) \n", + " \n", + " row_number += 1 # Jump to next row!\n", + " \n", + " return RHS" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def map_1Dto2D(nxy, u_1D):\n", + " \"\"\" Takes temperatures of solution of linear system, stored in 1D, \n", + " and puts them in a 2D array with the BCs\n", + " Valid for constant Dirichlet bottom and left, and Neumann with zero \n", + " flux top and right\n", + " \n", + " Parameters:\n", + " ----------\n", + " nx : int\n", + " number of nodes in x direction\n", + " ny : int\n", + " number of nodes in y direction\n", + " T_1D: array of floats\n", + " solution of linear system\n", + " T_bc: float\n", + " Dirichlet BC\n", + " \n", + " Returns:\n", + " -------\n", + " T: 2D array of float\n", + " Temperature stored in 2D array with BCs\n", + " \"\"\"\n", + " u = np.zeros((nxy,nxy))\n", + " \n", + " row_number = 0\n", + " for j in range(1,nxy-1):\n", + " for i in range(nxy):\n", + " u[j,i] = u_1D[row_number]\n", + " row_number += 1\n", + " # Dirichlet BC\n", + " u[0,:] = 0\n", + " u[-1,:] = 0\n", + " \n", + " return u" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def btcs_2D(u, A, nt, nxy, dxy, dt, rho_i):\n", + " \"\"\" Advances diffusion equation in time with backward Euler\n", + " \n", + " Parameters:\n", + " ----------\n", + " T: 2D array of float\n", + " initial temperature profile\n", + " A: 2D array of float\n", + " Matrix with discretized diffusion equation\n", + " nt: int\n", + " number of time steps\n", + " sigma: float\n", + " alpha*dt/dx^2\n", + " T_bc : float \n", + " Dirichlet BC temperature\n", + " nx : int\n", + " Discretization points in x\n", + " ny : int\n", + " Discretization points in y\n", + " dt : float\n", + " Time step size\n", + " \n", + " Returns:\n", + " -------\n", + " T: 2D array of floats\n", + " temperature profile after nt time steps\n", + " \"\"\"\n", + " \n", + " \n", + " for t in range(nt):\n", + " un = u.copy()\n", + " b = generateRHS(nxy, dxy, dt, u, rho_i)\n", + " # Use numpy.linalg.solve\n", + " p_interior = solve(A,b)\n", + " p = map_1Dto2D(nxy, p_interior)\n", + " \n", + " return p" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def ftcs(T, To, u, p, rho, rho_i, alpha, v, k, c, g, ya, H, delT, nt, dt, dxy, nxy):\n", + " \n", + " for n in range(nt):\n", + "\n", + " un = u.copy()\n", + " u_star = un.copy()\n", + " Tn = T.copy()\n", + " pn = p.copy()\n", + " vn = v.copy()\n", + " \n", + " u_star[1:-1,1:-1] = un[1:-1,1:-1] + dt*(-(u[1:-1,1:-1]/(2*dxy) * (u[2:,1:-1] - u[:-2,1:-1] + u[1:-1,2:] - u[1:-1,:-2])\\\n", + " + v[1:-1,1:-1]/dxy**2 * (u[2:,1:-1] + u[:-2,1:-1] + u[1:-1,2:] + u[1:-1,:-2] - 4*u[1:-1,1:-1])\\\n", + " + rho[1:-1,1:-1]/rho_i * g))\n", + " \n", + " u_star[-1,:] = 0 #Top Boundary\n", + " u_star[0,:] = 0 #Bottom Boundary\n", + " \n", + " #p[1:-1,1:-1] = pn[1:-1,1:-1] + 1/(2*dt*dxy) * (u_star[2:,1:-1] - u_star[:-2,1:-1] + u_star[1:-1,2:] - u_star[1:-1,:-2])\\\n", + " \n", + " A = constructMatrix(nxy)\n", + " p = btcs_2D(u_star, A, nt, nxy, dxy, dt, rho_i)\n", + " \n", + " u[1:-1,1:-1] = u_star[1:-1,1:-1] - dt/(2*dxy)*(p[2:,1:-1] - p[:-2,1:-1] + p[1:-1,2:] - p[1:-1,:-2])\n", + " \n", + " u[-1,:] = 0 #Top Boundary\n", + " u[0,:] = 0 #Bottom Boundary\n", + " \n", + " T[1:-1,1:-1] = T[1:-1,1:-1] + dt*(-u[1:-1,1:-1]/(2*dxy) * (T[2:,1:-1]-T[:-2,1:-1]+T[1:-1,2:]-T[1:-1,:-2])\\\n", + " + k/(rho[1:-1,1:-1]*c*dxy**2) * (T[2:,1:-1] + T[:-2,1:-1] + T[1:-1,2:] + T[1:-1,:-2]\\\n", + " -4*T[1:-1,1:-1]))\n", + " \n", + " T[0,:] = To + 50 #Bottom Boundary\n", + " T[-1,:] = To #top Boundary\n", + " \n", + " rho[1:-1,1:-1] = rho_i*(1- alpha*(T[1:-1,1:-1] - To))\n", + " \n", + " v[1:-1,1:-1] = 2.414*10**(-5) * 10**(247.8/(T[1:-1,1:-1] + 273 - 140)) / rho[1:-1,1:-1]\n", + " \n", + " \n", + " #del u = 0\n", + " #u[1:,1:] = 0.5*(u[:-1,1:] + u[1:,:-1])\n", + " \n", + " \n", + "\n", + " \n", + " return u, T" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "IndexError", + "evalue": "index 9999 is out of bounds for axis 1 with size 9999", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mu\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mT\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mftcs\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mTi\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mTo\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mui\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mpi\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mrho\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mrho_i\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0malpha\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mv\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mk\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mc\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mg\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mya\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mH\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mdelT\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mnt\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mdt\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mdxy\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mnxy\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m\u001b[0m in \u001b[0;36mftcs\u001b[1;34m(T, To, u, p, rho, rho_i, alpha, v, k, c, g, ya, H, delT, nt, dt, dxy, nxy)\u001b[0m\n\u001b[0;32m 16\u001b[0m \u001b[1;31m#p[1:-1,1:-1] = pn[1:-1,1:-1] + 1/(2*dt*dxy) * (u_star[2:,1:-1] - u_star[:-2,1:-1] + u_star[1:-1,2:] - u_star[1:-1,:-2])\\\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 17\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 18\u001b[1;33m \u001b[0mA\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mconstructMatrix\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnxy\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 19\u001b[0m \u001b[0mp\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mbtcs_2D\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mu_star\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mA\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnt\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnxy\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdxy\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdt\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrho_i\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 20\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m\u001b[0m in \u001b[0;36mconstructMatrix\u001b[1;34m(nxy)\u001b[0m\n\u001b[0;32m 32\u001b[0m \u001b[1;32melif\u001b[0m \u001b[0mj\u001b[0m\u001b[1;33m==\u001b[0m\u001b[0mnxy\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m:\u001b[0m \u001b[1;31m# Top boundary (Neumann)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 33\u001b[0m \u001b[0mA\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mrow_number\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mrow_number\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m-\u001b[0m\u001b[1;36m4\u001b[0m \u001b[1;31m# Set diagonal\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 34\u001b[1;33m \u001b[0mA\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mrow_number\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mrow_number\u001b[0m\u001b[1;33m+\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m1\u001b[0m \u001b[1;31m# fetch i+1\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 35\u001b[0m \u001b[0mA\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mrow_number\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mrow_number\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m1\u001b[0m \u001b[1;31m# fetch i-1\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 36\u001b[0m \u001b[0mA\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mrow_number\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mrow_number\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnxy\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m1\u001b[0m \u001b[1;31m# fetch j-1\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mIndexError\u001b[0m: index 9999 is out of bounds for axis 1 with size 9999" + ] + } + ], + "source": [ + "u, T = ftcs(Ti,To,ui,pi,rho,rho_i,alpha,v,k,c,g,ya,H,delT,nt,dt,dxy,nxy)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "plt.figure(figsize=(8,5))\n", + "plt.contourf(x,y,T,20,cmap=cm.viridis)\n", + "plt.xlabel('$x$')\n", + "plt.ylabel('$y$')\n", + "plt.colorbar();\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "print(T)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "print(ui)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "print(pi)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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.5.1" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/Amiya Project/Rayleigh Benard Convection - 4 - notebook.ipynb b/Amiya Project/Rayleigh Benard Convection - 4 - notebook.ipynb new file mode 100644 index 0000000..c3b5609 --- /dev/null +++ b/Amiya Project/Rayleigh Benard Convection - 4 - notebook.ipynb @@ -0,0 +1,541 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Rayleigh-Benard Convection" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![alt text](images/Benard cells 3D.jpg)\n", + "\n", + "Natural convection is a mechanism where motion is induced in a fluid, not \n", + "through artificial means but by the effects of bouyancy. One of the most commonly studied convection phenomenon, is the Rayleigh-Benard convection. When a thin layer of fluid is heated from below, once the temperature difference, between the top and bottom fluid layers, grows large enough, convection cells, also called Benard cells, form within the fluid. As a result, some interesting patterns can be observed in the fluid.\n", + "\n", + "![alt text](images/Bénard_cells_convection.ogv.jpg)\n", + "\n", + "The cells are named after, Henri Benard, who conducted some of the earliest experiments on convection during the 1900s. Inspired by Benard's experiments, in 1916, Baron Rayleigh, John William Strutt, approached the problem his own way. Rayleigh was more interested in the stability aspect of Benard's problem. He showed that when the temperature gradient is high enough, instability would occur, leading to the formation of Benard cells. This behaviour is governed by the Rayleigh number. A non dimensional parameter of fluids, that relates the fluids rate of expansion due to heating, with the fluids viscosity. When this exceeds a certain critical value, the thermal energy within the fluid becomes strong enough to overcome the viscous forces, leading to the onset of convection.\n", + "\n", + "$$Ra = \\frac{\\alpha \\Delta Tgh^3}{\\nu D }$$\n", + "\n", + "Where,\n", + " $$\\alpha = thermal\\ expansion\\ coefficient\\ $$ \n", + " $$\\nu = kinematic\\ viscosity\\$$\n", + " $$D = thermal\\ diffusivity\\$$\n", + "\n", + "\n", + " \n", + "Experimental analysis has shown that the critical number is dependant on the boundary conditions of the problem. For example, for a case where a fluid is placed between and plate and open air, the critical value is less than if it were to be placed between to rigid plates. For this case, we will be studying the latter case. It is easier to keep the temperature of the colder surface constant and uniform with these conditions. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Problem Setup" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this case, we will be considering a layer of fluid placed between to rigid plates.\n", + "\n", + "![alt text](images/Set-up.jpg)\n", + "\n", + "The length of the fluid is assumed to be sufficiently larger than the height, so that it can be considered infinite. Benard's original experiments, used a height 1 mm and a length of 20 cm.(Benard cells and Taylor Vortices)\n", + "\n", + "There are four boundary conditions. Two on each of the rigid plates. The temperatures at the plates are assumed to be constant and the no slip condition is applied.\n", + "\n", + "$$T_{(x,t)}|_{y=0} = T_{o}$$\n", + "$$T_{(x,t)}|_{y=h} = T_{1}$$\n", + "$$u_{(x,t)}|_{y=0} = 0$$\n", + "$$u_{(x,t)}|_{y=h} = 0$$\n", + "\n", + "For initial conditions, the fluid is at rest and the temperature is assumed to be linearly distributed.\n", + "\n", + "$$T_{(x,t)}|_{t=0} = T_{o} + \\frac{y}{h}(T_{1}-T{o})$$\n", + "$$u_{(x,t)}|_{t=0} = 0$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Governing Equations" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The governing equations for this case, are derived by applying the Boussinesq approximation to the Navier-Stokes equations. The Boussinesq approximation neglects all density changes in the momentum and continuity equations, except for the gravity term. The assumption is, that the density changes are small compared to the velocity gradients. The gravitational constant is, however, strong enough to make it relevant.\n", + "\n", + "$$\\nabla \\cdot u = 0$$\n", + "$$\\frac{\\partial u}{\\partial t} + u\\cdot \\nabla u = -\\frac{1}{\\rho_{o}}\\nabla p + \\frac{\\rho}{\\rho_{o}}g + \\nu\\nabla^2u$$\n", + "\n", + "Under the same assumption, the density can be shown to have a linear dependancy on the temperature.\n", + "\n", + "$$\\rho = \\rho_{o}(1-\\alpha(T-T_{o})$$\n", + "\n", + "And finally, the thermal energy equation can be approximated to a relatively familiar form.\n", + "\n", + "$$\\frac{\\partial T}{\\partial t} + u\\cdot \\nabla T = D\\nabla^2T$$\n", + "\n", + "Where the thermal diffusivity, $$D = \\frac{k}{\\rho c}$$\n", + "\n", + "\n", + "Also, for this particular case, I will be modelling water. For temperatures between 0 and 370 degrees C, the viscosity of water can be found using the following relationship.\n", + "\n", + "$$\\nu = \\frac{1}{rho}x2.414x10^{-5}x10^{\\frac{247.8}{T-140}}$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Discretization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this problem, I have decided to apply a forward-time central-space discretization scheme. As the boundary conditions for the pressure, depend on the fluid velocity, which is in turn dependant on the pressure, they are difficult to uncouple. One way to decouple the pressure and velocity terms, is by using Chorin's projection method. This is a two step process, not unlike the MacCormack method.\n", + "\n", + "An intermediate velocity term is first calcualted, free of the pressure gradient. \n", + "\n", + "$$\\frac{\\partial u}{\\partial t} + u\\cdot \\nabla u = \\frac{\\rho}{\\rho_{o}}g + \\nu\\nabla^2u$$\n", + "\n", + "This is then used to calculate the pressure gradient for the next time step, which calcualates the next iteration of the velocity field. To find the intermediate velocity, 'u_star', we discretize the above equation using forward-time central space scheme.\n", + "\n", + "$$u_{i,j}^{*} = u_{I,j}^{n} + dt(- \\frac{u_{i,j}^{n}}{2\\delta}(u_{i+1,j}^{n} - u_{i-1,j}^{n} + u_{i,j+1}^{n} - u_{i,j-1}^{n}) + \\frac{\\nu_{i,j}}{\\delta^2}(u_{i+1,j}^{n} + u_{i-1,j}^{n} + u_{i,j+1}^{n} + u_{i,j-1}^{n} - 4u_{i,j}^{n}))$$\n", + "\n", + "Where,\n", + "$$\\delta = dx = dy$$\n", + "\n", + "On taking the divergence of the momentum equation and using the continuity equation, we end up with a Poisson's equation, relating the pressure with u_star.\n", + "\n", + "$$-\\nabla^2 p = -\\frac{\\rho_{o}}{dt}\\nabla \\cdot u^{*}$$\n", + "\n", + "In discretized form,\n", + "\n", + "$$p_{i,j}^{n+1} = \\frac{1}{4}(p_{i+1,j}^{n} + p_{i-1,j}^{n} + p_{i,j+1}^{n} + p_{i,j-1}^{n} - \\frac{\\rho_{o}}{dt}\\delta u_{i,j}^{*})$$\n", + "\n", + "This equation can be solved using the iterative method learned in module 5. Once the pressure distribution is found, we are finally ready to calculate the actual velocity and the temperature for the next time step.\n", + "\n", + "$$u_{i,j}^{n+1} = u_{i,j}^{n} + dt(-\\frac{u_{i,j}^{n}}{2\\delta}(u_{i+1,j}^{n} - u_{i-1,j}^{n} + u_{i,j+1}^{n} - u_{i,j-1}^{n}) - \\frac{1}{2\\rho_{o}\\delta}(p_{i+1,j}^{n} - p_{i-1,j}^{n} + p_{i,j+1}^{n} - p_{i,j-1}^{n}) + \\frac{\\nu_{i,j}}{\\delta^2}(u_{i+1,j}^{n} + u_{i-1,j}^{n} + u_{i,j+1}^{n} + u_{i,j-1}^{n} - 4u_{i,j}^{n})$$\n", + "\n", + "$$T_{i,j}^{n+1} = T_{i,j}^{n} + dt(-\\frac{u_{i,j}^{n}}{2\\delta}(T_{i+1,j}^{n} - T_{i-1,j}^{n} + T_{i,j+1}^{n} - T_{i,j-1}^{n}) + \\frac{k}{c\\rho_{i,j}\\delta^2}(T_{i+1,j}^{n} + T_{i-1,j}^{n} + T_{i,j+1}^{n} + T_{i,j-1}^{n} - 4T_{i,j}^{n})$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Numerical Simulation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We start by importing our usual libraries, with the addition of the laplace_helper provided for module 5." + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from mpl_toolkits.mplot3d import Axes3D\n", + "%matplotlib inline\n", + "from matplotlib import rcParams, cm\n", + "rcParams['font.family'] = 'serif'\n", + "rcParams['font.size'] = 16\n", + "from laplace_helper import L2_rel_error" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Setting up the problem." + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "delT = 120.92877677020469 Tl = 140.9287767702047\n" + ] + } + ], + "source": [ + "##Domain setup\n", + "L = 1 #Domain Length\n", + "H = 0.001 #Domain Height\n", + "\n", + "nxy = 51 #Grid points for x and y\n", + "nt = 3000 #Time steps\n", + "\n", + "dxy = L/(nxy-1) #Grid spacing for x and y\n", + "\n", + "x = np.linspace(0,L,nxy)\n", + "y = np.linspace(0,H,nxy)\n", + "\n", + "\n", + "##Fluid Properties\n", + "alpha = 207*10**(-6) #Volume expansion coefficient of water @ 20 C\n", + "k = 0.6 #Thermal conductivity of water @ 20 C\n", + "\n", + "ReC = 1708 #Critical Rayleigh number for two rigid body boundary condition\n", + "g = 9.81\n", + "D = 1.43E-7 #Thermal diffusivity of water\n", + "c = k/D\n", + "rho_i = 1000 #Density of water @ 20 C\n", + "\n", + "\n", + "\n", + "\n", + "##Initial Parameters\n", + "\n", + "\n", + "To = 20 #Temperature of colder surface\n", + "vo = 2.414*10**(-5) * 10**(247.8/(To + 273 - 140)) / rho_i #kinematic viscosity of water at 20 C\n", + "delT = (ReC*vo*1.43*10**(-7))/(alpha*g*H**3) #Critical temperature gradient\n", + "Th = 70 #Temperature of hotter surface\n", + "T = np.ones((nxy, nxy))*(To + (H-ya)/H*(Th-To)) #Initial temperature distribution\n", + "\n", + "\n", + "rho = np.zeros((nxy,nxy), dtype=float)\n", + "rho = rho_i*(1-alpha*(T - To)) #Density of fluid body\n", + "\n", + "\n", + "v = np.ones((nxy,nxy))*2.414*10**(-5) * 10**(247.8/(T + 273 - 140)) / rho #kinematic viscosity of water\n", + "\n", + "ya = np.ones((nxy,nxy))\n", + "for i in range(nxy):\n", + " ya[:,i] = y\n", + "\n", + "p = np.zeros((nxy,nxy), dtype=float)\n", + "p[:,:] = rho[:,:] * (H-ya[:,:]) * g #Hydrostatic ressure distribution\n", + "\n", + "u = np.zeros((nxy,nxy), dtype=float) #Fluid velocity\n", + "\n", + "print('delT =',delT, 'Tl =',To+delT)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dt = 0.001\n" + ] + } + ], + "source": [ + "# stability\n", + "sigma = 0.00005\n", + "#dt = sigma*min(dxy,dxy)**2/D\n", + "dt = 0.001\n", + "\n", + "print('dt =',dt)" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dxy = 0.02\n" + ] + } + ], + "source": [ + "print('dxy =', dxy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Solving the Poisson Equation\n", + "The poisson equation solver from module 5, has been slightly modified to work for this problem." + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def poisson_IG(p, nxy, dxy, x, y, rho_i, u, dt):\n", + " '''Initialize the Poisson problem initial guess and other variables\n", + " Parameters:\n", + " ----------\n", + " nxy : int\n", + " number of mesh points in x and y\n", + " X : 2D array of floats\n", + " X-position of mesh\n", + " Y : 2D array of floats\n", + " Y-position of mesh\n", + " \n", + " Returns:\n", + " -------\n", + " p_i: 2D array of floats\n", + " initial guess of p\n", + " b : 2D array of floats\n", + " forcing function\n", + " dx : float\n", + " mesh size in x direction\n", + " dy : float\n", + " mesh size in y direction\n", + " '''\n", + "\n", + "\n", + " # Mesh\n", + " X,Y = np.meshgrid(x,y)\n", + "\n", + " # Intermidiate velocity\n", + " b = (rho_i/dt) * (u[2:,1:-1] - u[:-2,1:-1] + u[1:-1,2:] - u[1:-1,:-2])\n", + "\n", + " # Initialize\n", + " p_i = p.copy()\n", + "\n", + " return X, Y, p_i, b\n" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def poisson_2d(p, b, dxy, l2_target):\n", + " '''Performs Jacobi relaxation\n", + " \n", + " Parameters:\n", + " ----------\n", + " p : 2D array of floats\n", + " Initial guess\n", + " b : 2D array of floats\n", + " Source term\n", + " dxy: float\n", + " Mesh spacing in x and y direction\n", + " l2_target: float\n", + " Target difference between two consecutive iterates\n", + " \n", + " Returns:\n", + " -------\n", + " p: 2D array of float\n", + " Distribution after relaxation\n", + " '''\n", + "\n", + " l2_norm = 1\n", + " iterations = 0\n", + " l2_conv = []\n", + " \n", + " while l2_norm > l2_target:\n", + "\n", + " pd = p.copy()\n", + "\n", + " p[1:-1,1:-1] = 1/4*\\\n", + " ((pd[1:-1,2:]+pd[1:-1,:-2]) +\\\n", + " (pd[2:,1:-1] + pd[:-2,1:-1]) -\\\n", + " b*dxy)\n", + " \n", + " # BCs are automatically enforced\n", + " \n", + " l2_norm = L2_rel_error(pd,p)\n", + " iterations += 1\n", + " l2_conv.append(l2_norm)\n", + " \n", + " return p" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Numerical Scheme\n", + "\n", + "Creating the function to solve the forward-time backwards space scheme" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def ftcs(T, To, Th, u, p, rho, rho_i, alpha, v, k, c, g, ya, H, delT, nt, dt, dxy, nxy, x, y):\n", + " \n", + " for n in range(nt):\n", + "\n", + " un = u.copy()\n", + " u_star = un.copy()\n", + " Tn = T.copy()\n", + " pn = p.copy()\n", + " vn = v.copy()\n", + " \n", + " #Calculating an intermediate velocity\n", + " u_star[1:-1,1:-1] = un[1:-1,1:-1] + dt*(-u[1:-1,1:-1]/(2*dxy) * (u[2:,1:-1] - u[:-2,1:-1] + u[1:-1,2:] - un[1:-1,:-2])\\\n", + " + v[1:-1,1:-1]/(dxy**2) * (un[2:,1:-1] + un[:-2,1:-1] + un[1:-1,2:] + un[1:-1,:-2] - 4*un[1:-1,1:-1])\\\n", + " + rho[1:-1,1:-1]/rho_i * g)\n", + " u_star[-1,:] = 0 #Top Boundary\n", + " u_star[0,:] = 0 #Bottom Boundary\n", + " \n", + " #Solving the poisson equation\n", + " X, Y, ps, b = poisson_IG(p, nxy, dxy, x, y, rho_i, u_star, dt)\n", + " p = poisson_2d(ps, b, dxy, 2e-4)\n", + " \n", + " #Actual velocity for next time step\n", + " u[1:-1,1:-1] = u_star[1:-1,1:-1] - dt/(2*dxy)*(p[2:,1:-1] - p[:-2,1:-1] + p[1:-1,2:] - p[1:-1,:-2])\n", + " \n", + " u[-1,:] = 0 #Top Boundary\n", + " u[0,:] = 0 #Bottom Boundary\n", + " \n", + " T[1:-1,1:-1] = T[1:-1,1:-1] + dt*(-u[1:-1,1:-1]/(2*dxy) * (T[2:,1:-1]-T[:-2,1:-1]+T[1:-1,2:]-T[1:-1,:-2])\\\n", + " + k/(rho[1:-1,1:-1]*c*dxy**2) * (T[2:,1:-1] + T[:-2,1:-1] + T[1:-1,2:] + T[1:-1,:-2]\\\n", + " -4*T[1:-1,1:-1]))\n", + " \n", + " T[0,:] = Th #Bottom Boundary\n", + " T[-1,:] = To #top Boundary\n", + " \n", + " rho[1:-1,1:-1] = rho_i*(1- alpha*(T[1:-1,1:-1] - To))\n", + " \n", + " v[1:-1,1:-1] = 2.414*10**(-5) * 10**(247.8/(T[1:-1,1:-1] + 273 - 140)) / rho[1:-1,1:-1]\n", + " \n", + " return p, u, T" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\amiya\\Documents\\GitHub\\assignment-bank-2015\\Amiya Project\\laplace_helper.py:17: RuntimeWarning: overflow encountered in square\n", + " return numpy.sqrt(numpy.sum((p - pn)**2)/numpy.sum(pn**2))\n", + "C:\\Users\\amiya\\Documents\\GitHub\\assignment-bank-2015\\Amiya Project\\laplace_helper.py:17: RuntimeWarning: invalid value encountered in double_scalars\n", + " return numpy.sqrt(numpy.sum((p - pn)**2)/numpy.sum(pn**2))\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:12: RuntimeWarning: overflow encountered in multiply\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:29: RuntimeWarning: invalid value encountered in subtract\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:29: RuntimeWarning: invalid value encountered in add\n", + "C:\\Users\\amiya\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:21: RuntimeWarning: invalid value encountered in subtract\n" + ] + } + ], + "source": [ + "p, u, T = ftcs(T, To, Th, u, p, rho, rho_i, alpha, v, k, c, g, ya, H, delT, nt, dt, dxy, nxy, x, y)" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8,5))\n", + "plt.contourf(x,y,T,50,cmap=cm.viridis)\n", + "plt.xlabel('$x$')\n", + "plt.ylabel('$y$')\n", + "plt.colorbar();\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### References\n", + "\n", + "[1] - Koschmieder, E. L. Bénard Cells and Taylor Vortices. Cambridge: Cambridge UP, 1993. Print. \n", + "[2] - Sandberg, M., Berg, N. and Johnsson G. Rayleigh-Benard convection. Royal Institute of Technology, 2011\n", + "[3] Devendran, D. and Corona, E. Computational Fluid Dynamics Reading Group: Projection Methods\n", + "[4] Thermal instabilities: Benard convection" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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.5.1" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/Amiya Project/Rayleigh Benard Convection-Copy1.ipynb b/Amiya Project/Rayleigh Benard Convection-Copy1.ipynb new file mode 100644 index 0000000..0f04b67 --- /dev/null +++ b/Amiya Project/Rayleigh Benard Convection-Copy1.ipynb @@ -0,0 +1,500 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 60, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "from matplotlib import rcParams, cm\n", + "rcParams['font.family'] = 'serif'\n", + "rcParams['font.size'] = 16" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "delT = 1.209287767702047e-07 Tl = 20.000000120928778\n", + "1.0054144180571545e-06\n" + ] + } + ], + "source": [ + "H = 0.25\n", + "L = 1\n", + "\n", + "alpha = 207*10**(-6) #Volume expansion coefficient of water @ 20 C\n", + "k = 0.6 #Thermal conductivity of water @ 20 C\n", + "\n", + "#ReC = 1100.65 #Critical Rayleigh number for one free and one rigid boundary condition\n", + "ReC = 1708 #Critical Rayleigh number for two rigid body boundary condition\n", + "g = 9.81\n", + "D = 0.143E-6 #Thermal diffusivity of water\n", + "rho_i = 1000 #Density of water @ 20 C\n", + "\n", + "L = 10\n", + "H = 1\n", + "\n", + "nxy = 101\n", + "nt = 10000\n", + "\n", + "dxy = L/(nxy-1)\n", + "\n", + "x = np.linspace(0,L,nxy)\n", + "y = np.linspace(0,H,nxy)\n", + "\n", + "#Change to Kelivin?\n", + "To = 20\n", + "vo = 2.414*10**(-5) * 10**(247.8/(To + 273 - 140)) / rho_i #initial kinematic viscosity of water\n", + "delT = (ReC*vo*1.43*10**(-7))/(alpha*g*H**3)\n", + "Ti = np.ones((nxy, nxy))*To\n", + "Ti[-1,:] = To + 30\n", + "\n", + "rho = np.ones((nxy,nxy), dtype=float)*rho_i\n", + "rho[0,:] = rho_i*(1-alpha*(Ti[0,:] - To))\n", + "\n", + "v = np.ones((nxy,nxy))*2.414*10**(-5) * 10**(247.8/(Ti + 273 - 140)) / rho #kinematic viscosity of water\n", + "\n", + "pi = np.zeros((nxy,nxy), dtype=float)\n", + "pi[:,:] = rho[:,:] * y[:] * g\n", + "\n", + "ui = np.zeros((nxy,nxy), dtype=float)\n", + "\n", + "print('delT =',delT, 'Tl =',20+delT)\n", + "print(vo)\n", + "#print('x =', x, 'y =', y)" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.001\n" + ] + } + ], + "source": [ + "# stability\n", + "sigma = 0.00005\n", + "#dt = sigma*min(dxy,dxy)**2/D\n", + "dt = 0.001\n", + "\n", + "print(dt)" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.1\n" + ] + } + ], + "source": [ + "print(dxy)" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def ftcs(T, To, u, p, rho, rho_i, alpha, v, k, g, y, delT, nt, dt, dxy):\n", + " \n", + " for n in range(nt):\n", + " \n", + " # Boundary conditions\n", + " u[-1,:] = 0 #Top Boundary\n", + " u[0,:] = 0 #Bottom Boundary\n", + " T[-1,:] = To + 30 #Bottom Boundary\n", + " T[0,:] = To #top Boundary\n", + "\n", + " un = u.copy()\n", + " Tn = T.copy()\n", + " pn = p.copy()\n", + " vn = v.copy()\n", + " T[1:-1,1:-1] = Tn[1:-1,1:-1] + dt*((un[1:-1,1:-1]/dxy)*(Tn[2:,1:-1]\\\n", + " + Tn[1:-1,2:] - (2*Tn[1:-1,1:-1])) + \n", + " (k/dxy**2)*(Tn[2:,1:-1] + Tn[:-2,1:-1] + Tn[1:-1,2:]\\\n", + " + Tn[1:-1,:-2] - (4*Tn[1:-1,1:-1])))\n", + " \n", + " rho[1:-1,1:-1] = rho_i*(1- alpha*(T[1:-1,1:-1] - 20))\n", + " p[1:-1,1:-1] = rho[1:-1,1:-1]*y[1:-1] * g\n", + " \n", + " \n", + " u[1:-1,1:-1] = un[1:-1,1:-1] + dt*(-(1/rho_i)*(p[2:,1:-1] + p[1:-1,2:] - 2*p[1:-1,1:-1]) + (rho[1:-1,1:-1]*g/rho_i)\\\n", + " + (1/dxy)*(u[1:-1,1:-1]*0.5*(u[2:,1:-1] - u[:-2,1:-1] \\\n", + " + u[1:-1,2:] - u[1:-1,:-2]) \\\n", + " + (v[1:-1,1:-1]/dxy)*(u[2:,1:-1] + u[:-2,1:-1] + u[1:-1,2:] + u[1:-1,:-2] - 4*u[1:-1,1:-1])))\n", + "\n", + " \n", + " return T" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#T = ftcs(Ti,To,ui,pi,rho,rho_i,alpha,v,k,g,y,delT,nt,dt,dxy)\n", + "# Boundary conditions\n", + "ya = np.ones((nxy,nxy))\n", + "for i in range(nxy):\n", + " ya[:,i] = y\n", + "un = ui.copy()\n", + "Tn = Ti.copy()\n", + "pn = pi.copy()\n", + "vn = v.copy()\n", + "Ti[1:-1,1:-1] = Tn[1:-1,1:-1] + dt*((un[1:-1,1:-1]/dxy)*(Tn[2:,1:-1]\\\n", + " + Tn[1:-1,2:] - (2*Tn[1:-1,1:-1])) + \n", + " (k/dxy**2)*(Tn[2:,1:-1] + Tn[:-2,1:-1] + Tn[1:-1,2:]\\\n", + " + Tn[1:-1,:-2] - (4*Tn[1:-1,1:-1])))\n", + "rho[1:-1,1:-1] = rho_i*(1- alpha*(Ti[1:-1,1:-1] - 20))\n", + "pi[1:-1,1:-1] = rho[1:-1,1:-1]*ya[1:-1,1:-1] * g\n", + "\n", + "ui[-1,:] = 0 #Top Boundary\n", + "ui[0,:] = 0 #Bottom Boundary\n", + "Ti[-1,:] = To + 30 #Bottom Boundary\n", + "Ti[0,:] = To #top Boundary\n" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8,5))\n", + "plt.contourf(x,y,Ti,20,cmap=cm.viridis)\n", + "plt.xlabel('$x$')\n", + "plt.ylabel('$y$')\n", + "plt.colorbar();\n" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 1000. 1000. 1000. ..., 1000. 1000. 1000. ]\n", + " [ 1000. 1000. 1000. ..., 1000. 1000. 1000. ]\n", + " [ 1000. 1000. 1000. ..., 1000. 1000. 1000. ]\n", + " ..., \n", + " [ 1000. 1000. 1000. ..., 1000. 1000. 1000. ]\n", + " [ 1000. 999.6274 999.6274 ..., 999.6274 999.6274 1000. ]\n", + " [ 1000. 1000. 1000. ..., 1000. 1000. 1000. ]]\n" + ] + } + ], + "source": [ + "print(rho)" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.001\n" + ] + } + ], + "source": [ + "print(dt)" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 20. 20. 20. ..., 20. 20. 20. ]\n", + " [ 20. 20. 20. ..., 20. 20. 20. ]\n", + " [ 20. 20. 20. ..., 20. 20. 20. ]\n", + " ..., \n", + " [ 20. 20. 20. ..., 20. 20. 20. ]\n", + " [ 20. 21.8 21.8 ..., 21.8 21.8 20. ]\n", + " [ 50. 50. 50. ..., 50. 50. 50. ]]\n" + ] + } + ], + "source": [ + "print(Ti)" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0. 98.1 196.2 ..., 9613.8 9711.9\n", + " 9810. ]\n", + " [ 0. 98.1 98.1 ..., 98.1 98.1\n", + " 9810. ]\n", + " [ 0. 196.2 196.2 ..., 196.2 196.2\n", + " 9810. ]\n", + " ..., \n", + " [ 0. 9613.8 9613.8 ..., 9613.8 9613.8\n", + " 9810. ]\n", + " [ 0. 9708.28134606 9708.28134606 ..., 9708.28134606\n", + " 9708.28134606 9810. ]\n", + " [ 0. 98.1 196.2 ..., 9613.8 9711.9\n", + " 9810. ]]\n" + ] + } + ], + "source": [ + "print(pi)" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0. 0. 0. ..., 0. 0. 0. ]\n", + " [ 0.01 0.01 0.01 ..., 0.01 0.01 0.01]\n", + " [ 0.02 0.02 0.02 ..., 0.02 0.02 0.02]\n", + " ..., \n", + " [ 0.98 0.98 0.98 ..., 0.98 0.98 0.98]\n", + " [ 0.99 0.99 0.99 ..., 0.99 0.99 0.99]\n", + " [ 1. 1. 1. ..., 1. 1. 1. ]]\n" + ] + } + ], + "source": [ + "print(ya)" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 0. 1. 2. 3. 4. 5. 6.]\n" + ] + } + ], + "source": [ + "yn = np.linspace(0,6,7)\n", + "print(yn)" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 1. 1. 1.]\n", + " [ 1. 1. 1.]\n", + " [ 1. 1. 1.]\n", + " [ 1. 1. 1.]\n", + " [ 1. 1. 1.]\n", + " [ 1. 1. 1.]\n", + " [ 1. 1. 1.]]\n" + ] + } + ], + "source": [ + "yk = np.ones((7,3))\n", + "print(yk)" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0. 1. 1.]\n", + " [ 1. 1. 1.]\n", + " [ 2. 1. 1.]\n", + " [ 3. 1. 1.]\n", + " [ 4. 1. 1.]\n", + " [ 5. 1. 1.]\n", + " [ 6. 1. 1.]]\n" + ] + } + ], + "source": [ + "yk[:,0] = yn\n", + "print(yk)" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0. 0. 0. ..., 0. 0. 0. ]\n", + " [ 0.01 0.01 0.01 ..., 0.01 0.01 0.01]\n", + " [ 0.02 0.02 0.02 ..., 0.02 0.02 0.02]\n", + " ..., \n", + " [ 0.98 0.98 0.98 ..., 0.98 0.98 0.98]\n", + " [ 0.99 0.99 0.99 ..., 0.99 0.99 0.99]\n", + " [ 1. 1. 1. ..., 1. 1. 1. ]]\n" + ] + } + ], + "source": [ + "print(ya)" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 0. 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1 0.11\n", + " 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.19 0.2 0.21 0.22 0.23\n", + " 0.24 0.25 0.26 0.27 0.28 0.29 0.3 0.31 0.32 0.33 0.34 0.35\n", + " 0.36 0.37 0.38 0.39 0.4 0.41 0.42 0.43 0.44 0.45 0.46 0.47\n", + " 0.48 0.49 0.5 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59\n", + " 0.6 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.7 0.71\n", + " 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.8 0.81 0.82 0.83\n", + " 0.84 0.85 0.86 0.87 0.88 0.89 0.9 0.91 0.92 0.93 0.94 0.95\n", + " 0.96 0.97 0.98 0.99 1. ]\n" + ] + } + ], + "source": [ + "print(y)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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.5.1" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/Amiya Project/Rayleigh Benard Convection-Notebook.ipynb b/Amiya Project/Rayleigh Benard Convection-Notebook.ipynb new file mode 100644 index 0000000..9c188d0 --- /dev/null +++ b/Amiya Project/Rayleigh Benard Convection-Notebook.ipynb @@ -0,0 +1,515 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Rayleigh-Benard Convection" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![alt text](images/Benard cells 3D.png)\n", + "\n", + "Natural convection is a mechanism where motion is induced in a fluid, not \n", + "through artificial means but by the effects of bouyancy. One of the most commonly studied convection phenomenon, is the Rayleigh-Benard convection. When a thin layer of fluid is heated from below, once the temperature difference, between the top and bottom fluid layers, grows large enough, convection cells, also called Benard cells, form within the fluid. As a result, some interesting patterns can be observed in the fluid.\n", + "\n", + "![alt text](images/Bénard_cells_convection.ogv.jpg)\n", + "\n", + "In the 1900s, Henri Benard studied convection by heating a thin layer of fluid from below. Benard's experiments attempted to emulate a layer of fluid that was infinitely long.\n", + "\n", + "Inspired by Benard's experiments, in 1916, Lord Rayleigh.....Rayleigh was more interested in the stability aspect of Benard's problem. He showed that when the temperature gradient was high enough to make the Rayleigh number exceed a critical value, instability would occur, leading to the formation of Benard cells.\n", + "\n", + "$$Ra = \\frac{\\alpha \\Delta Tgh^3}{\\nu D }$$\n", + "\n", + "Where,\n", + " $$\\alpha = thermal expansion coefficient$$ \n", + " $$\\nu = $$kinematic viscosity\n", + " $$D = $$thermal diffusivity" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Problem Setup" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this case, we will be considering a layer of fluid placed between to rigid plates.\n", + "\n", + "![alt text](images/Set-up.jpg)\n", + "\n", + "The length of the fluid is assumed to be sufficiently larger than the height, so that it can be considered infinite. Benard's original experiments, used a height 1 mm and a length of 20 cm.(Benard cells and Taylor Vortices)\n", + "\n", + "There are four boundary conditions. Two on each of the rigid plates. The temperatures at the plates are assumed to be constant and the no slip condition is applied.\n", + "\n", + "$$T_{(x,t)}|_{y=0} = T_{o}$$\n", + "$$T_{(x,t)}|_{y=h} = T_{1}$$\n", + "$$u_{(x,t)}|_{y=0} = 0$$\n", + "$$u_{(x,t)}|_{y=h} = 0$$\n", + "\n", + "For initial conditions, the fluid is at rest and the temperature is assumed to be linearly distributed.\n", + "\n", + "$$T_{(x,t)}|_{t=0} = T_{o} + \\frac{y}{h}(T_{1}-T{o})$$\n", + "$$u_{(x,t)}|_{t=0} = 0$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Governing Equations" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The governing equations for this case, are derived by applying the Boussinesq approximation to the Navier-Stokes equations. The Boussinesq approximation neglects all density changes in the momentum and continuity equations, except for the gravity term. The assumption is, that the density changes are small compared to the velocity gradients. The gravitational constant is, however, strong enough to make it relevant.\n", + "\n", + "$$\\nabla \\cdot u = 0$$\n", + "$$\\frac{\\partial u}{\\partial t} + u\\cdot \\nabla u = -\\frac{1}{\\rho_{o}}\\nabla p + \\frac{\\rho}{\\rho_{o}}g + \\nu\\nabla^2u$$\n", + "\n", + "Under the same assumption, the density can be shown to have a linear dependancy on the temperature.\n", + "\n", + "$$\\rho = \\rho_{o}(1-\\alpha(T-T_{o})$$\n", + "\n", + "And finally, the thermal energy equation can be approximated to a familiar form.\n", + "\n", + "$$\\frac{\\partial T}{\\partial t} + u\\cdot \\nabla T = D\\nabla^2T$$\n", + "\n", + "Where the thermal diffusivity, $$D = \\frac{k}{\\rho c}$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Discretization" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "For this problem, I have decided to apply a forward-time central-space discretization scheme. As the boundary conditions for the pressure, depend on the fluid velocity, which is in turn dependant on the pressure, they are difficult to uncouple. One way to decouple the pressure and velocity terms, is by using Chorin's projection method. This is a two step process, not unlike the MacCormack method.\n", + "\n", + "An intermediate velocity term is first calcualted, free of the pressure gradient. \n", + "\n", + "$$\\frac{\\partial u}{\\partial t} + u\\cdot \\nabla u = \\frac{\\rho}{\\rho_{o}}g + \\nu\\nabla^2u$$\n", + "\n", + "This is then used to calculate the pressure gradient for the next time step, which calcualates the next iteration of the velocity field. To find the intermediate velocity, 'u_star', we discretize the above equation using forward-time central space scheme.\n", + "\n", + "$$u_{i,j}^{*} = u_{I,j}^{n} + dt(- \\frac{u_{i,j}^{n}}{2\\delta}(u_{i+1,j}^{n} - u_{i-1,j}^{n} + u_{i,j+1}^{n} - u_{i,j-1}^{n}) + \\frac{\\nu_{i,j}}{\\delta^2}(u_{i+1,j}^{n} + u_{i-1,j}^{n} + u_{i,j+1}^{n} + u_{i,j-1}^{n} - 4u_{i,j}^{n}))$$\n", + "\n", + "Where,\n", + "$$\\delta = dx = dy$$\n", + "\n", + "On taking the divergence of the momentum equation and using the continuity equation, we end up with a Poisson's equation, relating the pressure with u_star.\n", + "\n", + "$$-\\nabla^2 p = -\\frac{\\rho_{o}}{dt}\\nabla \\cdot u^{*}$$\n", + "\n", + "In discretized form,\n", + "\n", + "$$p_{i,j}^{n+1} = \\frac{1}{4}(p_{i+1,j}^{n} + p_{i-1,j}^{n} + p_{i,j+1}^{n} + p_{i,j-1}^{n} - \\frac{\\rho_{o}}{dt}\\delta u_{i,j}^{*})$$\n", + "\n", + "This equation can be solved using " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "from matplotlib import rcParams, cm\n", + "rcParams['font.family'] = 'serif'\n", + "rcParams['font.size'] = 16" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "delT = 0.12092877677020468 Tl = 20.120928776770203\n", + "1.0054144180571545e-06\n" + ] + } + ], + "source": [ + "H = 0.25\n", + "L = 1\n", + "\n", + "alpha = 207*10**(-6) #Volume expansion coefficient of water @ 20 C\n", + "k = 0.6 #Thermal conductivity of water @ 20 C\n", + "\n", + "#ReC = 1100.65 #Critical Rayleigh number for one free and one rigid boundary condition\n", + "ReC = 1708 #Critical Rayleigh number for two rigid body boundary condition\n", + "g = 9.81\n", + "D = 0.143E-6 #Thermal diffusivity of water\n", + "rho_i = 1000 #Density of water @ 20 C\n", + "\n", + "L = 10\n", + "H = 0.01\n", + "\n", + "nxy = 101\n", + "nt = 500\n", + "\n", + "dxy = L/(nxy-1)\n", + "\n", + "x = np.linspace(0,L,nxy)\n", + "y = np.linspace(0,H,nxy)\n", + "ya = np.ones((nxy,nxy))\n", + "for i in range(nxy):\n", + " ya[:,i] = y\n", + "#Change to Kelivin?\n", + "To = 20\n", + "vo = 2.414*10**(-5) * 10**(247.8/(To + 273 - 140)) / rho_i #initial kinematic viscosity of water\n", + "delT = (ReC*vo*1.43*10**(-7))/(alpha*g*H**3)\n", + "Ti = np.ones((nxy, nxy))*To\n", + "Ti[-1,:] = To + 30\n", + "\n", + "rho = np.ones((nxy,nxy), dtype=float)*rho_i\n", + "rho[0,:] = rho_i*(1-alpha*(Ti[0,:] - To))\n", + "\n", + "v = np.ones((nxy,nxy))*2.414*10**(-5) * 10**(247.8/(Ti + 273 - 140)) / rho #kinematic viscosity of water\n", + "\n", + "pi = np.zeros((nxy,nxy), dtype=float)\n", + "pi[:,:] = rho[:,:] * ya[:,:] * g\n", + "\n", + "ui = np.zeros((nxy,nxy), dtype=float)\n", + "\n", + "print('delT =',delT, 'Tl =',20+delT)\n", + "print(vo)\n", + "#print('x =', x, 'y =', y)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.001\n" + ] + } + ], + "source": [ + "# stability\n", + "sigma = 0.00005\n", + "#dt = sigma*min(dxy,dxy)**2/D\n", + "dt = 0.001\n", + "\n", + "print(dt)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.1\n" + ] + } + ], + "source": [ + "print(dxy)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def ftcs(T, To, u, p, rho, rho_i, alpha, v, k, g, y, delT, nt, dt, dxy):\n", + " \n", + " for n in range(nt):\n", + " \n", + " # Boundary conditions\n", + " u[-1,:] = 0 #Top Boundary\n", + " u[0,:] = 0 #Bottom Boundary\n", + " T[0,:] = To + 30 #Bottom Boundary\n", + " T[-1,:] = To #top Boundary\n", + "\n", + " un = u.copy()\n", + " Tn = T.copy()\n", + " pn = p.copy()\n", + " vn = v.copy()\n", + " T[1:-1,1:-1] = Tn[1:-1,1:-1] + dt*((un[1:-1,1:-1]/dxy)*(Tn[2:,1:-1]\\\n", + " + Tn[1:-1,2:] - (2*Tn[1:-1,1:-1])) + \n", + " (k/dxy**2)*(Tn[2:,1:-1] + Tn[:-2,1:-1] + Tn[1:-1,2:]\\\n", + " + Tn[1:-1,:-2] - (4*Tn[1:-1,1:-1])))\n", + " \n", + " rho[1:-1,1:-1] = rho_i*(1- alpha*(T[1:-1,1:-1] - 20))\n", + " p[1:-1,1:-1] = rho[1:-1,1:-1]*ya[1:-1,1:-1] * g\n", + " \n", + " v[1:-1,1:-1] = 2.414*10**(-5) * 10**(247.8/(T[1:-1,1:-1] + 273 - 140)) / rho[1:-1,1:-1]\n", + " \n", + " u[1:-1,1:-1] = un[1:-1,1:-1] + dt*(-(1/rho_i)*(p[2:,1:-1] + p[1:-1,2:] - 2*p[1:-1,1:-1]) + (rho[1:-1,1:-1]*g/rho_i)\\\n", + " + (1/dxy)*(u[1:-1,1:-1]*0.5*(u[2:,1:-1] - u[:-2,1:-1] \\\n", + " + u[1:-1,2:] - u[1:-1,:-2]) \\\n", + " + (v[1:-1,1:-1]/dxy)*(u[2:,1:-1] + u[:-2,1:-1] + u[1:-1,2:] + u[1:-1,:-2] - 4*u[1:-1,1:-1])))\n", + "\n", + " \n", + " return T" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "T = ftcs(Ti,To,ui,pi,rho,rho_i,alpha,v,k,g,y,delT,nt,dt,dxy)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nj600E3hdXkK4bCwwp9XNhywZ6B+43ur4xk8DkaQPkeYZv6vWJSxpf0mfrLZl1YqIkyNip4jYI/+9\nmZW9B9Ny2bVVtrFi/50fJ9SVjyct93p/d5uz1nkO+JsGPQNjSIv8zFutxsD2E9IMjn1qBXn9kIn4\ne7ojTgx651I6uPHTQJRXqLuI9B7tJ+mwXHYA4EVFVle7lODPYFoc63bgK5KGQXH55WDgK74cxTdJ\n3eCn1AokTQLeD/xXRMytqmEVanopLiJ+RbqnwKmShuTik0jTPgf0QNZO+V4JvSRpS9KNn/Zk5Y2f\njoyIp1tWXM9JegHYvMnmL0fEKU22DSj5bmenA6Pz3wPAkojYo9KGVUzS5sB00sI0i0k3fDk3Ir5X\nacPWEnnRnuOBrUmXWFYA3we+WXdDnfVa3c2HtmDluJTyzYfIK9FOJ62+ugx4ivQ9/UB3W7xucmJg\nZmZmBXdjmpmZWcGJgZmZmRWcGJiZmVnBiYGZmZkVnBiYmZlZwYmBmZmZFZwYmJmZWcGJgZmZmRWc\nGJiZmVnBiYGZmZkVnBiYmZlZwYmBmZmZFZwYmJmZWcGJgZmZmRUGVd0AM+s+SUOAfwFeAfYELgDe\nlv++6PvWmw1cioiq22BmXSbpeOAbEbFY0k+BBcBHgReAD0TEryptoJlVxj0GZgOMJAE3R8TiXPS3\nwFERsRzYvLqWmdnawD0GZgOYpNcBs4EREbGw6vaYWfU8+NBsAMq9BgBTgDtrSYGkidW1yszWBk4M\nzAYYSQcDz+anBwJ/yuXDgL2rapeZrR18KcFsgJH0NuBo4Hf571+AXwNDgW9FxCsVNs/MKubEwMzM\nzAq+lGBmZmYFJwZmZmZWcGJgZmZmBScGZmZmVnBiYGZmZgUnBmZmZlZwYmBmZmYFJwZmZmZWcGJg\nZmZmhf8fspCfXfWGFQ4AAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8,5))\n", + "plt.contourf(x,y,Ti,20,cmap=cm.viridis)\n", + "plt.xlabel('$x$')\n", + "plt.ylabel('$y$')\n", + "plt.colorbar();\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 50. 50. 50. ..., 50. 50. 50. ]\n", + " [ 20. 31.24606041 35.92810255 ..., 35.63953431 31.71920868\n", + " 20. ]\n", + " [ 20. 25.96178197 28.87450968 ..., 28.46203708 25.33425292\n", + " 20. ]\n", + " ..., \n", + " [ 20. 20. 20. ..., 20. 20. 20. ]\n", + " [ 20. 20. 20. ..., 20. 20. 20. ]\n", + " [ 20. 20. 20. ..., 20. 20. 20. ]]\n" + ] + } + ], + "source": [ + "print(T)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "102\n" + ] + } + ], + "source": [ + "print(ui.argmax())" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "61.216268941\n" + ] + } + ], + "source": [ + "print(ui[1,3])" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "102\n" + ] + } + ], + "source": [ + "def find_nearest(array,value):\n", + " idx = (np.abs(array-value)).argmin()\n", + " return idx\n", + "\n", + "value = 900\n", + "\n", + "loc = find_nearest(ui, value)\n", + "print(loc)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "830.033812255\n" + ] + } + ], + "source": [ + "print(np.abs(ui-900).min())" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(array([1], dtype=int64), array([1], dtype=int64))\n" + ] + } + ], + "source": [ + "print(np.where(ui==900-np.abs(ui-900).min()))" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0. 0. 0. ..., 0. 0. 0. ]\n", + " [ 0. 69.96618775 0.35068574 ..., 2.53918912 1.3582699 0. ]\n", + " [ 0. 0.35718329 2.76598709 ..., 1.53694795 1.09842556\n", + " 0. ]\n", + " ..., \n", + " [ 0. 2.54165246 1.53732047 ..., 1.5593685 1.0969332 0. ]\n", + " [ 0. 1.35954534 1.09874381 ..., 1.0969332 0.89407909\n", + " 0. ]\n", + " [ 0. 0. 0. ..., 0. 0. 0. ]]\n" + ] + } + ], + "source": [ + "print(ui)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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.5.1" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/Amiya Project/cg_helper.py b/Amiya Project/cg_helper.py new file mode 100644 index 0000000..1debde5 --- /dev/null +++ b/Amiya Project/cg_helper.py @@ -0,0 +1,65 @@ +import numpy +from math import pi +from laplace_helper import L2_rel_error + + + +def poisson_2d(p, b, dx, dy, l2_target): + '''Performs Jacobi relaxation + + Parameters: + ---------- + p : 2D array of floats + Initial guess + b : 2D array of floats + Source term + dx: float + Mesh spacing in x direction + dy: float + Mesh spacing in y direction + l2_target: float + Error target + + Returns: + ------- + p: 2D array of float + Distribution after relaxation + ''' + + l2_norm = 1 + iterations = 0 + l2_conv = [] + + while l2_norm > l2_target: + + pd = p.copy() + + p[1:-1,1:-1] = 1/(2*(dx**2 + dy**2)) * \ + ((pd[1:-1,2:]+pd[1:-1,:-2])*dy**2 +\ + (pd[2:,1:-1] + pd[:-2,1:-1])*dx**2 -\ + b[1:-1,1:-1]*dx**2*dy**2) + + # BCs are automatically enforced + + l2_norm = L2_rel_error(pd,p) + iterations += 1 + l2_conv.append(l2_norm) + + print('Number of Jacobi iterations: {0:d}'.format(iterations)) + return p, l2_conv + +def p_analytical(X,Y,L): + ''' Computes analytical solution to Poisson problem + Parameters: + ---------- + X: 2D array of float + Mesh with x components + Y: 2D array of float + Mesh with y components + L: float + Size of domain + Returns: + ------- + Analytical solution + ''' + return numpy.sin(X*pi/L)*numpy.cos(Y*pi/L) diff --git a/Amiya Project/images/Benard cells 3D.jpg b/Amiya Project/images/Benard cells 3D.jpg new file mode 100644 index 0000000..fa1090a Binary files /dev/null and b/Amiya Project/images/Benard cells 3D.jpg differ diff --git "a/Amiya Project/images/B\303\251nard_cells_convection.ogv.jpg" "b/Amiya Project/images/B\303\251nard_cells_convection.ogv.jpg" new file mode 100644 index 0000000..cd80bde Binary files /dev/null and "b/Amiya Project/images/B\303\251nard_cells_convection.ogv.jpg" differ diff --git a/Amiya Project/images/Set-up.jpg b/Amiya Project/images/Set-up.jpg new file mode 100644 index 0000000..2b0c064 Binary files /dev/null and b/Amiya Project/images/Set-up.jpg differ diff --git a/Amiya Project/laplace_helper.py b/Amiya Project/laplace_helper.py new file mode 100644 index 0000000..60c3cb3 --- /dev/null +++ b/Amiya Project/laplace_helper.py @@ -0,0 +1,64 @@ +import numpy +from matplotlib import pyplot, cm +from mpl_toolkits.mplot3d import Axes3D + +def L2_rel_error(p, pn): + ''' Compute the relative L2 norm of the difference + Parameters: + ---------- + p : array of float + array 1 + pn: array of float + array 2 + Returns: + ------- + Relative L2 norm of the difference + ''' + return numpy.sqrt(numpy.sum((p - pn)**2)/numpy.sum(pn**2)) + +def plot_3D(x, y, p, elev=30, azi=45): + '''Creates 3D projection plot with appropriate limits and viewing angle + + Parameters: + ---------- + x: array of float + nodal coordinates in x + y: array of float + nodal coordinates in y + p: 2D array of float + calculated potential field + + ''' + fig = pyplot.figure(figsize=(11,7), dpi=100) + ax = fig.gca(projection='3d') + X,Y = numpy.meshgrid(x,y) + surf = ax.plot_surface(X,Y,p[:], rstride=1, cstride=1, cmap=cm.viridis, + linewidth=0, antialiased=False) + + ax.set_xlabel('$x$') + ax.set_ylabel('$y$') + ax.set_zlabel('$z$') + ax.view_init(elev,azi) + +def p_analytical(x, y): + '''Returns the analytical solution for the given Laplace Problem on a grid + with coordinates x and y + + Parameters: + ---------- + xL array of float + Nodal coordinates in x + y: array of float + Nodal coordinates in y + + Returns: + ------- + pxy: 2D array of float + Potential distribution analytical solution + + ''' + X, Y = numpy.meshgrid(x,y) + pxy = numpy.sinh(1.5*numpy.pi*Y / x[-1]) /\ + (numpy.sinh(1.5*numpy.pi*y[-1]/x[-1]))*numpy.sin(1.5*numpy.pi*X/x[-1]) + + return pxy diff --git a/Amiya Project/multigrid_helper.py b/Amiya Project/multigrid_helper.py new file mode 100644 index 0000000..39d4fec --- /dev/null +++ b/Amiya Project/multigrid_helper.py @@ -0,0 +1,108 @@ +import numpy +from numba import autojit + +@autojit(nopython=True) +def poisson1d_GS_SingleItr(nx, dx, p, b): + ''' + Gauss-Seidel method for 1D Poisson eq. with Dirichlet BCs at both + ends. Only a single iteration is executed. **blitz** is used. + + Parameters: + ---------- + nx: int, number of grid points in x direction + dx: float, grid spacing in x + p: 1D array of float, approximated soln. in last iteration + b: 1D array of float, 0th-order derivative term in Poisson eq. + + Returns: + ------- + p: 1D array of float, approximated soln. in current iteration + ''' + + for i in range(1,len(p)-1): + p[i] = 0.5 * (p[i+1] + p[i-1] - dx**2 * b[i]) + + return p + + + +def RMS(p): + ''' + Return the root mean square of p. + + Parameters: + ---------- + p: array + + Returns: + ------- + Root mean square of p + ''' + return numpy.sqrt(numpy.sum(p**2) / p.size) + + + +def residual(dx, pn, b, r): + ''' + Calculate the residual for the 1D Poisson equation. + + Parameters: + ---------- + pn: 1D array, approximated solution at a certain iteration n + b: 1D array, the b(x) in the Poisson eq. + + Return: + ---------- + The residual r + ''' + + # r[0] = 0 + r[1:-1] = b[1:-1] - (pn[:-2] - 2 * pn[1:-1] + pn[2:]) / dx**2 + # r[-1] = 0 + + return r + + + +def full_weighting_1d(vF, vC): + ''' + Transfer a vector on a fine grid to a coarse grid with full weighting + . The number of elements (not points) of the coarse grid is + half of that of the fine grid. + + Parameters: + ---------- + vF: 1D numpy array, the vector on the fine grid + vC: 1D numpy array, the vector on the coarse grid, + size(vC) = (size(vF) + 1) / 2 + + Output: vC + ''' + + vC[0] = vF[0] + vC[1:-1] = 0.25 * (vF[1:-3:2] + 2. * vF[2:-2:2] + vF[3:-1:2]) + vC[-1] = vF[-1] + + return vC + + + +def interpolation_1d(vC, vF): + ''' + Transfer a vector on a coarse grid to a fine grid by linear + interpolation. The number of elements (not points) of the coarse + grid is a half of that of the fine grid. + + Parameters: + ---------- + vC: 1D numpy array, the vector on the coarse grid, + vF: 1D numpy array, the vector on the fine grid + size(vF) = size(vC) * 2 - 1 + + Output: vF + ''' + + vF[::2] = vC[:]; + vF[1:-1:2] = 0.5 * (vC[:-1] + vC[1:]) + + return vF