{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "nbsphinx": "hidden" }, "outputs": [], "source": [ "from lbmpy.session import *\n", "from lbmpy.cumulants import *\n", "from lbmpy.moments import *\n", "from lbmpy.continuous_distribution_measures import continuous_moment\n", "from lbmpy.stencils import LBStencil" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Demo: Moments, Cumulants and Maxwellian Equilibrium\n", "\n", "## 1) Moments & Cumulants\n", "\n", "\n", "### Moments\n", "\n", "The *moments* and *cumulants* modules contain functions to calculate moments and cumulants of functions on a discrete velocity space defined by a stencil. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle \\left( f_{0}, \\ f_{1}, \\ f_{2}, \\ f_{3}, \\ f_{4}, \\ f_{5}, \\ f_{6}, \\ f_{7}, \\ f_{8}\\right)$" ], "text/plain": [ "(f₀, f₁, f₂, f₃, f₄, f₅, f₆, f₇, f₈)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stencil = LBStencil(Stencil.D2Q9)\n", "pdfs = sp.symbols(\"f:9\")\n", "pdfs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Discrete moments are computed by following formula:\n", "\n", "$$\\sum_{d \\in S} d_1^{m_1} d_2^{m_2} \\; f_d$$ \n", "\n", "with $S$ being the stencil, $d_i$ the direction components, $f_d$ the function values for each direction and $m_j$ the components of the moment tuple.\n", "\n", "Lets compute the first moment in the first direction, i.e. $(m_1, m_2) = (1,0)$." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "