06_tutorial_thermal_lbm.ipynb 136 KB
 Martin Bauer committed Mar 21, 2019 1 2 3 4 5 6 7 8 9 ``````{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from lbmpy.session import *\n", `````` Martin Bauer committed May 05, 2019 10 `````` "from pystencils.timeloop import TimeLoop" `````` Martin Bauer committed Mar 21, 2019 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 `````` ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Tutorial 06: Coupling two LBM simulations for thermal simulations\n", "\n", "In this notebook we demonstrate how to run a thermal lattice Boltzmann simulation.\n", "We use a separate set of distribution functions to solve the advection-diffusion equation for the temperature.\n", "The zeroth moment of these additional pdfs corresponds to temperature. \n", "\n", "The thermal LB step is coupled to the normal hydrodynamic LB scheme using the Boussinesq approximation. The force on the liquid is proportional to the relative temperature. The hydrodynamic LB method computes the fluid velocity which in turn enters the thermal scheme, completing the two-way coupling.\n", "\n", "To set this up in *lbmpy* we create first a `data handling` object and create an array to store the temperature." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "domain_size = (100, 50)\n", "\n", "gpu = False\n", `````` Martin Bauer committed May 05, 2019 37 `````` "dh = ps.create_data_handling(domain_size)\n", `````` Martin Bauer committed Mar 21, 2019 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 `````` "temperature_field = dh.add_array(\"T\", gpu=gpu)\n", "dh.fill('T', val=1.0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we define how to compute the local force from the temperature field:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "gravity = sp.Matrix([0, -1e-2])\n", "force = -gravity * (temperature_field(0) - 1.0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we can create both LB steps. \n", "\n", "The coupling is created by passing the following parameters to the hydrodynamic step,\n", "\n", "- `compute_velocity_in_every_step`: usually the velocity is not computed/stored in every time step, only for output and plotting reasons. In the coupled algorithm we have to make sure that after every time step the current velocity is stored in an array, since it enters the thermal LB scheme.\n", "- `force`: we can simply pass our sympy expression for the force here, as long as the `LatticeBoltzmannStep` operates on a data handling that stores the fields that are referenced in the expression. This is why we have to create the data handling first and pass it to both Step objects\n", "\n", "and to the thermal step\n", "- `compute_density_in_every_step`: density corresponds to the temperature here, which we need to be computed in every time step, since it enters the force expression for the hydrodynamic scheme\n", "- `equilibrium_order`: for the thermal LB method a first order accurate equilibrium is sufficient. This is slightly faster to compute than the normal equilibrium of order 2\n", "- `velocity_input_array_name`: the velocity entering the thermal equilibrium equation is not computed as first moment of the thermal pdfs. Instead, the hydrodynamic velocity is used here." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "optimization = {'target': 'cpu' if gpu else 'cpu', 'openmp': 2}\n", "\n", "hydro_step = LatticeBoltzmannStep(data_handling=dh, name='hydro', optimization=optimization,\n", " relaxation_rate=1.8,\n", " compute_velocity_in_every_step=True,\n", " force=force)\n", "thermal_step = LatticeBoltzmannStep(data_handling=dh, name='thermal', optimization=optimization,\n", " relaxation_rate=1.8, density_data_name=\"T\",\n", " compute_density_in_every_step=True,\n", " equilibrium_order=1,\n", " velocity_input_array_name=hydro_step.velocity_data_name)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We add `NoSlip` boundary conditions on all four walls for both schemes with the exception of the left wall of the thermal scheme. Here we set a heated wall, where the temperature is fixed to `1.01`. This kind of Dirichlet boundary condition can be set using a `FixedDensity` LB boundary." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { `````` Martin Bauer committed May 05, 2019 109 `````` "image/png": "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6ec///n23/72t0ffeOONN1955ZV3LFy4cIckOfnkk/c5++yz77nttttunj59+ppPfOITzzSgQ4cO7VqwYMGt7373u5cfe+yxk770pS/dfcsttyz65je/ueuyZcs6kuTiiy9esmjRosU33HDDzV/84hfHrB/v6e67797u1FNPffCOO+5YNGrUqHUXXXTRzv33yQEABob+q70JCQGARvrJT34y4ogjjlgxcuTIrtGjR3e98Y1vXPH4448PWrVqVcdb3vKW1Unyvve97+Frr712xPpljj766BVJMnPmzDWTJk1aM378+KeHDx9e995777V33nnn0CQ599xzx0ydOnXarFmz9l+2bNmQRYsWbbfhtseOHbv2Na95zZokOfDAA59YsmTJsP751AAAA0f/1d7ckxAAaKxSXthVJtttt11NkkGDBmXYsGHPPBlw0KBB6ezsLFdeeeXIa665ZuSCBQtuGTlyZNecOXOmrlmz5jlfyg4dOvSZZTs6OurG5gEA2Bbpv9qXXwgA0EiHHXbY6v/4j//YafXq1eXRRx8ddNVVV+20ww47dO24447rfvCDH4xIki9/+cu7HHTQQat7u84VK1Z0jBo1at3IkSO7rr/++u3WX0IDAID+q905kxAAaKRDDjnkiaOPPvqRGTNmTB87duzaOXPmrE6Sf//3f//jBz/4wfGnnnrqoHHjxq295JJLlvR2ncccc8zK888/f7cpU6ZM23fffZ+cOXPm41urfgCAlxr9V3srtdbNz9VHxo8fX88444xnjZ1959h+2z4A0Lc+NfHeZ01/5jOfyV133bXZa0gWLly4ZObMmQ+tn37F3/1oZl8+XW+n7Yd03nDmGxf21foGysKFC3edOXPmhC1dz/B9htdJfzvpWWOrFp+zpasFAAaIHowtsake05mEAMCA00wCAPQ/PRg9uSchAAAAADSckBAAAAAAGk5ICAAAAAANJyQEAAAAgIYTEgIAAABAwwkJAYBGKqXMet/73rfX+ukzzzxzzOmnn77n8y2zcOHCYXPmzJm63377TZs4ceL0d73rXeOT5Morrxz5ute9blKSXHzxxaM+9alP7b51qwcAeGnSg7WvwQNdAADAvHnzZq5du7bP+pJhw4Z1zp07d+HzzTN06ND6ve99b+f7779/2R577NHZm/V+6EMfGnfqqac+cOKJJ65Ikt/85jfDN5znhBNOWJlk5YsqHACgH+nB6MmZhADAgOvL5rS36+vo6KgnnXTS8rPPPnvMhu/ddtttQw866KApU6ZMmXbQQQdNuf3224cmyYMPPjhk/PjxT62fb86cOWs2XPa8887b5aSTThqXJMccc8yE448/ftysWbOmTpgwYcYll1wyass+GQBA39GD0ZOQEABorI9//OMPzp8/f/TDDz/c0XP8Ax/4wLjjjz/+4dtuu+3md77znQ9/8IMf3DtJPvShDz1wxBFHTHnta187+ayzznrZQw891LHxNf/J0qVLh/3mN7+59bvf/e7tp5122vgnnniibK3PAwDwUqAHa0+bDQlLKXuXUn5SSllcSllUSvlwa3x0KeWqUsrtrZ87b/1yAQD6zujRo7uOPfbYh88555yX9Ry//vrrdzjllFMeSZIPfvCDj1x33XUjkuTDH/7wwzfeeOOid7zjHY/87Gc/G/mqV71qvzVr1jxvw3nMMcc80tHRkQMOOGDt3nvvvfaGG27Yrje13XHHHUPmzp07Rg8GAGxr2rkHa7LenEnYmeSjtdb9k7w6yYdKKdOSfDLJ1bXWyUmubk0DALyk/NVf/dUDX//613d9/PHHe3WFxYQJE54+7bTTHr766qv/MHjw4CxYsOA598TpqZTyvNObMmTIkHz0ox99VA8GAGyL2rUHa7LN7oha6/211t+1Xq9KsjjJ2CRvSzKvNdu8JG/fWkUCAGwtY8aMWffWt7710a9//eu7rh878MADH7/gggt2TpIvfvGLo2fPnr06SS699NId165dW5Lk7rvvHrxixYqOnvfH2Zj58+fvvG7duixatGjY0qVLh82cOfPJ3tQ1fvz4p1/+8pc/lejBAIBtT7v2YE32gm5QWUqZkOTAJL9OMqbWen/SHSSWUl72PIsCALStM844Y9m8efN2Wz/9hS984e65c+dO+NznPrf7Lrvs0nnRRRctSZIf/OAHO37sYx8bN2zYsK4kOeuss+4ZN25c5+9///tNrnvSpElr58yZM/Xhhx8e8tnPfvau7bffvr7Q+vRgAMC2qN17sKbpdUhYShmR5LIkp9VaH+vtaZqllFOSnJIko0ePfjE1AgDbuGHDhnX25dP1hg0b1rm5eZ544onr17/ee++9O9esWfPM9NSpU5+69tprb9twmQsuuOCeJPdsOH7kkUeuOvLII1clyamnnvpwkofXv3fIIYes/vKXv7z0hX+Kbn3Rgw3ZZciL3TwAsA3Tg9FTr/5DKKUMSXdzenGtdX5r+IFSyh6tb7D3SPLgxpattZ6f5PwkGT9+vNQWAHiOuXPnLhzoGtrR008/nfRBDzZ8n+F6MADgOfRg9LTZkLB0f1395SSLa63/p8db30kyN8k5rZ9XbJUKAQBeoi677LIlL3bZrq6unHHGGbsmuVwPBgDQe1vSgzVZb84kPDjJf09yYynlhtbYp9LdmH6rlPKeJHcnOXbrlAgA0DxXXXXViB/96Ec7JDlMDwYAwNa22ZCw1vqLJJu6+c3r+7YcAKAhurq6usqgQYNcBrsJhx9++OM33HDDH2fOnPnyjbytBwMAoE8NGugCAIBGumn58uWjurq6evcUjobp6uoqy5cvH5XkpoGuBQCAZuizJ9gAAPRWZ2fne5ctW3bBsmXLZsSXlhvTleSmzs7O9w50IQAANIOQEADod7NmzXowyVEDXQcAAP2ro6Nj1uTJk9esn77iiivueOCBBwZfeOGFu3zlK19ZuqXrHzt27AELFixYvMcee3RuOL7DDjusS5J169aVt7zlLY+ee+659w8fPrzPbn9z8cUXj1q0aNHws88+e9lXv/rVnaZNm/bkrFmznuzt8hdeeOHOZ5999p533nnndj/96U8Xv/a1r31iY/NdeumlO37sYx8b19XVlRNPPPGhs88+e1mSnH322bv927/925ilS5cOu++++xZu+DvYHCEhAAAAQAMd8o1DZq5cu7LPsqFRw0Z1/uK4Xyx8vnmGDRvWdcstt9zcc2zq1KlPbSoQ60vXXHPNbXvssUfnypUrB5144onjTzjhhPHz589f0lfrP+GEE1YmWZkkl19++U6dnZ0rX0hI+IpXvGLNZZdddsf73ve+CZuap7OzMx/5yEfG/fCHP7xt4sSJT8+cOXP/Y445ZsWsWbOePPTQQ1cfc8wxKw877LCpL6Z+l/cAAAAANFBfBoRbsr4rr7xy5Ote97pJSXLyySfv/bGPfWyPJLnssst2nD179tR169blvvvuG/znf/7n+86YMWP/GTNm7P+jH/1ohyRZtmxZx8EHHzx5//33n3b88cePr3XzJwaOGjWqa968eXddddVVOz3wwAMdSfI3f/M3Y2bMmLH/lClTpn3kIx/ZM0luvfXWoRMnTpx+3HHHjZ80adL0gw8+ePLq1atLknz6059+2b777jt9ypQp04488siJSXLeeeftctJJJ4276qqrdvjP//zPnf76r/96r/3222/aokWLhk2bNm3/9du/8cYbh02fPn3/Det65Stf+eTMmTPXPl/tP/3pT3cYP3782mnTpj213Xbb1Xe84x2PXHrppTslycEHH7xm6tSpT/Xql74RQkIAAAAA+sXatWsH7bffftP222+/aYcffvi+G77/z//8z/defvnlo7/73e+O/OhHPzpu3rx5Szo6OvL+979/79NPP/2Bm266afG3v/3tP3zgAx+YkCSf/OQn9zzooINWL168+Oajjjpqxf333z+0N3WMHj26a+zYsU8tWrRou/nz5+94xx13bPf73/9+8eLFi2++4YYbtv/+978/Iknuvvvu7U499dQH77jjjkWjRo1ad9FFF+2cJOedd97uN91008233XbbzV/5ylfu6rnuww8//PE3vOENKz796U/fc8stt9w8ffr0tSNHjlz3q1/9aniSfPGLX9z1+OOPf/jF/P6WLl06dOzYsc8EgXvttddT9957b68+8+a43BgAAACAfrGxy417GjlyZNcXvvCFJW9+85v3O+uss5ZOnz59bZL88pe/3PH2228fvn6+1atXdzz66KODrr322pHz58+/I0mOO+64le9///vX9baW9Wcd/uAHP9jxZz/72Y7Tpk2bliRPPPHEoFtuuWW7iRMnPjV27Ni1r3nNa9YkyYEHHvjEkiVLhiXJ1KlT1xx99NH7HHXUUStOOOGEFZvb1sknn/zQl770pV3nzJmz9Iorrtj5t7/97eLe1rmxmnsqpfTJfRWFhAAAAAC0jRtuuGH4qFGjOu+7774h68dqrVmwYMHiESNGPCcQGzTohV8o++ijjw667777hh5wwAFPXnLJJTnttNPu//jHP/5Qz3luvfXWoUOHDn1mex0dHXXNmjWDkuQnP/nJ7d///vdHXn755Tv9/d///Z633377Tc+3vblz5z567rnn7vmNb3xj1QEHHPDE7rvv3usws6dx48Y968zBe+65Z+iee+759ItZ14ZcbgwAAABAW7jtttuG/su//Mvu11133c1XX331qB//+Mc7JMkhhxzy2Lnnnvuy9fOtv3T31a9+9aoLL7xwlyT51re+teNjjz3WsbltrFy5ctC73/3u8YcffviK3Xbbbd2b3/zmx7761a/uunLlykFJ8sc//nHIvffeu8kT69atW5c//OEPQ9/61reu+td//dd7Vq1a1bFy5cpnbXfEiBHrHnvssWdyt+23374eeuihK08//fRxJ5988kPPXWvvHHrooY8vWbJku1tuuWXok08+WebPnz/6mGOO2eyZjL0hJAQAAABgwHV1deXkk0+e8JnPfGbphAkTnv7Sl7605AMf+MD4J554opx//vlLf/e73+0wZcqUafvuu+/0z3/+87slyTnnnHPfL3/5yxHTpk3b/4c//OGoPfbYY5MP7jj00EOnTJ48eforX/nK/ffee++nvva1r92VJO9f/dUFAAAMEklEQVR4xzseO/bYYx951atetd+UKVOmHX300fuuWLFik2FjZ2dnOf744/eZMmXKtBkzZkx7//vf/8Cuu+76rDMDTzjhhEfOO++83ffff/9pixYtGpYkJ5100iPrt7ex9V500UU7jRkz5uU33HDDDkcfffTkQw45ZHKSLFmyZMihhx46KUmGDBmSf/zHf7z7TW9605TJkydPf/vb3/7I7Nmzn0y6H6YyZsyYlz/wwANDZ86cOe2d73zn+Bfy+y+9eepLXxk/fnw944wznjV29p1j+237AEDf+tTEe581/ZnPfCZ33XVXGaBy2ITh+wyvk/520rPGVi0+Z4CqAQC21IvtwRYuXLhk5syZz5zFdsg3DpnZl084HjVsVOcvjvvFwr5a37bmzDPPHLNy5cqOz33uc/cNZB0LFy7cdebMmRM2HHdPQgAAAIAGEuj1n8MPP3zfu+66a9g111xz20DXsilCQgAAAADYiq666qo/DHQNm+OehAAAAADQcEJCAAAAgGbo6urqcv/oBmvt/66NvSckBAAAAGiGm5YvXz5KUNhMXV1dZfny5aOS3LSx992TEAAAAKABOjs737ts2bILli1bNiNOHGuiriQ3dXZ2vndjbwoJAQAAABpg1qxZDyY5aqDroD1JjQEAAACg4YSEAAAAANBwQkIAAAAAaDghIQAAAAA0nJAQAAAAABpOSAgAAAAADSckBAAAAICGExICAAAAQMMJCQEAAACg4YSEAAAAANBwQkIAAAAAaDghIQAAAAA0nJAQAAAAABpOSAgAAAAADSckBAAAAICGExICAAAAQMMJCQEAAACg4YSEAAAAANBwQkIAAAAAaDghIQAAAAA0nJAQAAAAABpOSAgA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\n", `````` Martin Bauer committed Mar 21, 2019 110 111 112 113 `````` "text/plain": [ "