{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# The conservative Allen-Cahn model for high Reynolds number, two phase flow with large-density and viscosity constrast"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pystencils as ps\n",
    "from lbmpy.session import *\n",
    "\n",
    "from pystencils.boundaries import BoundaryHandling\n",
    "\n",
    "from lbmpy.phasefield_allen_cahn.contact_angle import ContactAngle\n",
    "from lbmpy.phasefield_allen_cahn.kernel_equations import *\n",
    "from lbmpy.phasefield_allen_cahn.parameter_calculation import calculate_parameters_rti, AllenCahnParameters\n",
    "from lbmpy.advanced_streaming import LBMPeriodicityHandling\n",
    "from lbmpy.boundaries import NoSlip, LatticeBoltzmannBoundaryHandling"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If `cupy` is installed the simulation automatically runs on GPU"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "try:\n",
    "    import cupy\n",
    "except ImportError:\n",
    "    cupy = None\n",
    "    gpu = False\n",
    "    target = ps.Target.CPU\n",
    "    print('No cupy installed')\n",
    "\n",
    "if cupy:\n",
    "    gpu = True\n",
    "    target = ps.Target.GPU"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The conservative Allen-Cahn model (CACM) for two-phase flow is based on the work of Fakhari et al. (2017) [Improved locality of the phase-field lattice-Boltzmann model for immiscible fluids at high density ratios](http://dx.doi.org/10.1103/PhysRevE.96.053301). The model can be created for two-dimensional problems as well as three-dimensional problems, which have been described by Mitchell et al. (2018) [Development of a three-dimensional\n",
    "phase-field lattice Boltzmann method for the study of immiscible fluids at high density ratios](http://dx.doi.org/10.1103/PhysRevE.96.053301). Furthermore, cascaded lattice Boltzmann methods can be combined with the model which was described in [A cascaded phase-field lattice Boltzmann model for the simulation of incompressible, immiscible fluids with high density contrast](http://dx.doi.org/10.1016/j.camwa.2019.08.018)\n",
    "\n",
    "\n",
    "The CACM is suitable for simulating highly complex two phase flow problems with high-density ratios and high Reynolds numbers. In this tutorial, an overview is provided on how to derive the model with lbmpy. For this, the model is defined with two LBM populations. One for the interface tracking, which we call the phase-field LB step and one for recovering the hydrodynamic properties. The latter is called the hydrodynamic LB step."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Geometry Setup\n",
    "\n",
    "First of all, the stencils for the phase-field LB step as well as the stencil for the hydrodynamic LB step are defined. According to the stencils, the simulation can be performed in either 2D- or 3D-space. For 2D simulations, only the D2Q9 stencil is supported. For 3D simulations, the D3Q15, D3Q19 and the D3Q27 stencil are supported. Note here that the cascaded LBM can not be derived for D3Q15 stencils."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "stencil_phase = LBStencil(Stencil.D2Q9)\n",
    "stencil_hydro = LBStencil(Stencil.D2Q9)\n",
    "assert(len(stencil_phase[0]) == len(stencil_hydro[0]))\n",
    "\n",
    "dimensions = len(stencil_phase[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Definition of the domain size"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# domain \n",
    "L0 = 256\n",
    "domain_size = (L0, 4 * L0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Parameter definition\n",
    "\n",
    "The next step is to calculate all parameters which are needed for the simulation. In this example, a Rayleigh-Taylor instability test case is set up. The parameter calculation for this setup is already implemented in lbmpy and can be used with the dimensionless parameters which describe the problem."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# time step\n",
    "timesteps = 8000\n",
    "\n",
    "# reference time\n",
    "reference_time = 4000\n",
    "\n",
    "# calculate the parameters for the RTI\n",
    "parameters = calculate_parameters_rti(reference_length=L0,\n",
    "                                      reference_time=reference_time,\n",
    "                                      density_heavy=1.0,\n",
    "                                      capillary_number=0.44,\n",
    "                                      reynolds_number=3000,\n",
    "                                      atwood_number=0.998,\n",
    "                                      peclet_number=1000,\n",
    "                                      density_ratio=1000,\n",
    "                                      viscosity_ratio=100)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This function returns a `AllenCahnParameters` class. It is struct like class holding all parameters for the conservative Allen Cahn model:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "        <table style=\"border:none; width: 100%\">\n",
       "            <tr style=\"border:none\">\n",
       "                <th style=\"border:none\" >Name</th>\n",
       "                <th style=\"border:none\" >SymPy Symbol </th>\n",
       "                <th style=\"border:none\" >Value</th>\n",
       "            </tr>\n",
       "            <tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">Density heavy phase</td>\n",
       "                            <td style=\"border:none\">$\\rho_{H}$</td>\n",
       "                            <td style=\"border:none\">$1.0$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">Density light phase</td>\n",
       "                            <td style=\"border:none\">$\\rho_{L}$</td>\n",
       "                            <td style=\"border:none\">$0.001$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">Relaxation time heavy phase</td>\n",
       "                            <td style=\"border:none\">$\\tau_{H}$</td>\n",
       "                            <td style=\"border:none\">$0.0164004086170318$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">Relaxation time light phase</td>\n",
       "                            <td style=\"border:none\">$\\tau_{L}$</td>\n",
       "                            <td style=\"border:none\">$0.164004086170318$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">Relaxation rate Allen Cahn LB</td>\n",
       "                            <td style=\"border:none\">$\\omega_{\\phi}$</td>\n",
       "                            <td style=\"border:none\">$1.82082623441035$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">Gravitational acceleration</td>\n",
       "                            <td style=\"border:none\">$F_{g}$</td>\n",
       "                            <td style=\"border:none\">$-1.60320641282565 \\cdot 10^{-5}$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">Interface thickness</td>\n",
       "                            <td style=\"border:none\">$W$</td>\n",
       "                            <td style=\"border:none\">$5$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">Mobility</td>\n",
       "                            <td style=\"border:none\">$M_{m}$</td>\n",
       "                            <td style=\"border:none\">$0.0164004086170318$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">Surface tension</td>\n",
       "                            <td style=\"border:none\">$\\sigma$</td>\n",
       "                            <td style=\"border:none\">$0.000795967692961681$</td>\n",
       "                         </tr>\n",
       "\n",
       "        </table>\n",
       "        "
      ],
      "text/plain": [
       "<lbmpy.phasefield_allen_cahn.parameter_calculation.AllenCahnParameters at 0x1329b88b0>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "parameters"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Fields\n",
    "\n",
    "As a next step all fields which are needed get defined. To do so, we create a `datahandling` object. More details about it can be found in the third tutorial of the [pystencils framework]( http://pycodegen.pages.walberla.net/pystencils/). This object holds all fields and manages the kernel runs."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# create a datahandling object\n",
    "dh = ps.create_data_handling((domain_size), periodicity=(True, False), parallel=False, default_target=target)\n",
    "\n",
    "# pdf fields. g is used for hydrodynamics and h for the interface tracking \n",
    "g = dh.add_array(\"g\", values_per_cell=len(stencil_hydro))\n",
    "dh.fill(\"g\", 0.0, ghost_layers=True)\n",
    "h = dh.add_array(\"h\",values_per_cell=len(stencil_phase))\n",
    "dh.fill(\"h\", 0.0, ghost_layers=True)\n",
    "\n",
    "g_tmp = dh.add_array(\"g_tmp\", values_per_cell=len(stencil_hydro))\n",
    "dh.fill(\"g_tmp\", 0.0, ghost_layers=True)\n",
    "h_tmp = dh.add_array(\"h_tmp\",values_per_cell=len(stencil_phase))\n",
    "dh.fill(\"h_tmp\", 0.0, ghost_layers=True)\n",
    "\n",
    "# velocity field\n",
    "u = dh.add_array(\"u\", values_per_cell=dh.dim)\n",
    "dh.fill(\"u\", 0.0, ghost_layers=True)\n",
    "\n",
    "# phase-field\n",
    "C = dh.add_array(\"C\")\n",
    "dh.fill(\"C\", 0.0, ghost_layers=True)\n",
    "C_tmp = dh.add_array(\"C_tmp\")\n",
    "dh.fill(\"C_tmp\", 0.0, ghost_layers=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As a next step the relaxation time is stated in a symbolic form. It is calculated via interpolation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "rho_L = parameters.symbolic_density_light\n",
    "rho_H = parameters.symbolic_density_heavy\n",
    "density = rho_L + C.center * (rho_H - rho_L)\n",
    "\n",
    "body_force = [0, 0, 0]\n",
    "body_force[1] = parameters.symbolic_gravitational_acceleration * density"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Definition of the lattice Boltzmann methods"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For both LB steps, a weighted orthogonal MRT (WMRT) method is used. It is also possible to change the method to a simpler SRT scheme or a more complicated CLBM scheme. The CLBM scheme can be obtained with `Method.CENTRAL_MOMENT`. Note here that the hydrodynamic LB step is formulated as an incompressible velocity-based LBM. Thus, the velocity terms can not be removed from the equilibrium in the central moment space."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "        <table style=\"border:none; width: 100%\">\n",
       "            <tr>\n",
       "                <th colspan=\"3\" style=\"text-align: left\">\n",
       "                    Moment-Based Method\n",
       "                </th>\n",
       "                <td>Stencil: D2Q9</td>\n",
       "                <td>Zero-Centered Storage: &#10003;</td>\n",
       "                <td>Force Model: Guo</td>\n",
       "            </tr>\n",
       "        </table>\n",
       "        \n",
       "        <table style=\"border:none; width: 100%\">\n",
       "            <tr>\n",
       "                <th colspan=\"3\" style=\"text-align: left\">\n",
       "                    Continuous Hydrodynamic Maxwellian Equilibrium\n",
       "                </th>\n",
       "                <td rowspan=\"2\" style=\"width: 50%; text-align: center\">\n",
       "                    $f (\\rho, \\left( u_{0}, \\  u_{1}\\right), \\left( v_{0}, \\  v_{1}\\right)) \n",
       "                        = \\frac{3 \\rho e^{- \\frac{3 \\left(- u_{0} + v_{0}\\right)^{2}}{2} - \\frac{3 \\left(- u_{1} + v_{1}\\right)^{2}}{2}}}{2 \\pi}$\n",
       "                </td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                <td>Compressible: &#10003;</td>\n",
       "                <td>Deviation Only: &#10007;</td>\n",
       "                <td>Order: 2</td>\n",
       "            </tr>\n",
       "        </table>\n",
       "        \n",
       "        <table style=\"border:none; width: 100%\">\n",
       "            <tr> <th colspan=\"3\" style=\"text-align: left\"> Relaxation Info </th> </tr>\n",
       "            <tr>\n",
       "                <th>Moment</th>\n",
       "                <th>Eq. Value </th>\n",
       "                <th>Relaxation Rate</th>\n",
       "            </tr>\n",
       "        <tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">$1$</td>\n",
       "                            <td style=\"border:none\">$\\rho$</td>\n",
       "                            <td style=\"border:none\">$0$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">$x$</td>\n",
       "                            <td style=\"border:none\">$\\rho u_{0}$</td>\n",
       "                            <td style=\"border:none\">$\\omega_{\\phi}$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">$y$</td>\n",
       "                            <td style=\"border:none\">$\\rho u_{1}$</td>\n",
       "                            <td style=\"border:none\">$\\omega_{\\phi}$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">$x^{2} - y^{2}$</td>\n",
       "                            <td style=\"border:none\">$\\rho u_{0}^{2} - \\rho u_{1}^{2}$</td>\n",
       "                            <td style=\"border:none\">$1$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">$x y$</td>\n",
       "                            <td style=\"border:none\">$\\rho u_{0} u_{1}$</td>\n",
       "                            <td style=\"border:none\">$1$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">$3 x^{2} + 3 y^{2} - 2$</td>\n",
       "                            <td style=\"border:none\">$3 \\rho u_{0}^{2} + 3 \\rho u_{1}^{2}$</td>\n",
       "                            <td style=\"border:none\">$1$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">$3 x^{2} y - y$</td>\n",
       "                            <td style=\"border:none\">$0$</td>\n",
       "                            <td style=\"border:none\">$1$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">$3 x y^{2} - x$</td>\n",
       "                            <td style=\"border:none\">$0$</td>\n",
       "                            <td style=\"border:none\">$1$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">$9 x^{2} y^{2} - 3 x^{2} - 3 y^{2} + 1$</td>\n",
       "                            <td style=\"border:none\">$0$</td>\n",
       "                            <td style=\"border:none\">$1$</td>\n",
       "                         </tr>\n",
       "</table>"
      ],
      "text/plain": [
       "<lbmpy.methods.momentbased.momentbasedmethod.MomentBasedLbMethod at 0x1346b22e0>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "w_c = parameters.symbolic_omega_phi\n",
    "\n",
    "config_phase = LBMConfig(stencil=stencil_phase, method=Method.MRT, compressible=True,\n",
    "                         delta_equilibrium=False,\n",
    "                         force=sp.symbols(\"F_:2\"), velocity_input=u,\n",
    "                         weighted=True, relaxation_rates=[0, w_c, w_c, 1, 1, 1, 1, 1, 1],\n",
    "                         output={'density': C_tmp})\n",
    "\n",
    "method_phase = create_lb_method(lbm_config=config_phase)\n",
    "\n",
    "method_phase"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "        <table style=\"border:none; width: 100%\">\n",
       "            <tr>\n",
       "                <th colspan=\"3\" style=\"text-align: left\">\n",
       "                    Moment-Based Method\n",
       "                </th>\n",
       "                <td>Stencil: D2Q9</td>\n",
       "                <td>Zero-Centered Storage: &#10003;</td>\n",
       "                <td>Force Model: Guo</td>\n",
       "            </tr>\n",
       "        </table>\n",
       "        \n",
       "        <table style=\"border:none; width: 100%\">\n",
       "            <tr>\n",
       "                <th colspan=\"3\" style=\"text-align: left\">\n",
       "                    Continuous Hydrodynamic Maxwellian Equilibrium\n",
       "                </th>\n",
       "                <td rowspan=\"2\" style=\"width: 50%; text-align: center\">\n",
       "                    $f (\\rho, \\left( u_{0}, \\  u_{1}\\right), \\left( v_{0}, \\  v_{1}\\right)) \n",
       "                        = \\frac{3 \\delta_{\\rho} e^{- \\frac{3 v_{0}^{2}}{2} - \\frac{3 v_{1}^{2}}{2}}}{2 \\pi} - \\frac{3 e^{- \\frac{3 v_{0}^{2}}{2} - \\frac{3 v_{1}^{2}}{2}}}{2 \\pi} + \\frac{3 e^{- \\frac{3 \\left(- u_{0} + v_{0}\\right)^{2}}{2} - \\frac{3 \\left(- u_{1} + v_{1}\\right)^{2}}{2}}}{2 \\pi}$\n",
       "                </td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                <td>Compressible: &#10007;</td>\n",
       "                <td>Deviation Only: &#10003;</td>\n",
       "                <td>Order: 2</td>\n",
       "            </tr>\n",
       "        </table>\n",
       "        \n",
       "        <table style=\"border:none; width: 100%\">\n",
       "            <tr> <th colspan=\"3\" style=\"text-align: left\"> Relaxation Info </th> </tr>\n",
       "            <tr>\n",
       "                <th>Moment</th>\n",
       "                <th>Eq. Value </th>\n",
       "                <th>Relaxation Rate</th>\n",
       "            </tr>\n",
       "        <tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">$1$</td>\n",
       "                            <td style=\"border:none\">$\\delta_{\\rho}$</td>\n",
       "                            <td style=\"border:none\">$0.0$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">$x$</td>\n",
       "                            <td style=\"border:none\">$u_{0}$</td>\n",
       "                            <td style=\"border:none\">$0.0$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">$y$</td>\n",
       "                            <td style=\"border:none\">$u_{1}$</td>\n",
       "                            <td style=\"border:none\">$0.0$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">$x^{2} - y^{2}$</td>\n",
       "                            <td style=\"border:none\">$u_{0}^{2} - u_{1}^{2}$</td>\n",
       "                            <td style=\"border:none\">$\\frac{2}{2 {C}_{(0,0)} \\left(\\tau_{H} - \\tau_{L}\\right) + 2 \\tau_{L} + 1}$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">$x y$</td>\n",
       "                            <td style=\"border:none\">$u_{0} u_{1}$</td>\n",
       "                            <td style=\"border:none\">$\\frac{2}{2 {C}_{(0,0)} \\left(\\tau_{H} - \\tau_{L}\\right) + 2 \\tau_{L} + 1}$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">$3 x^{2} + 3 y^{2} - 2$</td>\n",
       "                            <td style=\"border:none\">$3 u_{0}^{2} + 3 u_{1}^{2}$</td>\n",
       "                            <td style=\"border:none\">$1$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">$3 x^{2} y - y$</td>\n",
       "                            <td style=\"border:none\">$0$</td>\n",
       "                            <td style=\"border:none\">$1$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">$3 x y^{2} - x$</td>\n",
       "                            <td style=\"border:none\">$0$</td>\n",
       "                            <td style=\"border:none\">$1$</td>\n",
       "                         </tr>\n",
       "<tr style=\"border:none\">\n",
       "                            <td style=\"border:none\">$9 x^{2} y^{2} - 3 x^{2} - 3 y^{2} + 1$</td>\n",
       "                            <td style=\"border:none\">$0$</td>\n",
       "                            <td style=\"border:none\">$1$</td>\n",
       "                         </tr>\n",
       "</table>"
      ],
      "text/plain": [
       "<lbmpy.methods.momentbased.momentbasedmethod.MomentBasedLbMethod at 0x137772a30>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "omega = parameters.omega(C)\n",
    "config_hydro = LBMConfig(stencil=stencil_hydro, method=Method.MRT, compressible=False,\n",
    "                         weighted=True, relaxation_rates=[omega, 1, 1, 1],\n",
    "                         force=sp.symbols(\"F_:2\"), output={'velocity': u})\n",
    "\n",
    "method_hydro = create_lb_method(lbm_config=config_hydro)\n",
    "\n",
    "method_hydro"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Initialization"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The probability distribution functions (pdfs) are initialised with the equilibrium distribution for the LB methods."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "h_updates = initializer_kernel_phase_field_lb(method_phase, C, u, h, parameters)\n",
    "g_updates = initializer_kernel_hydro_lb(method_hydro, 1, u, g)\n",
    "\n",
    "cfg = ps.CreateKernelConfig(target=dh.default_target)\n",
    "cfg.cpu.openmp.enable = True\n",
    "\n",
    "h_init = ps.create_kernel(h_updates, config=cfg).compile()\n",
    "g_init = ps.create_kernel(g_updates, config=cfg).compile()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Following this, the phase field is initialised directly in python."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# initialize the domain\n",
    "def Initialize_distributions():\n",
    "    Nx = domain_size[0]\n",
    "    Ny = domain_size[1]\n",
    "    \n",
    "    for block in dh.iterate(ghost_layers=True, inner_ghost_layers=False):\n",
    "        x = np.zeros_like(block.midpoint_arrays[0])\n",
    "        x[:, :] = block.midpoint_arrays[0]\n",
    "        \n",
    "        y = np.zeros_like(block.midpoint_arrays[1])\n",
    "        y[:, :] = block.midpoint_arrays[1]\n",
    "\n",
    "        y -= 2 * L0\n",
    "        tmp = 0.1 * Nx * np.cos((2 * np.pi * x) / Nx)\n",
    "        init_values = 0.5 + 0.5 * np.tanh((y - tmp) / (parameters.interface_thickness / 2))\n",
    "        block[\"C\"][:, :] = init_values\n",
    "        block[\"C_tmp\"][:, :] = init_values\n",
    "        \n",
    "    if gpu:\n",
    "        dh.all_to_gpu()            \n",
    "    \n",
    "    dh.run_kernel(h_init, **parameters.symbolic_to_numeric_map)\n",
    "    dh.run_kernel(g_init)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x137ad6bb0>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA64AAAFlCAYAAADrtrUsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAAsTAAALEwEAmpwYAAAbkUlEQVR4nO3df7DddX3n8df75ibhl5IAMQLBBiVV6Q+pjZSq46i0CnSn0K51dXaUseyws6Pd7tqZLd3dGXfa3f7Y6dbWbtcdtlhwp611aa2MtVqKWmstSLQUREQigiRCEkISfuTnveezf9xv7BUJkNybez+59/GYuXO/53O+55zPzXzm3vvM93u+t1prAQAAgF6NzfcEAAAA4OkIVwAAALomXAEAAOiacAUAAKBrwhUAAICuCVcAAAC6Nj7fE3g6p512Wlu7du18TwOAheLAl+d7BgvD0u+f7xkAsEB88YtffLi1tuqZ9us6XNeuXZsNGzbM9zQAWCBGD62b7yksCGPP97MZgNlRVfc/m/2cKgwAAEDXhCsAAABde8ZwraoPVNXWqvrytLFTqurGqrpn+LxyGK+qel9Vbayq26vq5dMec/mw/z1VdfnR+XIAAABYaJ7NEddrk1z0pLGrktzUWluX5KbhdpJcnGTd8HFlkvcnU6Gb5D1JfiTJ+UneczB2AQAA4Ok8Y7i21j6b5JEnDV+a5Lph+7okl00b/2CbcnOSFVV1epI3JrmxtfZIa21Hkhvz3TEMAAAA3+VI3+O6urX24LD9UJLVw/aZSR6Ytt+mYexQ49+lqq6sqg1VtWHbtm1HOD0AAAAWihlfnKm11pK0WZjLwee7urW2vrW2ftWqZ/xzPgAAACxwRxquW4ZTgDN83jqMb05y1rT91gxjhxoHAACAp3Wk4XpDkoNXBr48yUenjb99uLrwBUl2DacUfzLJG6pq5XBRpjcMYwAAAPC0xp9ph6r64ySvTXJaVW3K1NWBfz3Jh6vqiiT3J3nzsPvHk1ySZGOS3UnekSSttUeq6leS3Drs98uttSdf8AkAAAC+yzOGa2vtrYe468Kn2LcleechnucDST5wWLMDAABg0ZvxxZkAAADgaBKuAAAAdE24AgAA0DXhCgAAQNeEKwAAAF0TrgAAAHRNuAIAANA14QoAAEDXhCsAAABdE64AAAB0TbgCAADQNeEKAABA14QrAAAAXROuAAAAdE24AgAA0DXhCgAAQNeEKwAAAF0TrgAAAHRNuAIAANA14QoAAEDXhCsAAABdE64AAAB0TbgCAADQNeEKAABA14QrAAAAXROuAAAAdE24AgAA0DXhCgAAQNeEKwAAAF0TrgAAAHRNuAIAANA14QoAAEDXhCsAAABdE64AAAB0TbgCAADQNeEKAABA14QrAAAAXROuAAAAdE24AgAA0DXhCgAAQNeEKwAAAF0TrgAAAHRNuAIAANA14QoAAEDXhCsAAABdE64AAAB0TbgCAADQNeEKAABA14QrAAAAXROuAAAAdE24AgAA0DXhCgAAQNeEKwAAAF0TrgAAAHRtRuFaVf++qu6sqi9X1R9X1XFVdXZV3VJVG6vqT6pq2bDv8uH2xuH+tbPyFQAAALCgHXG4VtWZSf5tkvWtte9PsiTJW5L8RpL3ttbOSbIjyRXDQ65IsmMYf++wHwAAADytmZ4qPJ7k+KoaT3JCkgeTvD7J9cP91yW5bNi+dLid4f4Lq6pm+PoAAAAscEccrq21zUl+M8k3MxWsu5J8McnO1trEsNumJGcO22cmeWB47MSw/6lH+voAAAAsDjM5VXhlpo6inp3kjCQnJrlophOqqiurakNVbdi2bdtMnw4AAIBj3ExOFf6xJN9orW1rrR1I8mdJXpVkxXDqcJKsSbJ52N6c5KwkGe4/Ocn2Jz9pa+3q1tr61tr6VatWzWB6AAAALAQzCddvJrmgqk4Y3qt6YZKvJPl0kjcN+1ye5KPD9g3D7Qz3f6q11mbw+gAAACwCM3mP6y2ZusjSl5LcMTzX1Ul+Mcm7q2pjpt7Des3wkGuSnDqMvzvJVTOYNwAAAIvE+DPvcmittfckec+Thu9Ncv5T7Ls3yc/M5PUAAABYfGb653AAAADgqBKuAAAAdE24AgAA0DXhCgAAQNeEKwAAAF0TrgAAAHRNuAIAANA14QoAAEDXhCsAAABdE64AAAB0TbgCAADQNeEKAABA14QrAAAAXROuAAAAdE24AgAA0DXhCgAAQNeEKwAAAF0TrgAAAHRNuAIAANA14QoAAEDXhCsAAABdE64AAAB0TbgCAADQNeEKAABA14QrAAAAXROuAAAAdE24AgAA0DXhCgAAQNeEKwAAAF0TrgAAAHRNuAIAANA14QoAAEDXhCsAAABdE64AAAB0TbgCAADQNeEKAABA14QrAAAAXROuAAAAdE24AgAA0DXhCgAAQNeEKwAAAF0TrgAAAHRNuAIAANA14QoAAEDXhCsAAABdE64AAAB0TbgCAADQNeEKAABA14QrAAAAXROuAAAAdE24AgAA0DXhCgAAQNeEKwAAAF0TrgAAAHRNuAIAANC1GYVrVa2oquur6qtVdVdV/WhVnVJVN1bVPcPnlcO+VVXvq6qNVXV7Vb18dr4EAAAAFrKZHnH9nSSfaK29JMnLktyV5KokN7XW1iW5abidJBcnWTd8XJnk/TN8bQAAABaBIw7Xqjo5yWuSXJMkrbX9rbWdSS5Nct2w23VJLhu2L03ywTbl5iQrqur0I319AAAAFoeZHHE9O8m2JH9QVf9QVb9fVScmWd1ae3DY56Ekq4ftM5M8MO3xm4YxAAAAOKSZhOt4kpcneX9r7YeSPJF/Oi04SdJaa0na4TxpVV1ZVRuqasO2bdtmMD0AAAAWgpmE66Ykm1prtwy3r89UyG45eArw8HnrcP/mJGdNe/yaYew7tNaubq2tb62tX7Vq1QymBwAAwEJwxOHaWnsoyQNV9eJh6MIkX0lyQ5LLh7HLk3x02L4hyduHqwtfkGTXtFOKAQAA4CmNz/DxP5fkD6tqWZJ7k7wjUzH84aq6Isn9Sd487PvxJJck2Zhk97AvAAAAPK0ZhWtr7bYk65/irgufYt+W5J0zeT0AAAAWn5n+HVcAAAA4qoQrAAAAXROuAAAAdE24AgAA0DXhCgAAQNeEKwAAAF0TrgAAAHRNuAIAANA14QoAAEDXhCsAAABdE64AAAB0TbgCAADQtfH5ngAAzJV97UCSZCxjGUslSZaU/8N9OpNtlCQZpWWUqe3j53NCACxKwhWAReP6x5+f4+pAVix5IqeO7c7JYweyYmwsJ4wtzXiWiNjBZBtlIpPZPTqQnaNRdo2WZvvohOycPDF729K8bb4nCMCiI1wBWDR+9dp/kdHy5MCJLZOnHshpz3s0563anFedfE/OW/5A1oxP5DljyxZlxB6M1cdG+7NpYjy37Tsrf7drXW7bdmYe3vLcLHlkaZY+Xhnbn7ztv833bAFYbIQrAIvG2j/4ejI+niwdz+jE4zOx8sTcecYP5PMvfFn2vGRvXrnu3vzUaV/Ky5d/K6uXLMvyGl/wATvZRtnXJrJlcn++tO+M/Om2H87N97wwx9+9PCffO8qKb+3LaTsez9gTe5L9B5LJyUS4AjDHhCsAi8bElq1TGzWWGqssWbIkJy9blpUnnpDR81bmvnUvzn962UuzYv22/OzZn8+FJ3wtpy/QgD0YrA9O7s+NT7w41973o9m5YVVO+8dRXnzProxt3ZTRE7vT9u9Pm5zMxKglw/tdAWCuCVcAFo/Whs+TUw02MZG2b19Gjz+eenh7nvP15Tn5Cyuz79PPy/vOvyz/+1Xb8851f5MfP3FjVi9ZnuW1dF6nP1v2tQPZMrkvNz5xTv7n116bib87Jatv3ZtTNz6Q0SM70vbty8Tk5D/9ewHAPBOuANBa2sRE2sRERnv2ZnzrtnzPXSuy//Nn5Lde/dP5v6/7Vt599l/llcdty8ljx2VpLZnvGR+RA20yu0Z78/m9q/Kb974x2z9zes743J4su+frmdyxMxMHJpLR5HxPEwC+i3AFgOlGk2n7JjOxZWuW7NiZtRtXZveX1uQXXnd5Xv3aL+ddq2/Ki5ceyPG17Jg5fXiyjbKn7c/dB8byOw9dnJv/5vuy5lMHsvaOezP5yI5M7N/v6CoAXROuAPBUWps6ZfahLTlux85879dW5+7bvi9veuP35ude8em86bm35/Qlx3d/9PVAm8yDk3ty/aM/mN+99XU5/RNLs+4L38rowS2Z2LdPsAJwTBCuAPB0Wsto796M7t+UFdt35OSvrsm1r78of/7Gl+U/v+hjecXyXXnu2HHdHX2dbKM8OtqbW/atzK9+/U3Z9YnT85JP70zde08mHn/CKcEAHFOEKwA8G6PJTD76aOrOjVnz4IrsufMF+TcXXZHLXvOF/KtTP5cXLl3azcWbdo/25/6Jifz+9lfnz//m/LzgkxM587aNGW1/JKOJifmeHgAcNuEKAIehHdifya3bctzfPp4Xf+P0fPaOH8lfXnJurvr+T+THT7gvp83j6cMH2mQentyTG3evza/dcXFO+suT8uK/3ZK2+aFM7tnjtGAAjlnCFQAOV2sZ7d6dbLwvq7Y9kpVffUF+7cfenD+78Ot591mfzMuW7clJtXzOTh+ebKM83vblH/cfn9964J/na3/9opx10xMZv+urmdz1qNOCATjmCVcAOFKjyUzu3JmxL+7OC795WrbfsTaX//iVedMFt+Ztp/x9Xjieo3r14YNXC753Irlu+6vykZtfkTU3tpy94f5Mbns4k64WDMACIVwBYCYOXn34Ww/lpL/amZd+9Yx8ZsMF+ciF5+Vnf+DzufS5t+V7xivLa+msnUJ8oE1mXzuQ+ydaPvroebnm9lfmlJuOy0tufjjtm9/KxJ69jrICsKAIVwCYDaPJjJ54InXPN7LqoYdz6j+ekf93wYW59tUX5K3nbshPPPe2vHB8b54ztizjWXLYR2En2ygTmcxjo/25d2JZ/uLRH84f3fmKnPS5E7Lull0Zu/e+jB57LM3FlwBYgIQrAMyiNjGRyZ07U7c/kdPvf05GXzgjH/uh1+SDr3hlfvTcjfnJ027LDyz/VlYtGeWEWpKltSRjGctY6jueZ5SWUUY50Cazu01m2+RY7th3Rm54+Lz8/VfOySm3judFX3osY/fdndGuxzI5ccBpwQAsWMIVAGZba1NXH97+SGrXY1l970lZ/Xer8s2XfG9++dyXZv9L9uQHz9qU9Su+mXOOeyjPH9+V59a+LK1RkmRvW5In2rI8NHFKNu59fjbsfEFuf2BNlt11fE79ymReevfO5KFtGT36uGAFYFEQrgBwtBwM2Ed2pHY9mufctzwn33xyJp+3MtvXnJ3rzzwne55f2XfKZNpJkxlbNvW+1NG+JaknlmT59iU5fkvLczZP5pxNT2TJ1i0Z7dyV0b59aZOTghWARUO4AsDR1lraxETaxERGu3entmzNCXcvy4nHH5c67ri045cny5eljU+977UmRsm+/ak9+9L27k3bszdt//5MiFUAFinhCgBzaVrEZs+eqbEaS43903tcW5I2akkbffsxALCYCVcAmC8Hg7RNfrtRAYDvdnT+IjoAAADMEuEKAABA14QrAAAAXROuAAAAdE24AgAA0DXhCgAAQNeEKwAAAF0TrgAAAHRNuAIAANA14QoAAEDXhCsAAABdE64AAAB0TbgCAADQNeEKAABA14QrAAAAXROuAAAAdE24AgAA0DXhCgAAQNeEKwAAAF0TrgAAAHRNuAIAANC1GYdrVS2pqn+oqo8Nt8+uqluqamNV/UlVLRvGlw+3Nw73r53pawMAALDwzcYR159Pcte027+R5L2ttXOS7EhyxTB+RZIdw/h7h/0AAADgac0oXKtqTZKfSPL7w+1K8vok1w+7XJfksmH70uF2hvsvHPYHAACAQ5rpEdffTvIfkoyG26cm2dlamxhub0py5rB9ZpIHkmS4f9ew/3eoqiurakNVbdi2bdsMpwcAAMCx7ojDtar+WZKtrbUvzuJ80lq7urW2vrW2ftWqVbP51AAAAByDxmfw2Fcl+cmquiTJcUmem+R3kqyoqvHhqOqaJJuH/TcnOSvJpqoaT3Jyku0zeH0AAAAWgSM+4tpa+6XW2prW2tokb0nyqdbav0zy6SRvGna7PMlHh+0bhtsZ7v9Ua60d6esDAACwOByNv+P6i0neXVUbM/Ue1muG8WuSnDqMvzvJVUfhtQEAAFhgZnKq8Le11j6T5DPD9r1Jzn+KffYm+ZnZeD0AAAAWj6NxxBUAAABmjXAFAACga8IVAACArglXAAAAuiZcAQAA6JpwBQAAoGvCFQAAgK4JVwAAALomXAEAAOiacAUAAKBrwhUAAICuCVcAAAC6JlwBAADomnAFAACga8IVAACArglXAAAAuiZcAQAA6JpwBQAAoGvCFQAAgK4JVwAAALomXAEAAOiacAUAAKBrwhUAAICuCVcAAAC6JlwBAADomnAFAACga8IVAACArglXAAAAuiZcAQAA6JpwBQAAoGvCFQAAgK4JVwAAALomXAEAAOiacAUAAKBrwhUAAICuCVcAAAC6JlwBAADomnAFAACga8IVAACArglXAAAAuiZcAQAA6JpwBQAAoGvCFQAAgK4JVwAAALomXAEAAOiacAUAAKBrwhUAAICuCVcAAAC6JlwBAADomnAFAACga8IVAACArglXAAAAuiZcAQAA6JpwBQAAoGtHHK5VdVZVfbqqvlJVd1bVzw/jp1TVjVV1z/B55TBeVfW+qtpYVbdX1ctn64sAAABg4ZrJEdeJJL/QWjs3yQVJ3llV5ya5KslNrbV1SW4abifJxUnWDR9XJnn/DF4bAACAReKIw7W19mBr7UvD9mNJ7kpyZpJLk1w37HZdksuG7UuTfLBNuTnJiqo6/UhfHwAAgMVhVt7jWlVrk/xQkluSrG6tPTjc9VCS1cP2mUkemPawTcMYAAAAHNKMw7WqTkryp0n+XWvt0en3tdZaknaYz3dlVW2oqg3btm2b6fQAAAA4xs0oXKtqaaai9Q9ba382DG85eArw8HnrML45yVnTHr5mGPsOrbWrW2vrW2vrV61aNZPpAQAAsADM5KrCleSaJHe11n5r2l03JLl82L48yUenjb99uLrwBUl2TTulGAAAAJ7S+Awe+6okb0tyR1XdNoz9xyS/nuTDVXVFkvuTvHm47+NJLkmyMcnuJO+YwWsDAACwSBxxuLbWPpekDnH3hU+xf0vyziN9PQAAABanWbmqMAAAABwtwhUAAICuCVcAAAC6JlwBAADomnAFAACga8IVAACArglXAAAAuiZcAQAA6JpwBQAAoGvCFQAAgK4JVwAAALomXAEAAOiacAUAAKBrwhUAAICuCVcAAAC6JlwBAADomnAFAACga8IVAACArglXAAAAuiZcAQAA6JpwBQAAoGvCFQAAgK4JVwAAALomXAEAAOiacAUAAKBrwhUAAICuCVcAAAC6JlwBAADomnAFAACga8IVAACArglXAAAAuiZcAQAA6JpwBQAAoGvCFQAAgK4JVwAAALomXAEAAOiacAUAAKBrwhUAAICuCVcAAAC6JlwBAADomnAFAACga8IVAACArglXAAAAuiZcAQAA6JpwBQAAoGvCFQAAgK4JVwAAALomXAEAAOiacAUAAKBrwhUAAICuCVcAAAC6JlwBAADomnAFAACga8IVAACArglXAAAAujbn4VpVF1XV3VW1saqumuvXBwAA4Ngyp+FaVUuS/F6Si5Ocm+StVXXuXM4BAACAY8tcH3E9P8nG1tq9rbX9ST6U5NI5ngMAAADHkLkO1zOTPDDt9qZhDAAAAJ7S+HxP4Mmq6sokVw43H6+qu+dzPgvcaUkenu9JsChZe8wXa28WVNV8T+FYZO0xn6w/5suzWXvf82yeaK7DdXOSs6bdXjOMfVtr7eokV8/lpBarqtrQWls/3/Ng8bH2mC/WHvPF2mM+WX/Ml9lce3N9qvCtSdZV1dlVtSzJW5LcMMdzAAAA4Bgyp0dcW2sTVfWuJJ9MsiTJB1prd87lHAAAADi2zPl7XFtrH0/y8bl+XZ6SU7KZL9Ye88XaY75Ye8wn64/5Mmtrr1prs/VcAAAAMOvm+j2uAAAAcFiE6wJVVT9TVXdW1aiq1j/pvl+qqo1VdXdVvXHa+EXD2Maqumra+NlVdcsw/ifDhbXgGVXVf6mqzVV12/BxybT7DmsdwkxZWxxtVXVfVd0xfL/bMIydUlU3VtU9w+eVw3hV1fuG9Xh7Vb18fmfPsaSqPlBVW6vqy9PGDnutVdXlw/73VNXl8/G1cGw5xNqbk9/3hOvC9eUkP53ks9MHq+rcTF3N+fuSXJTkf1XVkqpakuT3klyc5Nwkbx32TZLfSPLe1to5SXYkuWJuvgQWiPe21s4bPj6eHPE6hCNmbTGHXjd8vzv4n8ZXJbmptbYuyU3D7WRqLa4bPq5M8v45nynHsmsz9fNzusNaa1V1SpL3JPmRJOcnec/B2IWncW2+e+0lc/D7nnBdoFprd7XW7n6Kuy5N8qHW2r7W2jeSbMzUN6vzk2xsrd3bWtuf5ENJLq2pvzL/+iTXD4+/LsllR/0LYKE7rHU4j/Nk4bC2mC+XZupnZ/KdP0MvTfLBNuXmJCuq6vR5mB/HoNbaZ5M88qThw11rb0xyY2vtkdbajiQ35qmDBL7tEGvvUGb19z3huvicmeSBabc3DWOHGj81yc7W2sSTxuHZetdwatIHpv1P7uGuQ5gpa4u50JL8VVV9saquHMZWt9YeHLYfSrJ62LYmmW2Hu9asQWbTUf99T7gew6rqr6vqy0/x4SgCc+YZ1uH7k7woyXlJHkzyP+ZzrgBH2atbay/P1Olv76yq10y/s039KQd/zoGjzlpjjs3J73tz/ndcmT2ttR87godtTnLWtNtrhrEcYnx7pk4pGR+Ouk7fH571Oqyq/5PkY8PNw12HMFNPt+ZgVrTWNg+ft1bVRzJ1OtyWqjq9tfbgcHrm1mF3a5LZdrhrbXOS1z5p/DNzME8WmNbaloPbR/P3PUdcF58bkrylqpZX1dmZeqP+F5LcmmRdTV1BeFmm3kh9w/A/dp9O8qbh8Zcn+eg8zJtj0JPer/VTmbpoWHKY63Au58yCZW1xVFXViVX1nIPbSd6Qqe95N2TqZ2fynT9Db0jy9uGKrxck2TXtNE84Eoe71j6Z5A1VtXI4tfMNwxgclrn6fc8R1wWqqn4qye8mWZXkL6rqttbaG1trd1bVh5N8JclEkne21iaHx7wrU9+wliT5QGvtzuHpfjHJh6rqvyb5hyTXzPGXw7Hrv1fVeZk6Xem+JP86SY5wHcIRa61NWFscZauTfGTqmoYZT/JHrbVPVNWtST5cVVckuT/Jm4f9P57kkkxdrGR3knfM/ZQ5VlXVH2fqaOlpVbUpU1cH/vUcxlprrT1SVb+SqYhIkl9urT3bi+6wSB1i7b12Ln7fq6kDagAAANAnpwoDAADQNeEKAABA14QrAAAAXROuAAAAdE24AgAA0DXhCgAAQNeEKwAAAF0TrgAAAHTt/wO4DKC00SnD+AAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1152x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "Initialize_distributions()\n",
    "plt.scalar_field(dh.gather_array(C.name))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Source Terms"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For the Allen-Cahn LB step, the Allen-Cahn equation needs to be applied as a source term. Here, a simple forcing model is used which is directly applied in the moment space: \n",
    "$$\n",
    "F_i^\\phi (\\boldsymbol{x}, t) = \\Delta t \\frac{\\left[1 - 4 \\left(\\phi - \\phi_0\\right)^2\\right]}{\\xi} w_i \\boldsymbol{c}_i \\cdot \\frac{\\nabla \\phi}{|{\\nabla \\phi}|},\n",
    "$$\n",
    "where $\\phi$ is the phase-field, $\\phi_0$ is the interface location, $\\Delta t$ it the timestep size $\\xi$ is the interface width, $\\boldsymbol{c}_i$ is the discrete direction from stencil_phase and $w_i$ are the weights. Furthermore, the equilibrium needs to be shifted:\n",
    "\n",
    "$$\n",
    "\\bar{h}^{eq}_\\alpha = h^{eq}_\\alpha - \\frac{1}{2} F^\\phi_\\alpha\n",
    "$$\n",
    "\n",
    "The hydrodynamic force is given by:\n",
    "$$\n",
    "F_i (\\boldsymbol{x}, t) = \\Delta t w_i \\frac{\\boldsymbol{c}_i \\boldsymbol{F}}{\\rho c_s^2},\n",
    "$$\n",
    "where $\\rho$ is the interpolated density and $\\boldsymbol{F}$ is the source term which consists of the pressure force \n",
    "$$\n",
    "\\boldsymbol{F}_p = -p^* c_s^2 \\nabla \\rho,\n",
    "$$\n",
    "the surface tension force:\n",
    "$$\n",
    "\\boldsymbol{F}_s = \\mu_\\phi \\nabla \\phi\n",
    "$$\n",
    "and the viscous force term:\n",
    "$$\n",
    "F_{\\mu, i}^{\\mathrm{MRT}} = - \\frac{\\nu}{c_s^2 \\Delta t} \\left[\\sum_{\\beta} c_{\\beta i} c_{\\beta j} \\times \\sum_{\\alpha} \\Omega_{\\beta \\alpha}(g_\\alpha - g_\\alpha^{\\mathrm{eq}})\\right] \\frac{\\partial \\rho}{\\partial x_j}.\n",
    "$$\n",
    "\n",
    "In the above equations $p^*$ is the normalised pressure which can be obtained from the zeroth order moment of the hydrodynamic distribution function $g$. The lattice speed of sound is given with $c_s$ and the chemical potential is $\\mu_\\phi$. Furthermore, the viscosity is $\\nu$ and $\\Omega$ is the moment-based collision operator. Note here that the hydrodynamic equilibrium is also adjusted as shown above for the phase-field distribution functions.\n",
    "\n",
    "\n",
    "For CLBM methods the forcing is applied directly in the central moment space. This is done with the `CentralMomentMultiphaseForceModel`. Furthermore, the GUO force model is applied here to be consistent with [A cascaded phase-field lattice Boltzmann model for the simulation of incompressible, immiscible fluids with high density contrast](http://dx.doi.org/10.1016/j.camwa.2019.08.018). Here we refer to equation D.7 which can be derived for 3D stencils automatically with lbmpy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "force_h = interface_tracking_force(C, stencil_phase, parameters)\n",
    "hydro_force = hydrodynamic_force(C, method_hydro, parameters, body_force)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Definition of the LB update rules"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The update rule for the phase-field LB step is defined as:\n",
    "\n",
    "$$\n",
    "h_i (\\boldsymbol{x} + \\boldsymbol{c}_i \\Delta t, t + \\Delta t) = h_i(\\boldsymbol{x}, t) + \\Omega_{ij}^h(\\bar{h_j}^{eq} - h_j)|_{(\\boldsymbol{x}, t)} + F_i^\\phi(\\boldsymbol{x}, t).\n",
    "$$\n",
    "In our framework the pull scheme is applied as streaming step. Furthermore, the update of the phase-field is directly integrated into the kernel. As a result of this, a second temporary phase-field is needed."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "lbm_optimisation = LBMOptimisation(symbolic_field=h, symbolic_temporary_field=h_tmp)\n",
    "allen_cahn_update_rule = create_lb_update_rule(lbm_config=config_phase,\n",
    "                                               lbm_optimisation=lbm_optimisation)\n",
    "\n",
    "allen_cahn_update_rule = add_interface_tracking_force(allen_cahn_update_rule, force_h)\n",
    "\n",
    "cfg = ps.CreateKernelConfig(target=dh.default_target)\n",
    "cfg.cpu.openmp.enable = True\n",
    "\n",
    "ast_kernel = ps.create_kernel(allen_cahn_update_rule, config=cfg)\n",
    "kernel_allen_cahn_lb = ast_kernel.compile()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The update rule for the hydrodynmaic LB step is defined as:\n",
    "\n",
    "$$\n",
    "g_i (\\boldsymbol{x} + \\boldsymbol{c}_i \\Delta t, t + \\Delta t) = g_i(\\boldsymbol{x}, t) + \\Omega_{ij}^g(\\bar{g_j}^{eq} - g_j)|_{(\\boldsymbol{x}, t)} + F_i(\\boldsymbol{x}, t).\n",
    "$$\n",
    "\n",
    "Here, the push scheme is applied which is easier due to the data access required for the viscous force term. Furthermore, the velocity update is directly done in the kernel."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "force_Assignments = hydrodynamic_force_assignments(u, C, method_hydro, parameters, body_force)\n",
    "\n",
    "lbm_optimisation = LBMOptimisation(symbolic_field=g, symbolic_temporary_field=g_tmp)\n",
    "hydro_lb_update_rule = create_lb_update_rule(lbm_config=config_hydro,\n",
    "                                             lbm_optimisation=lbm_optimisation)\n",
    "\n",
    "hydro_lb_update_rule = add_hydrodynamic_force(hydro_lb_update_rule, force_Assignments, C, g, parameters,\n",
    "                                              config_hydro)\n",
    "\n",
    "ast_kernel = ps.create_kernel(hydro_lb_update_rule, config=cfg)\n",
    "kernel_hydro_lb = ast_kernel.compile()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Boundary Conditions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As a last step suitable boundary conditions are applied"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# periodic Boundarys for g, h and C\n",
    "periodic_BC_C = dh.synchronization_function(C.name, target=dh.default_target, optimization = {\"openmp\": True})\n",
    "\n",
    "periodic_BC_g = LBMPeriodicityHandling(stencil=stencil_hydro, data_handling=dh, pdf_field_name=g.name,\n",
    "                                       streaming_pattern=config_hydro.streaming_pattern)\n",
    "periodic_BC_h = LBMPeriodicityHandling(stencil=stencil_phase, data_handling=dh, pdf_field_name=h.name,\n",
    "                                       streaming_pattern=config_phase.streaming_pattern)\n",
    "\n",
    "# No slip boundary for the phasefield lbm\n",
    "bh_allen_cahn = LatticeBoltzmannBoundaryHandling(method_phase, dh, 'h',\n",
    "                                                 target=dh.default_target, name='boundary_handling_h',\n",
    "                                                 streaming_pattern=config_phase.streaming_pattern)\n",
    "\n",
    "# No slip boundary for the velocityfield lbm\n",
    "bh_hydro = LatticeBoltzmannBoundaryHandling(method_hydro, dh, 'g' ,\n",
    "                                            target=dh.default_target, name='boundary_handling_g',\n",
    "                                            streaming_pattern=config_hydro.streaming_pattern)\n",
    "\n",
    "contact_angle = BoundaryHandling(dh, C.name, stencil_hydro, target=dh.default_target)\n",
    "contact = ContactAngle(90, parameters.interface_thickness)\n",
    "\n",
    "wall = NoSlip()\n",
    "if dimensions == 2:\n",
    "    bh_allen_cahn.set_boundary(wall, make_slice[:, 0])\n",
    "    bh_allen_cahn.set_boundary(wall, make_slice[:, -1])\n",
    "\n",
    "    bh_hydro.set_boundary(wall, make_slice[:, 0])\n",
    "    bh_hydro.set_boundary(wall, make_slice[:, -1])\n",
    "    \n",
    "    contact_angle.set_boundary(contact, make_slice[:, 0])\n",
    "    contact_angle.set_boundary(contact, make_slice[:, -1])\n",
    "else:\n",
    "    bh_allen_cahn.set_boundary(wall, make_slice[:, 0, :])\n",
    "    bh_allen_cahn.set_boundary(wall, make_slice[:, -1, :])\n",
    "\n",
    "    bh_hydro.set_boundary(wall, make_slice[:, 0, :])\n",
    "    bh_hydro.set_boundary(wall, make_slice[:, -1, :])\n",
    "    \n",
    "    contact_angle.set_boundary(contact, make_slice[:, 0, :])\n",
    "    contact_angle.set_boundary(contact, make_slice[:, -1, :])\n",
    "\n",
    "\n",
    "bh_allen_cahn.prepare()\n",
    "bh_hydro.prepare()\n",
    "contact_angle.prepare()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Full timestep"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# definition of the timestep for the immiscible fluids model\n",
    "def timeloop():\n",
    "    # Solve the interface tracking LB step with boundary conditions\n",
    "    periodic_BC_h()\n",
    "    bh_allen_cahn()    \n",
    "    dh.run_kernel(kernel_allen_cahn_lb, **parameters.symbolic_to_numeric_map)\n",
    "    # Solve the hydro LB step with boundary conditions\n",
    "    periodic_BC_g()\n",
    "    bh_hydro()\n",
    "    dh.run_kernel(kernel_hydro_lb, **parameters.symbolic_to_numeric_map)\n",
    "    \n",
    "    dh.swap(\"C\", \"C_tmp\")\n",
    "    # apply the three phase-phase contact angle\n",
    "    contact_angle()\n",
    "    # periodic BC of the phase-field\n",
    "    periodic_BC_C()\n",
    "    \n",
    "    # field swaps\n",
    "    dh.swap(\"h\", \"h_tmp\")\n",
    "    dh.swap(\"g\", \"g_tmp\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<video controls width=\"80%\">\n",
       " <source src=\"data:video/x-m4v;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAAlfFtZGF0AAACZAYF//9g3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE1NyAtIEguMjY0L01QRUctNCBBVkMgY29kZWMgLSBDb3B5bGVmdCAyMDAzLTIwMTggLSBodHRwOi8vd3d3LnZpZGVvbGFuLm9yZy94MjY0Lmh0bWwgLSBvcHRpb25zOiBjYWJhYz0wIHJlZj0zIGRlYmxvY2s9MTowOjAgYW5hbHlzZT0weDE6MHgxMTEgbWU9aGV4IHN1Ym1lPTcgcHN5PTEgcHN5X3JkPTEuMDA6MC4wMCBtaXhlZF9yZWY9MSBtZV9yYW5nZT0xNiBjaHJvbWFfbWU9MSB0cmVsbGlzPTEgOHg4ZGN0PTAgY3FtPTAgZGVhZHpvbmU9MjEsMTEgZmFzdF9wc2tpcD0xIGNocm9tYV9xcF9vZmZzZXQ9LTIgdGhyZWFkcz0xMiBsb29rYWhlYWRfdGhyZWFkcz0yIHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFjZWQ9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTAgd2VpZ2h0cD0wIGtleWludD0yNTAga2V5aW50X21pbj0yNSBzY2VuZWN1dD00MCBpbnRyYV9yZWZyZXNoPTAgcmNfbG9va2FoZWFkPTQwIHJjPWNyZiBtYnRyZWU9MSBjcmY9MjMuMCBxY29tcD0wLjYwIHFwbWluPTAgcXBtYXg9NjkgcXBzdGVwPTQgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAAEIFliIQL8mKAAKnEnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJ1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111/40ABES2HsABujEoiE1yzxmF6WQZBLJeUx3fPwEbISKUvYzFKxgAEBwx+W8SEJWzMrUn+5tuCXCrcQ0lx6veCJzvg6bdxhzSeghlAVIp7Lgba/xIMz/4hQAE3k0dbzCKIwh5YL+bteM+YGHcMq9/2a4tRBlFokGJ9Pm7XEcZCYhhF8B4EdBT3lGiqAjZCRSl7GYpW48wdiGrhTZ0//+tRBlFaS8sFPG7XgX3J33OFNYPrDgZO/DHWnjsZR28ABujEoiE1yzxmFww/H/+LPgAMkQkH7ni9NkSI6NWXk+S7qu+++++++++++++++++++++++/x/DDw34A3XQRXLv8IAAmAQGB0IjOGABx6CRz0hjjICAJLIACCirmBHX554B0hIdza2tra+P/DwWcB1jDS2EAQHH6CRNwaAgCS/iAHe+++++++++++++++++++++++/x9/hwp4ACbMz9jABgysYunYyp1DNddddddddddddd4bw11igDfffffffffffffffffffffffTzdH0tLS09YoA3333333333333333333333311111111111111111111111111111111111111111109PXXXT11111111111111111111111111111111111111111111111111111111111111111109PXXXT111111111111111111111111111111111111111/8bUvGMDmA4ABQAoKIy3AAsxKW3nKWV56Xd6AOWUNKVCmhTF8JSCfealH/yN+glD3jnIeBp59czgCOk14EK+NqayMNnGS41xrj1e/hBoJZ4vgAIaEF+t1CP7l7wJDTIAShwer61EgNjASk//ACSlE634lPeIfotYSB715r0MQQer3EJDZogy19/O/+8zIbOMhOc0S9hnTMfcp1YnHLVgJLdQ7XXXXXXXXXXXXXXXXXXXXXXXT09dddPXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXfeGuuuuuuuuuuuuuuuuuuuuuuuuunp6666euuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuunp6666euuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuunp6666euuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuv/jalWGMDmA4ABQAoKIy3AAfEp88UZS+9Lv/vkajIxeVF8uBjU8w3BX84b833AJD4+vTjqFUhY614DgtfRrPc+gR9NayMNlGS41hrj1e/hDBLPF8ABDQgv1uoR/cveBLzMhs6kKiC8lnOARkmAT9U4bU3hKUTrfiQle7D5W7gCOg15BBBtTALCQ2SMMtffzv/vMyGzjITnNEvYZ4zx9ynVm45bOBJdQ7XXXXXXXXXXXXXXXXXXXXXXXT09dddPXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXfeGuuuuuuuuuuuuuuuuuuuuuuuuvh/+CsOhzgCDDHkgouS5IssCvlgofIEkngAYyrMfQmd3sHOITj/MCRcs9CmCr8f/P7BaEduV/9bw6aja///4LglwAjGszCRxICPACJ3yvX7gBjq20k++H3H2C0VmSYZp78EGGoQCUhAiTeIAbECH3c/oggr56h2uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuv8Fh/oNBqWT/6Ie4gABEBIEgAgQhIdzw6Q7mQkdyEd08DpHc+q1Sp+qxjiNwErrH4DLxYyJ+0Jo4QABbjhgHGBgBcn0CKDqnYFLZdAbDq68MzffJ8JRz5xW4BancsXm3CLann/VV6hDsl6TYUeyEFBwMwIgBKCgfP4bIcmUB0TccB4wuVx8nOYqN46fgr5//B7vQd4h4NDsgCgmCQ8yOhILZ/hAAQK8R8B1JLGr/AaxCkpQLa1/YHtwrfOB3Ehgo0n5O77wlyDcBCOpjAEM2BMLzHEPgwPGYCYevFD4PFueEAAXCFuDAFyQAkbVgmKL26cp+DK8+4UAEy8AEyASEdkZz27KVh99i/d+d8v/8FZefDACSwiAhsD+fvphuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuunnWjjC6N/k3/19hr/7j//oFRV/c1/taeuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuv/jaJCoxgawAXEGw70ONAhQRPV4CSXsIkXRi9ncLXoADHDpHpEV5tYegzkc1IU8PhAnpgAAqMhzwN8OKgFqD6jZbSFIZ3/tDXMKkVRi2GMMXuI4QiCORRfBBKHt7jHoAjJE9XgBJCife4hP/y8490xwAAqMgol7XIOqw0DU55j0gTnx6veGpRfrMSn+5WcCSeyAMFWXPe/ACRF7iD81parCGmexpKlVA11DtdddddddddddddddddddddddPT11109ddddddddddddddddddddddddddddddddddddddd9/rrrrrrrrrrrrrrrrrrrrrrrrrp6euuunrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrp6euuunrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrp6euuunrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr/xx2CFh7gAphpxEPJYU89XsAUgzP3xCurPiYCxcEwtrsl7H+734AKwS4VDyGlPPV7QBXG+oOWVzqCP+coAZRspDRyP+4e/9aiDMLRLiGkG7TgEZZTnkvNqbmOHEEkMXwJL0Pb6QUugqJf37/EF+5iF6Ir8hBAABAdAAEABixoAsI0p6QXnx6vakQAST2gGHW+e9+AFBfuYBU3XacxB+41UpKA11D9dddddddddddddddddddddddPT11109ddddddddddddddddddddddddddddddddddddddd9/rrrrrrrrrrrrrrrrrrrrrrrrrp6euuunrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrp6euuunrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrp6euuunrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr++cAQQsNhzAATIhu6EIji+hH5dAAxKm7cTl/YCxGjU1/1/8GflMEAAECMAAQBmAAeNRiVvLl8pAABQAAQBXsgbAAQiL3EH5rS12PYXAB83mZj9qr7w4fwDAOCAtkQaIOkkt5pJ6vf3ffff/44CPCuAAmRDK6CMxJK2MX8jMRGUVtoIQ1qiAABAVADCGuDu++++++++//xwEYQrgAJkQyugjMSStjE/IzERlFbaCENaggAAQFQAwhrg999999999/D8WgADh3AAQJysISF0+/Wzm7OfDQQlNbrFJ5DdUHBYPJgeWB0h3MIvW2IkKWB0h3MIvW2YiltbW1tfw48Q4LoDgA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9L8+XxPr19K/4ZFn/jQp7/gRuoEjmgEgJ9u/D649jgQvpqvmfwI9RqsPOeoJPm+p+H5fL4Ef4Ej4Ej4BRIAAAABvQZqAJ8AQ5wQfBF8OYhYEX4Ej4En4EYn1010Ggw96wP+d/+wzeK72o5wqOij+LYXpVOv4aC3EDSsdIlR/DcN5eP6o9QzffP/4ETquv0LeBHuIgSL0OeBIXEaugEfuE1SnznqGHZ/8CPXAkfAkfAKJAAAAY0GaoCfAEOcEGIX4c+CSBH+BI+BI/PLAieGg5nx4o6VVXOHQeiPe9EvfFw3Mjqdd9Kg1/95cPmBEqTrXoEjkLy/XdBLu97gR+qrgRvKab/i4DXXwmQr3gSGn5yQzNdP9RsAQ3AAAAE5BmsAnwBDnDFcR8RAj/AkfAj+qVfVKp3gROgRBjm+Wt7Ld+dh3P79eqOHF8Dsn18CL13N3aG54EXCOBJ5kEOgEh96HKwBHuE0Qpd8AQ3AAAABdQZrgK8AQ5z/H9wp1wIvwJHwJHKiJUBI2ZBjC9f3lx8CJ0crMQif/mLefPwSbu7PwyLe+NDHc/8CMvmYy9/JAj/8kCP8BI8VAkL4VPUbuf8CPcJnMUvyB6W98AQ3AAAAAZkGbACfAEOcGOIXELiFgRDvAk/Akf+qVARn0gZHDClqHWff+oMj8KLjbecZMFZEYQ8f3sv6+CLe7D4Zu4+uohI/wIqwzretLl9Ia8CNzdzGGPeBH8pL3AkXwGwvhOBIaf96nKAIbgAAAAFxBmyAnwBDh3z+IXPwIvsIKu6gJeBEO8CUdBGBG9BjXuG83198MIYJ6hvicK4LcnjjT1Ggw+qPUGOz/8CJ1S+v0NaAj+IgEf4kEQ4/t2fifKxe4EdVxqM/cJwBDcAAAE/BliIIDvJigAC8FJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJydddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddf+NAAREgsPYACZkMjhmNxBI8tx+iMQrCtEqsJO75+AMZiIzit1BCltUYAAWADgYblvBIYNn3Mvc9KFH2ZAToHeYITZUPV7wEJpKaE9qppx5NnEEDFD+ljXSwba/wkFITe4xoAq+O0eszGI0ooQqyN6m7Xg3sUOLUMXNKqfuhZEIVpZYkIcuszdriOMhMQwi+A8AIKwQqqwaKoAxmIjOK3UEKW1XDxhZrnWs8fGpP/+siEK0ssSqyNKDdrwCVFE1Oa88ekdvDgGJabOCK9wSwpR7eAAmZDI4ZjcQSPLcfDD8f/4TPgAJEQiMDsYeH+LiLE5BG3fd3+pIkzccr7777777777777777777777/H8P40fwBiFtICH7X0/jwgADoAMAUAiEEUkYADh/Ccsm2OOEIDAAaWQAASAcOuYAldKbwuB6QIi3NoIO1tbXx/4Bw4EcB0bgNLc8IAAkAHBaQSCNwOgMABpfweB7299999999999999999999999/j7/Dh/wAEzGUvqnAAEAgDLzqdH1DNddddddddddddd4bw16666666666666666666666666YInUEddddPT1111111111111111111111111111111111111111111111111111111111111111109ddddPT1111111111111111111111111111111111111111111111111111111111111111109ddddPT11111111111111111111111111111111111111/8bUCIRgcwHAAOAA4Cj8twALGEwktRRBIrZHa3egDirQrcVD3Q0h/gnGKXfe9y0qd6KBOB74w5hoAsKPrmcAAQd41cLe7G1NZDFRpjzhajqx6vfw2ggNi+AAg2GLXX+5y0Kb6gwYgAHEeAuWrXHgAucgxV/+AETjlKs3nvYkKO2JWCYD3po1fi3lD1e8gRBsRSDCSYUth3mNimKCOfyiws94nwx06nFelStNFocGOw/TP8s9/1DtdddddddddddddddddddddddPXXXXT09dddddddddddddddddddddddddddddddddddddd94a6666666666666666666666666eoUDTLCcNMslTWsNMsnphWuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuZgkL3tAhrrtZmCA/eoJa66666666666666666666666666666666666666666666666666666666666666666euuuunrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr/42pVhjA5gOAAcABwFH5bgAJgij4mkmEEypazvkNMUjmWVCrvgMEo8U7Yov3xVRvuASA1BUnt4zA60MD6TwB4Pi8GobUXoNa+pLIYqPMecLUdUPV7+EMEsEXwAEGwxa6/3OWhTfUH5jYpiuM/GFqe5TgAEGeMC+/pQbU3gnHKVZvPBpXJI6L2uAAIO4aus8sbUwAwIg2IpBhJMKWw7zGxTFBHP5RYWc8T4Y6dTivSpWmi/cGO/+We/6h2uuuuuuuuuuuuuuuuuuuuuuvhgoL49DQ5AB2aFxfYpq7UqA2QGE1E9D6TPEflqYbTIB7OvwgACwB4gIhinAA+EqCxbtbhwzIiqAAXj34IRFueABlpz+lsgKhGpCQ7n1P1wOaR/IJ8rBF/jCaaIB7d/4VboF+m6BAAEyMChCFBQOnmFZA7D3Z4DK1kcybLK0Dq5AWBZD7gC0nOJglm3hlV4u7fOA1XlCLrkf7jML0YoUtOvT/+8iuQ0EAtgA3pWBuBHC9yMgUW6gD3gkC7gCETRbY9kxB+/hAAQABAVAkBIIADKPABdGbXgEMGorwAH50YEE2YkJKnBwA2Dy+QSFewAHqsOXzDRH39v33+9sxdw//BXAFaMZsV+JzDVZrqFmlggAIDDvBAOhw5IvAwAH0ef86JIAuMz4dMO1111111111111111111111111111111111111133hrrrrrrrrrrrrrrrrrrrrrrrrrp/zSn00CwNYZLXLG3N14RMXCI2cMELsgbHCW0gP+DY1b76KN/2/T/oHsN/hHXjAkmRsCp7zPLMDCM8IAAmHOOCJBlAu16ORoyPBUVtrMDesCh/7wdvLZZGc8dAadpx71z/2t9mw5gKqX2gSixoGXesAkFoSx5epLsMRhwqhE/AmEAAYAoGigFABFgAGo7huEMLH3/oOYVhkLzgAHXv0ALETKvswn7ToAMG6V1liP5f4KxbRUMd/t4cIAA8AwUUCAALBBCWff//z/eH68z8w1c6lKGHT0wjXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTzLHNpT6U+w2HGs2G0eJWjYeRxkeDRNIN487pJjNQG+kNY8EC4McjiRgOLLPeIFAQBYvc94sCPGoazHAAPhmP5f+whKpZBDh7zrBIOn6+O0Ckxpakb9hBcHO2VTzMCz0qwF+ATPQOFiixbXIcAAuB/uGh2MpT09dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddPT///sNgiuVaFUh86qRTQFkm6PtCAPsJBm/MLBPm/P//78cNKYKL73+tpFbTF9PfwWFCRi7jcAOlZpiKK4FdxH8HmK4xK4mCOnp66666666666666666666666666666666666666/+NokKjGBzABcIVBprjhYS8Jz1eAUT8waXhtiWdE/EqAAkPH4i5ZyUxmTD8BjshcESxpME4UBLAAB0GcceALWHFXFIDVw3aWIQ4hr/2g3xg7wyxLGi3iV7iOEIgkhi/YJwPZpgxfgSvXnq8AImHKXe8560qbyBldwAA6DOCF1/rIOqwbAajDRi/Qnfser3g3HLXWc960KZygNojZiBxqLMde/ACIb7WUDf3trJJTxPsaSkSSgY7/5den/UO1111111111111111111111109P//+w2CKH3VSKZJGkkVAskpFcw1FHPmquYcuuf//3yt0t6+mvQcvg997O4DEcUrdzDUUc+ZLuEm4S7hSVxMEdPT1111111111111111111111111111111111111133+uuuuuuuuuuuuuuuuuuuuuuuuunp///3BBFr6Zc119OTNLe9TX0wcijYg1rYew4KPcZDuF258v/sN4LTQmhZyKWpU1AWBbQa1sPY9WGs/FWb9j0wQ09PXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXT0///7hyDk/HaC60zZXTt8doRrYd56YEiEIgQtgDa8g8IYIhJRD4AdKxpjUaMPBxEe4QIZbn//2G8H01IzNNTBZyH3UB0iNJvZ571QC5Ws0oi7fnkAAibc0w7T09dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddPTwsw8EjtNmJwX3M9hrvhzZwe2F3CzgJd2vO9sJYfLC34mr4WVz8KmH6enrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr/xx2CFh7gAuMDZQzDRKTCp6vYAkgpCbTjGp9DcRgCQWhFmU1LRRSf7vfgAvICdA7DRCbCp6vcAAqgTcke7FzSlD3/uIgAMUzsYWHMqp6Nf+siEK4vBKjCahu04AEEaIUVZVNqbiOHEEUii+CCUC2WUIV4NWqz1e4vCE20kMbvK9OuQIAAIG4AAgMMWGgEoosQr0bt0PV7fAASI2yADA7z5R78AJCbaSA/daYu8lx/saqikoGO/+D/1D9dddddddddddddddddddddddPT8P4ZrxwJuHHieD0z7NlIBVS6NlhBd2ARgDIkKykMhTqgThUS40A6YdyAbMdcdXf/yJy9hvMxAoWNIxJ9+n+EAARCkEC5w9a9v9ZTYM6lCZ76KGDQvVKn+9ME9PT1111111111111111111111111111111111111133+uuuuuuuuuuuuuuuuuuuuuuuuunp77Wunp666666666666666666666666666666666666666666666666666666666666666666enrrrp6euuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuunp6666enrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr++cBSFhsOYACYmKcrDO5Za3OXjygABABDZf6QL9f2AqE6FTKn/sn/wYNlgACCCAAIEjAACQ0zkcyys66kAAHAABAfEsgQwAEEN9rKBv721kkp4mAD417lc63uVfw4fwDAOCAuEIVHHvPGxVfVebv77774/AAQ3Yfuz3uc7XPf/wAHYRDjrQUUh57SivCDKYZSSyxh1byYwHDvvvvvvvvvj8ABDdh+5Hvc5yXPf/wAHYRDjrQUUh57SivCDKYZSSyxh1byYwHDvvvvvvvvv4fi0ADh0kABAinIIWCaIk62IdwQ+DYYtdf7nLQp/qBqHDUTB5MDoi3MBl91mESClgdIdzCL1tiJCltbW1tfw48Q4LoDgACA2ADDEJb4CICDgeQUvwPIUvb333/+OHCFSwAEDKGPdnJLKcppSX/AiBzn6lBRZK3FocHB777777777//HD4IMABEEUw6kFlJec8ot/xhkOMtJRaHHuLKY++++++++/+GOHGFcABEEUw6kFlJec8gt/xhkOMtJRaHHuLKYGAB4ygINdccbfezmPfg/UM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\" type=\"video/mp4\">\n",
       " Your browser does not support the video tag.\n",
       "</video>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Initialize_distributions()\n",
    "\n",
    "frames = 300\n",
    "steps_per_frame = (timesteps//frames) + 1\n",
    "\n",
    "if 'is_test_run' not in globals():\n",
    "    def run():\n",
    "        for i in range(steps_per_frame):\n",
    "            timeloop()\n",
    "            \n",
    "        if gpu:\n",
    "            dh.to_cpu(\"C\")\n",
    "        return dh.gather_array(C.name)\n",
    "\n",
    "    animation = plt.scalar_field_animation(run, frames=frames, rescale=True)\n",
    "    set_display_mode('video')\n",
    "    res = display_animation(animation)\n",
    "else:\n",
    "    timeloop()\n",
    "    res = None\n",
    "res"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that the video is played for 10 seconds while the simulation time is only 2 seconds!"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv (3.12.12.final.0)",
   "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.12.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
