************************** Lattice Boltzmann Equation ************************** The discrete version of Boltzmann equation is called lattice Boltzmann equation, and with the BGK collision operator is written as (:footcite:t:`Mohamad2010-990`): .. math:: f_i(\boldsymbol{x} + \boldsymbol{c}_i \Delta t, t+\Delta t) - f_i(\boldsymbol{x}, t) = - \omega\bigg[f_i(\boldsymbol{x}, t)-f_i^\mathrm{eq}(\boldsymbol{x}, t)\bigg] + \Delta t\left(1-\frac{\omega}{2}\right)F_i(\boldsymbol{x}, t) :label: lbgk where :math:`f_i` are the so-called populations and :math:`\omega = \Delta t / \tau` is the non-dimensional relaxation frequency. The :math:`i` directions are set according to a discrete lattice such as the classical D3Q27. The above equation is also discrete in space and time according to a finite differences scheme :footcite:t:`Kruger2016-cv`. While :math:`x` sits on a cartesian grid with spacing :math:`\Delta x`, :math:`t` has a uniform time-step :math:`\Delta t / c_s = \sqrt{3}`. :math:`c_s` is the speed of sound, used extensively as a scaling factor in LBM context. :math:`Q_{i\alpha\beta} = c_{i\alpha}c_{i\beta} - c_s^2\delta_{\alpha\beta}` is the scaled second-order Hermite polynomial and :math:`\delta_{\alpha\beta}` is the Kronecker delta. The discrete-velocity force is :footcite:t:`Guo2002-04`. .. math:: F_i = w_i\left[ a_\mathrm{s}^2 c_{i\alpha} F_\alpha + \frac{1}{2} a_\mathrm{s}^4 \left( F_\alpha u_\beta + F_\beta u_\alpha\right)Q_{i\alpha\beta}\right] :label: force The moments from discrete velocity force are: .. math:: \sum_{i}F_{i}=0 :label: force_mom1 .. math:: \sum_{i}F_{i}c_{i,\alpha}=F_{\alpha} :label: force_mom2 .. math:: \sum_{i}F_{i}c_{i,\alpha}c_{i,\beta}=F_{\alpha}u_{\beta} + F_{\beta}u_{\alpha} :label: force_mom3 ============== Flow Evolution ============== The lattice Boltzmann equation is performed in two stages, named collision and streaming. The right-hand side of the Eq :math:numref:`lbgk` is solved first at collision, where we make :math:`f_{i}=f_{i}^{\mathrm{eq}}+f_{i}^{\mathrm{neq}}`: .. math:: f_i^* = \left(1 - \omega\right)f_{i}^{\mathrm{neq}} + f_i^\mathrm{eq} + \Delta t \left(1 - \frac{\omega}{2}\right) F_i :label: fpostcoll The corresponding amount is called **post-collision population**, denoted with an asterisk. The final step needed to solve the lattice Boltzmann equation is called **streaming**, which is a shift of the post-collision populations along their velocity directions: .. math:: f_{i}(\boldsymbol{x} + \boldsymbol{c}_{i} \Delta t, t+\Delta t) = f_{i}^{*}(\boldsymbol{x}, t) :label: streaming The collision/streaming procedures account for the evolution of the flow. .. footbibliography::