{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sympy as sp\n", "from lbmpy.chapman_enskog import ChapmanEnskogAnalysis\n", "from lbmpy.creationfunctions import create_lb_method\n", "sp.init_printing()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Demo: Automatic Chapman Enskog Analysis \n", "\n", "\n", "First, we create a SRT lattice Boltzmann method. It is defined as the set of moments, together with one relaxation rate per moment." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", "\n", "
MomentEq. Value Relaxation Rate
$1$$\\rho$$\\omega_{0}$
$x$$u_{0}$$\\omega_{1}$
$y$$u_{1}$$\\omega_{1}$
$z$$u_{2}$$\\omega_{1}$
$x^{2}$$\\frac{\\rho}{3} + u_{0}^{2}$$\\omega_{0}$
$y^{2}$$\\frac{\\rho}{3} + u_{1}^{2}$$\\omega_{0}$
$z^{2}$$\\frac{\\rho}{3} + u_{2}^{2}$$\\omega_{0}$
$x y$$u_{0} u_{1}$$\\omega_{0}$
$x z$$u_{0} u_{2}$$\\omega_{0}$
$y z$$u_{1} u_{2}$$\\omega_{0}$
$x^{2} y$$\\frac{u_{1}}{3}$$\\omega_{1}$
$x^{2} z$$\\frac{u_{2}}{3}$$\\omega_{1}$
$x y^{2}$$\\frac{u_{0}}{3}$$\\omega_{1}$
$x z^{2}$$\\frac{u_{0}}{3}$$\\omega_{1}$
$y^{2} z$$\\frac{u_{2}}{3}$$\\omega_{1}$
$y z^{2}$$\\frac{u_{1}}{3}$$\\omega_{1}$
$x^{2} y^{2}$$\\frac{\\rho}{9} + \\frac{u_{0}^{2}}{3} + \\frac{u_{1}^{2}}{3}$$\\omega_{0}$
$x^{2} z^{2}$$\\frac{\\rho}{9} + \\frac{u_{0}^{2}}{3} + \\frac{u_{2}^{2}}{3}$$\\omega_{0}$
$y^{2} z^{2}$$\\frac{\\rho}{9} + \\frac{u_{1}^{2}}{3} + \\frac{u_{2}^{2}}{3}$$\\omega_{0}$
\n", " " ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "method = create_lb_method(method='trt', stencil='D3Q19', compressible=False)\n", "method" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, the Chapman Enskog analysis object is created. This may take a while..." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "analysis = ChapmanEnskogAnalysis(method)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This object now information about the method, e.g. the relation of relaxation rate to viscosities, if the method approximates the compressible or incompressible continuity equation ..." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "analysis.compressible" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAmBAMAAAAlwuZsAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEO+Zu3ZEIqsyiWbdVM2WrI0hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA2UlEQVQoFWMQUlJmgAIjJUUGITCbzbQTRMO4ixmSkLjcBxjqExCyTBsY8i8guPkCDPEFCK4NA8MbIA9m1GEGzp8ILuMXBpkNCC7v91BLEA+qmPkBmAPjMgWgcOsnoHBzoDyYRRRw/4PAB6ABMO+jWAQzmCxZ9lVLLoAMgJpczMD7G4kbf4HhDxI3KYHxHxKXAVUxA4PMAmTZqsMCyFwGLjUULoMSSBpqbzkDgz/IHVDufwEUrgoDw/kCsKy8iysDw24G3q8MDCEuHxnY0tIZGNiMTRIYGMrSEgBPnDRDf1mzMgAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\left [ \\frac{\\rho}{3}\\right ]$$" ], "text/plain": [ "⎡ρ⎤\n", "⎢─⎥\n", "⎣3⎦" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "analysis.pressure_equation" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEwAAAAuBAMAAABwheJJAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMrsi70RmdpmJVKuALsSwAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABkUlEQVQ4Ed2UP0vDQBiHf5L+TYIpBXGzHYrgVMHFzXwDO+jkUnBwcag4CILQ0bEfwCGbgw5xE+rgVmg7ZBdE0VGQqpQKYrw0196b3NHWtTe973O/3OVC7gGmjVRz156WYfMrMAczxJ6Bkxlix8C7PT1XzkVjFfbIQV313FZO0GyQKDh6+16wsMr8EGIEteld4JHAYak9EXIOFJGtbsIKtshvBKM0nG+SFBwkXJgLX0h7FAO6S3sXuofDRB9ag2LgAamqIDvYdrGa6EFzBGQV20OvCtLqnP22Gmy1tCMgq/a7nRcClj7sy1Owd7PqhAJl3/+MgGHDTypPRMmV/N2igbAz725UeA7Y+FfwJ405OKh8hO61LUOJ5OtGUYIy2EOyItM4yfTjRNkna0och1apfQsE26p1wvOFNXaduU7iS5C+0INxxHWisM4oaa0jO+A6UVhnFNOYbr5DnWDCXVyssdVCnSisM1oMzCFGjetEts44hjcse1wnknVECmbzFaFOZOuQmChl64g5Wk04KY393zp/Qi2ByxcRfecAAAAASUVORK5CYII=\n", "text/latex": [ "$$- \\frac{\\omega_{0} - 2}{6 \\omega_{0}}$$" ], "text/plain": [ "-(ω₀ - 2) \n", "──────────\n", " 6⋅ω₀ " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "analysis.get_kinematic_viscosity()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFwAAAAuBAMAAABXK2OhAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMlTvq5l2Zokiu0Rn3bgMAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB3UlEQVRIDd2UzysEYRjHv+/sj9lfMjmIE5bauFAOwmWPSlknFwfbFoUNJynKnKwSbaJolT0pJe1Fthx2T3JwcHA3/wErCmG872rWO+/MaPfg4j3M+zzf72eeed/nnV6ginG1eWtDjSk2IpXIAgqaaJGlVQdcVuCNizhw6IB7eyA/VY9LpZpwWthVqr46Je9zNeF9Vtpxq4BPrQnfs6Gdq3tUXFtfcOo7hoCD6vHQ4EWqx4Kn5iNZi8gESdd1K26L/oXoSddU9X/iDb1sdAD0LHT9gXYkGA63J8LhBRrWl0XuYd+w/9mZn702XawYSWWrZOO8aIjmmczg0rCIETRmQ0kzZmRyHLJqJMa8CCwZsXmub0WQnZJpPAIFk1BJWm7gFy9O8kEv2mgF4QMvrf7JCyxO0OpaHQ1Cc4JFVyK9CRpbSXf2lKrkVbQ6Mf4salLaUxhVmXqGTMbkBvaHxbUDxzuFEQ0ScBLIedhPyg3Z5hbHajPYNZZzaRBsSXi9XCniA3YRyrVEMcmVDiQRK3J5OTwqut/rou4XSEVqDnC2v410cel3uK00ZIOzaxPLM4gp6Of9/LrGp+U4uL4Fctfhn0qzT09bfGeBrt1yis40rJ35BQb8qtj3X3Hk8wq+APCLgMe5ZQ0JAAAAAElFTkSuQmCC\n", "text/latex": [ "$$- \\frac{1}{9} + \\frac{2}{9 \\omega_{0}}$$" ], "text/plain": [ " 1 2 \n", "- ─ + ────\n", " 9 9⋅ω₀" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "analysis.get_bulk_viscosity()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But also details of the analysis are available:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}{\\partial_{t} \\rho} + {\\partial_{0} u_{0}} + {\\partial_{1} u_{1}} + {\\partial_{2} u_{2}}\\\\- \\frac{\\epsilon \\omega_{0}}{2} {\\partial_{2} {\\Pi_{02}^{(1)}}} - \\frac{\\epsilon \\omega_{0}}{2} {\\partial_{1} {\\Pi_{01}^{(1)}}} - \\frac{\\epsilon \\omega_{0}}{2} {\\partial_{0} {\\Pi_{00}^{(1)}}} + \\epsilon {\\partial_{2} {\\Pi_{02}^{(1)}}} + \\epsilon {\\partial_{1} {\\Pi_{01}^{(1)}}} + \\epsilon {\\partial_{0} {\\Pi_{00}^{(1)}}} + \\frac{{\\partial_{0} \\rho}}{3} + {\\partial_{t} u_{0}} + {\\partial_{0} (u_{0}^{2}) } + {\\partial_{1} (u_{0} u_{1}) } + {\\partial_{2} (u_{0} u_{2}) }\\\\- \\frac{\\epsilon \\omega_{0}}{2} {\\partial_{2} {\\Pi_{12}^{(1)}}} - \\frac{\\epsilon \\omega_{0}}{2} {\\partial_{1} {\\Pi_{11}^{(1)}}} - \\frac{\\epsilon \\omega_{0}}{2} {\\partial_{0} {\\Pi_{01}^{(1)}}} + \\epsilon {\\partial_{2} {\\Pi_{12}^{(1)}}} + \\epsilon {\\partial_{1} {\\Pi_{11}^{(1)}}} + \\epsilon {\\partial_{0} {\\Pi_{01}^{(1)}}} + \\frac{{\\partial_{1} \\rho}}{3} + {\\partial_{t} u_{1}} + {\\partial_{1} (u_{1}^{2}) } + {\\partial_{0} (u_{0} u_{1}) } + {\\partial_{2} (u_{1} u_{2}) }\\\\- \\frac{\\epsilon \\omega_{0}}{2} {\\partial_{2} {\\Pi_{22}^{(1)}}} - \\frac{\\epsilon \\omega_{0}}{2} {\\partial_{1} {\\Pi_{12}^{(1)}}} - \\frac{\\epsilon \\omega_{0}}{2} {\\partial_{0} {\\Pi_{02}^{(1)}}} + \\epsilon {\\partial_{2} {\\Pi_{22}^{(1)}}} + \\epsilon {\\partial_{1} {\\Pi_{12}^{(1)}}} + \\epsilon {\\partial_{0} {\\Pi_{02}^{(1)}}} + \\frac{{\\partial_{2} \\rho}}{3} + {\\partial_{t} u_{2}} + {\\partial_{2} (u_{2}^{2}) } + {\\partial_{0} (u_{0} u_{2}) } + {\\partial_{1} (u_{1} u_{2}) }\\end{matrix}\\right]$$" ], "text/plain": [ "⎡ \n", "⎢ \n", "⎢ ε⋅ω₀⋅D(\\Pi_(1)_(1, 0, 1)) ε⋅ω₀⋅D(\\Pi_(1)_(1, 1, 0)) ε⋅ω₀⋅D(\\Pi_(1)_(2, \n", "⎢- ───────────────────────── - ───────────────────────── - ───────────────────\n", "⎢ 2 2 2 \n", "⎢ \n", "⎢ ε⋅ω₀⋅D(\\Pi_(1)_(0, 1, 1)) ε⋅ω₀⋅D(\\Pi_(1)_(0, 2, 0)) ε⋅ω₀⋅D(\\Pi_(1)_(1, \n", "⎢- ───────────────────────── - ───────────────────────── - ───────────────────\n", "⎢ 2 2 2 \n", "⎢ \n", "⎢ ε⋅ω₀⋅D(\\Pi_(1)_(0, 0, 2)) ε⋅ω₀⋅D(\\Pi_(1)_(0, 1, 1)) ε⋅ω₀⋅D(\\Pi_(1)_(1, \n", "⎢- ───────────────────────── - ───────────────────────── - ───────────────────\n", "⎣ 2 2 2 \n", "\n", " D(rho) + D(u_0) + D(u_1) + D(u_2) \n", " \n", "0, 0)) \n", "────── + ε⋅D(\\Pi_(1)_(1, 0, 1)) + ε⋅D(\\Pi_(1)_(1, 1, 0)) + ε⋅D(\\Pi_(1)_(2, 0, \n", " \n", " \n", "1, 0)) \n", "────── + ε⋅D(\\Pi_(1)_(0, 1, 1)) + ε⋅D(\\Pi_(1)_(0, 2, 0)) + ε⋅D(\\Pi_(1)_(1, 1, \n", " \n", " \n", "0, 1)) \n", "────── + ε⋅D(\\Pi_(1)_(0, 0, 2)) + ε⋅D(\\Pi_(1)_(0, 1, 1)) + ε⋅D(\\Pi_(1)_(1, 0, \n", " \n", "\n", " ⎤\n", " ⎥\n", " D(rho) ⎥\n", "0)) + ────── + D(u_0) + D(u_0**2) + D(u_0*u_1) + D(u_0*u_2)⎥\n", " 3 ⎥\n", " ⎥\n", " D(rho) ⎥\n", "0)) + ────── + D(u_1) + D(u_1**2) + D(u_0*u_1) + D(u_1*u_2)⎥\n", " 3 ⎥\n", " ⎥\n", " D(rho) ⎥\n", "1)) + ────── + D(u_2) + D(u_2**2) + D(u_0*u_2) + D(u_1*u_2)⎥\n", " 3 ⎦" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.Matrix(analysis.get_macroscopic_equations())" ] } ], "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.6.4" } }, "nbformat": 4, "nbformat_minor": 2 }