{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Poiseuille Channel (regularized)\n", "\n", "The simulation of a periodic Poiseuille flow is used for the validation of regularized no-slip boundary condition, which works directly with macroscopic variables and is necessary for increasing numerical stability and use of moment based lattice-Boltzmann method.\n", "The external force density term still represents the pressure gradient $F_{x}=-\\mathrm{d}p/\\mathrm{d}x$, regularized no-slip BC is implemented at $y=0$ and $y=H$, and periodicity is considered in the remaining boundaries." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from nassu.cfg.model import ConfigScheme\n", "\n", "filename = \"tests/validation/cases/02_poiseuille_channel_flow.nassu.yaml\"\n", "\n", "sim_cfgs = ConfigScheme.sim_cfgs_from_file_dct(filename)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "The only change from the periodic case, is that it's now using regularized halfway bounce back (HWBB) as BC for the wall, instead of plain HWBB." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['regularizedPeriodicPoiseuilleChannel:000',\n", " 'regularizedPeriodicPoiseuilleChannel:001',\n", " 'regularizedPeriodicPoiseuilleChannel:002',\n", " 'regularizedPeriodicPoiseuilleChannel:003']" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sim_cfgs_use = [\n", " sim_cfg\n", " for (name, _), sim_cfg in sim_cfgs.items()\n", " if name == \"regularizedPeriodicPoiseuilleChannel\"\n", "]\n", "\n", "[sim_cfg.full_name for sim_cfg in sim_cfgs_use]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Extract data from multiblock data from output file of macrs export" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict_keys([(0, 'regularizedPeriodicPoiseuilleChannel'), (1, 'regularizedPeriodicPoiseuilleChannel'), (2, 'regularizedPeriodicPoiseuilleChannel'), (3, 'regularizedPeriodicPoiseuilleChannel')])" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "from vtk.util.numpy_support import vtk_to_numpy\n", "from tests.validation.notebooks import common\n", "\n", "extracted_data = {}\n", "array_to_extract = \"ux\"\n", "\n", "for sim_cfg in sim_cfgs_use:\n", " export_instantaneous_cfg = sim_cfg.output.instantaneous\n", " macr_export = export_instantaneous_cfg[\"default\"]\n", " time_step = macr_export.time_steps(sim_cfg.n_steps)[-1]\n", " reader = macr_export.read_vtm_export(time_step)\n", "\n", " p1 = [sim_cfg.domain.domain_size.x / 2, 0, 0]\n", " p2 = [sim_cfg.domain.domain_size.x / 2, sim_cfg.domain.domain_size.y, 0]\n", " line = common.create_line(p1, p2, sim_cfg.domain.domain_size.y - 1)\n", "\n", " # Get the points from the vtkLineSource\n", " polyData = line.GetOutput()\n", " points = polyData.GetPoints()\n", "\n", " pos = np.linspace(p1, p2, sim_cfg.domain.domain_size.y)\n", "\n", " probe_filter = common.probe_over_line(line, reader.GetOutput())\n", "\n", " probed_data = vtk_to_numpy(probe_filter.GetOutput().GetPointData().GetArray(array_to_extract))\n", " extracted_data[(sim_cfg.sim_id, sim_cfg.name)] = {\n", " \"pos\": np.array(pos),\n", " \"data\": probed_data,\n", " }\n", "\n", "extracted_data.keys()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Results\n", "\n", "The velocity profile at the end of simulation is compared with the steady state analytical solution below:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Processing functions for Poiseuille Flow case" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from typing import Callable\n", "\n", "\n", "def get_poiseuille_analytical_func() -> Callable:\n", " \"\"\"Poiseuille analytical velocity function\n", "\n", " Returns:\n", " Callable: Analytical velocity function\n", " \"\"\"\n", " return lambda pos: 6 * (pos - pos**2)\n", "\n", "\n", "def plot_analytical_poiseuille_vels(ax):\n", " x = np.arange(0, 1.01, 0.01)\n", " analytical_func = get_poiseuille_analytical_func()\n", " analytical_data = analytical_func(x)\n", " ax.plot(x, analytical_data, \"--k\", label=\"Analytical\")" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "fig, ax = plt.subplots()\n", "fig.set_size_inches(6, 5)\n", "\n", "style_num = [\"o\", \"^\", \"s\", \"+\", \"x\"]\n", "\n", "for sim_cfg, mkr_style in zip(sim_cfgs_use, style_num):\n", " num_data = extracted_data[(sim_cfg.sim_id, sim_cfg.name)]\n", " num_avg_vel = np.average(num_data[\"data\"])\n", " position_vector = (num_data[\"pos\"][:, 1]) / (sim_cfg.domain.domain_size.y)\n", " ax.plot(\n", " position_vector,\n", " num_data[\"data\"] / num_avg_vel,\n", " mkr_style,\n", " label=f\"N={sim_cfg.domain.domain_size.x} (avg. {num_avg_vel:.2e})\",\n", " fillstyle=\"none\",\n", " c=\"k\",\n", " )\n", "\n", "sim_cfg_ref = sim_cfgs_use[0]\n", "plot_analytical_poiseuille_vels(ax)\n", "ax.set_title(\n", " f\"Poiseuille (Periodic Regularized)\\n({sim_cfg_ref.models.LBM.vel_set} {sim_cfg_ref.models.LBM.coll_oper})\"\n", ")\n", "ax.legend()\n", "plt.show(fig)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "The results show that the flow evolution equation from LBM converges to steady analytical solution.\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "The second order error decay under grid refinement for the present case is also verified:\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots()\n", "fig.set_size_inches(6, 5)\n", "\n", "analytical_error_prof: list[float] = []\n", "numerical_error_prof: list[float] = []\n", "N_list: list[int] = []\n", "\n", "analytical_func = get_poiseuille_analytical_func()\n", "\n", "for sim_cfg in sim_cfgs_use:\n", " num_data = extracted_data[(sim_cfg.sim_id, sim_cfg.name)]\n", " num_avg_vel = np.average(num_data[\"data\"])\n", " num_pos = num_data[\"pos\"][:, 1] / sim_cfg.domain.domain_size.y\n", " num_profile = num_data[\"data\"] / num_avg_vel\n", "\n", " num_o2_error = common.get_o2_error(num_pos, num_profile, analytical_func)\n", " analyical_error = (\n", " num_o2_error if len(analytical_error_prof) == 0 else analytical_error_prof[-1] / 4\n", " )\n", "\n", " analytical_error_prof.append(analyical_error)\n", " numerical_error_prof.append(num_o2_error)\n", " N_list.append(sim_cfg.domain.domain_size.y)\n", "\n", "ax.plot(N_list, numerical_error_prof, \"sk\", fillstyle=\"none\", label=\"Numerical\")\n", "ax.plot(N_list, analytical_error_prof, \"--k\", label=r\"$O(\\Delta x^2)$\")\n", "\n", "ax.set_yscale(\"log\")\n", "ax.set_xscale(\"log\", base=2)\n", "ax.set_title(\n", " r\"Poiseuille $O(\\Delta x^2)$ (Periodic)\"\n", " + f\"\\n({sim_cfg.models.LBM.vel_set} {sim_cfg.models.LBM.coll_oper})\"\n", ")\n", "ax.legend()\n", "plt.show(fig)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "It's possible to check that the second order error does not stands for regularized HWBB." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Version" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Version: 1.6.33\n", "Commit hash: fbc0edb5260d2734f0a290e1806c26ac6d865ff4\n" ] } ], "source": [ "sim_info = sim_cfg.output.read_info()\n", "\n", "nassu_commit = sim_info[\"commit\"]\n", "nassu_version = sim_info[\"version\"]\n", "print(\"Version:\", nassu_version)\n", "print(\"Commit hash:\", nassu_commit)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Configuration" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
simulations:\n",
       "  - name: periodicPoiseuilleChannel\n",
       "    save_path: ./tests/validation/results/02_poiseuille_channel_flow/periodic\n",
       "\n",
       "    n_steps: !unroll [250, 1000, 4000, 16000]\n",
       "\n",
       "    report:\n",
       "      frequency: 1000\n",
       "\n",
       "    domain:\n",
       "      domain_size:\n",
       "        x: !unroll [4, 8, 16, 32]\n",
       "        y: !unroll [4, 8, 16, 32]\n",
       "      block_size: !unroll [4, 8, 8, 8]\n",
       "\n",
       "    data:\n",
       "      divergence: { frequency: 50 }\n",
       "      instantaneous:\n",
       "        default: { interval: { frequency: 0 }, macrs: [rho, u] }\n",
       "      statistics:\n",
       "        interval: { frequency: 0 }\n",
       "\n",
       "    models:\n",
       "      precision:\n",
       "        default: single\n",
       "\n",
       "      LBM:\n",
       "        tau: 0.9\n",
       "        vel_set: D2Q9\n",
       "        coll_oper: RRBGK\n",
       "        F:\n",
       "          # FX is divided by 8\n",
       "          x: !unroll [4.0e-4, 5.0e-5, 6.25e-6, 7.8125e-07]\n",
       "          y: 0\n",
       "\n",
       "      multiblock:\n",
       "        overlap_F2C: 1\n",
       "\n",
       "      engine:\n",
       "        name: CUDA\n",
       "\n",
       "      BC:\n",
       "        periodic_dims: [true, false]\n",
       "        BC_map:\n",
       "          - pos: N\n",
       "            BC: HWBB\n",
       "            wall_normal: N\n",
       "\n",
       "          - pos: S\n",
       "            BC: HWBB\n",
       "            wall_normal: S\n",
       "\n",
       "  - name: regularizedPeriodicPoiseuilleChannel\n",
       "    parent: periodicPoiseuilleChannel\n",
       "\n",
       "    models:\n",
       "      LBM:\n",
       "        coll_oper: RRBGK\n",
       "\n",
       "      BC:\n",
       "        periodic_dims: [true, false]\n",
       "        BC_map:\n",
       "          - pos: N\n",
       "            BC: RegularizedHWBB\n",
       "            wall_normal: N\n",
       "\n",
       "          - pos: S\n",
       "            BC: RegularizedHWBB\n",
       "            wall_normal: S\n",
       "\n",
       "  - name: velocityNeumannPoiseuilleChannel\n",
       "    parent: periodicPoiseuilleChannel\n",
       "\n",
       "    save_path: ./tests/validation/results/02_poiseuille_channel_flow/velocity_neumann\n",
       "\n",
       "    report: { frequency: 1000 }\n",
       "\n",
       "    n_steps: 64000\n",
       "    domain:\n",
       "      domain_size:\n",
       "        x: 256\n",
       "        y: 32\n",
       "      block_size: 8\n",
       "\n",
       "    data:\n",
       "      instantaneous:\n",
       "        default: { interval: { frequency: 16000 }, macrs: [rho, u] }\n",
       "\n",
       "    models:\n",
       "      LBM: !not-inherit\n",
       "        tau: 0.9\n",
       "        vel_set: D2Q9\n",
       "        coll_oper: RRBGK\n",
       "\n",
       "      BC:\n",
       "        periodic_dims: [false, false]\n",
       "        BC_map:\n",
       "          - pos: W\n",
       "            BC: UniformFlow\n",
       "            wall_normal: W\n",
       "            rho: 1.0\n",
       "            ux: 0.05\n",
       "            uy: 0\n",
       "            uz: 0\n",
       "            order: 1\n",
       "\n",
       "          - pos: E\n",
       "            BC: RegularizedNeumannOutlet\n",
       "            rho: 1.0\n",
       "            wall_normal: E\n",
       "            order: 1\n",
       "\n",
       "          - pos: N\n",
       "            BC: RegularizedHWBB\n",
       "            wall_normal: N\n",
       "            order: 0\n",
       "\n",
       "          - pos: S\n",
       "            BC: RegularizedHWBB\n",
       "            wall_normal: S\n",
       "            order: 0\n",
       "\n",
       "  - name: velocityNeumannPoiseuilleChannelMultilevel\n",
       "    parent: periodicPoiseuilleChannel\n",
       "\n",
       "    save_path: ./tests/validation/results/02_poiseuille_channel_flow/multilevel\n",
       "\n",
       "    n_steps: 64000\n",
       "\n",
       "    domain:\n",
       "      domain_size:\n",
       "        x: 96\n",
       "        y: 24\n",
       "      block_size: 8\n",
       "      refinement:\n",
       "        static:\n",
       "          default:\n",
       "            volumes_refine:\n",
       "              - { start: [0, 0], end: [8, 8], lvl: 1, is_abs: true }\n",
       "              - { start: [0, 16], end: [8, 24], lvl: 1, is_abs: true }\n",
       "              - { start: [8, 8], end: [24, 16], lvl: 1, is_abs: true }\n",
       "              - { start: [16, 0], end: [32, 8], lvl: 1, is_abs: true }\n",
       "              - { start: [24, 16], end: [48, 24], lvl: 1, is_abs: true }\n",
       "              - { start: [40, 8], end: [48, 16], lvl: 1, is_abs: true }\n",
       "              - { start: [56, 0], end: [72, 8], lvl: 1, is_abs: true }\n",
       "              - { start: [80, 8], end: [88, 16], lvl: 1, is_abs: true }\n",
       "              - { start: [88, 16], end: [96, 24], lvl: 1, is_abs: true }\n",
       "\n",
       "    data:\n",
       "      divergence: { frequency: 50 }\n",
       "      instantaneous:\n",
       "        default: { interval: { frequency: 12000 }, macrs: [rho, u, S] }\n",
       "\n",
       "    models:\n",
       "      precision:\n",
       "        default: single\n",
       "\n",
       "      LBM: !not-inherit\n",
       "        tau: 0.8\n",
       "        vel_set: D2Q9\n",
       "        coll_oper: RRBGK\n",
       "\n",
       "      engine:\n",
       "        name: CUDA\n",
       "\n",
       "      BC:\n",
       "        periodic_dims: [false, false, true]\n",
       "        BC_map:\n",
       "          - pos: W\n",
       "            BC: UniformFlow\n",
       "            rho: 1.0\n",
       "            ux: 0.05\n",
       "            uy: 0\n",
       "            uz: 0\n",
       "            order: 1\n",
       "\n",
       "          - pos: E\n",
       "            BC: RegularizedNeumannOutlet\n",
       "            rho: 1.0\n",
       "            wall_normal: E\n",
       "            order: 1\n",
       "\n",
       "          - pos: N\n",
       "            BC: RegularizedHWBB\n",
       "            wall_normal: N\n",
       "            order: 0\n",
       "\n",
       "          - pos: S\n",
       "            BC: RegularizedHWBB\n",
       "            wall_normal: S\n",
       "            order: 0\n",
       "
\n" ], "text/latex": [ "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", "\\PY{n+nt}{simulations}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{n+nt}{name}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{periodicPoiseuilleChannel}\n", "\\PY{+w}{ }\\PY{n+nt}{save\\PYZus{}path}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{./tests/validation/results/02\\PYZus{}poiseuille\\PYZus{}channel\\PYZus{}flow/periodic}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{n\\PYZus{}steps}\\PY{p}{:}\\PY{+w}{ }\\PY{k+kt}{!unroll}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{250}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{1000}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{4000}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{16000}\\PY{p+pIndicator}{]}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{report}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{frequency}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{1000}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{domain}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{domain\\PYZus{}size}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{x}\\PY{p}{:}\\PY{+w}{ }\\PY{k+kt}{!unroll}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{4}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{8}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{16}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{32}\\PY{p+pIndicator}{]}\n", "\\PY{+w}{ }\\PY{n+nt}{y}\\PY{p}{:}\\PY{+w}{ }\\PY{k+kt}{!unroll}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{4}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{8}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{16}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{32}\\PY{p+pIndicator}{]}\n", "\\PY{+w}{ }\\PY{n+nt}{block\\PYZus{}size}\\PY{p}{:}\\PY{+w}{ }\\PY{k+kt}{!unroll}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{4}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{8}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{8}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{8}\\PY{p+pIndicator}{]}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{data}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{divergence}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZob{}}\\PY{n+nt}{ frequency}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{50}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\n", "\\PY{+w}{ }\\PY{n+nt}{instantaneous}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{default}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZob{}}\\PY{n+nt}{ interval}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZob{}}\\PY{n+nt}{ frequency}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{0}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\\PY{p+pIndicator}{,}\\PY{n+nt}{ macrs}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{rho}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{u}\\PY{p+pIndicator}{]}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\n", "\\PY{+w}{ }\\PY{n+nt}{statistics}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{interval}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZob{}}\\PY{n+nt}{ frequency}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{0}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{models}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{precision}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{default}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{single}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{LBM}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{tau}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{0.9}\n", "\\PY{+w}{ }\\PY{n+nt}{vel\\PYZus{}set}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{D2Q9}\n", "\\PY{+w}{ }\\PY{n+nt}{coll\\PYZus{}oper}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{RRBGK}\n", "\\PY{+w}{ }\\PY{n+nt}{F}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{c+c1}{\\PYZsh{} FX is divided by 8}\n", "\\PY{+w}{ }\\PY{n+nt}{x}\\PY{p}{:}\\PY{+w}{ }\\PY{k+kt}{!unroll}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{4.0e\\PYZhy{}4}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{5.0e\\PYZhy{}5}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{6.25e\\PYZhy{}6}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{7.8125e\\PYZhy{}07}\\PY{p+pIndicator}{]}\n", "\\PY{+w}{ }\\PY{n+nt}{y}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{0}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{multiblock}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{overlap\\PYZus{}F2C}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{1}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{engine}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{name}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{CUDA}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{BC}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{periodic\\PYZus{}dims}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{true}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{false}\\PY{p+pIndicator}{]}\n", "\\PY{+w}{ }\\PY{n+nt}{BC\\PYZus{}map}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{n+nt}{pos}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{N}\n", "\\PY{+w}{ }\\PY{n+nt}{BC}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{HWBB}\n", "\\PY{+w}{ }\\PY{n+nt}{wall\\PYZus{}normal}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{N}\n", "\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{n+nt}{pos}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{S}\n", "\\PY{+w}{ }\\PY{n+nt}{BC}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{HWBB}\n", "\\PY{+w}{ }\\PY{n+nt}{wall\\PYZus{}normal}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{S}\n", "\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{n+nt}{name}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{regularizedPeriodicPoiseuilleChannel}\n", "\\PY{+w}{ }\\PY{n+nt}{parent}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{periodicPoiseuilleChannel}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{models}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{LBM}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{coll\\PYZus{}oper}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{RRBGK}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{BC}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{periodic\\PYZus{}dims}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{true}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{false}\\PY{p+pIndicator}{]}\n", "\\PY{+w}{ }\\PY{n+nt}{BC\\PYZus{}map}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{n+nt}{pos}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{N}\n", "\\PY{+w}{ }\\PY{n+nt}{BC}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{RegularizedHWBB}\n", "\\PY{+w}{ }\\PY{n+nt}{wall\\PYZus{}normal}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{N}\n", "\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{n+nt}{pos}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{S}\n", "\\PY{+w}{ }\\PY{n+nt}{BC}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{RegularizedHWBB}\n", "\\PY{+w}{ }\\PY{n+nt}{wall\\PYZus{}normal}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{S}\n", "\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{n+nt}{name}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{velocityNeumannPoiseuilleChannel}\n", "\\PY{+w}{ }\\PY{n+nt}{parent}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{periodicPoiseuilleChannel}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{save\\PYZus{}path}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{./tests/validation/results/02\\PYZus{}poiseuille\\PYZus{}channel\\PYZus{}flow/velocity\\PYZus{}neumann}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{report}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZob{}}\\PY{n+nt}{ frequency}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{1000}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{n\\PYZus{}steps}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{64000}\n", "\\PY{+w}{ }\\PY{n+nt}{domain}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{domain\\PYZus{}size}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{x}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{256}\n", "\\PY{+w}{ }\\PY{n+nt}{y}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{32}\n", "\\PY{+w}{ }\\PY{n+nt}{block\\PYZus{}size}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{8}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{data}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{instantaneous}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{default}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZob{}}\\PY{n+nt}{ interval}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZob{}}\\PY{n+nt}{ frequency}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{16000}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\\PY{p+pIndicator}{,}\\PY{n+nt}{ macrs}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{rho}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{u}\\PY{p+pIndicator}{]}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{models}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{LBM}\\PY{p}{:}\\PY{+w}{ }\\PY{k+kt}{!not\\PYZhy{}inherit}\n", "\\PY{+w}{ }\\PY{n+nt}{tau}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{0.9}\n", "\\PY{+w}{ }\\PY{n+nt}{vel\\PYZus{}set}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{D2Q9}\n", "\\PY{+w}{ }\\PY{n+nt}{coll\\PYZus{}oper}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{RRBGK}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{BC}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{periodic\\PYZus{}dims}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{false}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{false}\\PY{p+pIndicator}{]}\n", "\\PY{+w}{ }\\PY{n+nt}{BC\\PYZus{}map}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{n+nt}{pos}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{W}\n", "\\PY{+w}{ }\\PY{n+nt}{BC}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{UniformFlow}\n", "\\PY{+w}{ }\\PY{n+nt}{wall\\PYZus{}normal}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{W}\n", "\\PY{+w}{ }\\PY{n+nt}{rho}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{1.0}\n", "\\PY{+w}{ }\\PY{n+nt}{ux}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{0.05}\n", "\\PY{+w}{ }\\PY{n+nt}{uy}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{0}\n", "\\PY{+w}{ }\\PY{n+nt}{uz}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{0}\n", "\\PY{+w}{ }\\PY{n+nt}{order}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{1}\n", "\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{n+nt}{pos}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{E}\n", "\\PY{+w}{ }\\PY{n+nt}{BC}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{RegularizedNeumannOutlet}\n", "\\PY{+w}{ }\\PY{n+nt}{rho}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{1.0}\n", "\\PY{+w}{ }\\PY{n+nt}{wall\\PYZus{}normal}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{E}\n", "\\PY{+w}{ }\\PY{n+nt}{order}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{1}\n", "\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{n+nt}{pos}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{N}\n", "\\PY{+w}{ }\\PY{n+nt}{BC}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{RegularizedHWBB}\n", "\\PY{+w}{ }\\PY{n+nt}{wall\\PYZus{}normal}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{N}\n", "\\PY{+w}{ }\\PY{n+nt}{order}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{0}\n", "\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{n+nt}{pos}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{S}\n", "\\PY{+w}{ }\\PY{n+nt}{BC}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{RegularizedHWBB}\n", "\\PY{+w}{ }\\PY{n+nt}{wall\\PYZus{}normal}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{S}\n", "\\PY{+w}{ }\\PY{n+nt}{order}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{0}\n", "\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{n+nt}{name}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{velocityNeumannPoiseuilleChannelMultilevel}\n", "\\PY{+w}{ }\\PY{n+nt}{parent}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{periodicPoiseuilleChannel}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{save\\PYZus{}path}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{./tests/validation/results/02\\PYZus{}poiseuille\\PYZus{}channel\\PYZus{}flow/multilevel}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{n\\PYZus{}steps}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{64000}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{domain}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{domain\\PYZus{}size}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{x}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{96}\n", "\\PY{+w}{ }\\PY{n+nt}{y}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{24}\n", "\\PY{+w}{ }\\PY{n+nt}{block\\PYZus{}size}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{8}\n", "\\PY{+w}{ }\\PY{n+nt}{refinement}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{static}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{default}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{volumes\\PYZus{}refine}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZob{}}\\PY{n+nt}{ start}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{0}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{0}\\PY{p+pIndicator}{]}\\PY{p+pIndicator}{,}\\PY{n+nt}{ end}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{8}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{8}\\PY{p+pIndicator}{]}\\PY{p+pIndicator}{,}\\PY{n+nt}{ lvl}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{1}\\PY{p+pIndicator}{,}\\PY{n+nt}{ is\\PYZus{}abs}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{true}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZob{}}\\PY{n+nt}{ start}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{0}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{16}\\PY{p+pIndicator}{]}\\PY{p+pIndicator}{,}\\PY{n+nt}{ end}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{8}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{24}\\PY{p+pIndicator}{]}\\PY{p+pIndicator}{,}\\PY{n+nt}{ lvl}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{1}\\PY{p+pIndicator}{,}\\PY{n+nt}{ is\\PYZus{}abs}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{true}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZob{}}\\PY{n+nt}{ start}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{8}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{8}\\PY{p+pIndicator}{]}\\PY{p+pIndicator}{,}\\PY{n+nt}{ end}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{24}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{16}\\PY{p+pIndicator}{]}\\PY{p+pIndicator}{,}\\PY{n+nt}{ lvl}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{1}\\PY{p+pIndicator}{,}\\PY{n+nt}{ is\\PYZus{}abs}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{true}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZob{}}\\PY{n+nt}{ start}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{16}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{0}\\PY{p+pIndicator}{]}\\PY{p+pIndicator}{,}\\PY{n+nt}{ end}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{32}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{8}\\PY{p+pIndicator}{]}\\PY{p+pIndicator}{,}\\PY{n+nt}{ lvl}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{1}\\PY{p+pIndicator}{,}\\PY{n+nt}{ is\\PYZus{}abs}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{true}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZob{}}\\PY{n+nt}{ start}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{24}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{16}\\PY{p+pIndicator}{]}\\PY{p+pIndicator}{,}\\PY{n+nt}{ end}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{48}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{24}\\PY{p+pIndicator}{]}\\PY{p+pIndicator}{,}\\PY{n+nt}{ lvl}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{1}\\PY{p+pIndicator}{,}\\PY{n+nt}{ is\\PYZus{}abs}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{true}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZob{}}\\PY{n+nt}{ start}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{40}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{8}\\PY{p+pIndicator}{]}\\PY{p+pIndicator}{,}\\PY{n+nt}{ end}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{48}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{16}\\PY{p+pIndicator}{]}\\PY{p+pIndicator}{,}\\PY{n+nt}{ lvl}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{1}\\PY{p+pIndicator}{,}\\PY{n+nt}{ is\\PYZus{}abs}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{true}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZob{}}\\PY{n+nt}{ start}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{56}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{0}\\PY{p+pIndicator}{]}\\PY{p+pIndicator}{,}\\PY{n+nt}{ end}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{72}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{8}\\PY{p+pIndicator}{]}\\PY{p+pIndicator}{,}\\PY{n+nt}{ lvl}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{1}\\PY{p+pIndicator}{,}\\PY{n+nt}{ is\\PYZus{}abs}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{true}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZob{}}\\PY{n+nt}{ start}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{80}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{8}\\PY{p+pIndicator}{]}\\PY{p+pIndicator}{,}\\PY{n+nt}{ end}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{88}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{16}\\PY{p+pIndicator}{]}\\PY{p+pIndicator}{,}\\PY{n+nt}{ lvl}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{1}\\PY{p+pIndicator}{,}\\PY{n+nt}{ is\\PYZus{}abs}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{true}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZob{}}\\PY{n+nt}{ start}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{88}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{16}\\PY{p+pIndicator}{]}\\PY{p+pIndicator}{,}\\PY{n+nt}{ end}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{96}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{24}\\PY{p+pIndicator}{]}\\PY{p+pIndicator}{,}\\PY{n+nt}{ lvl}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{1}\\PY{p+pIndicator}{,}\\PY{n+nt}{ is\\PYZus{}abs}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{true}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{data}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{divergence}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZob{}}\\PY{n+nt}{ frequency}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{50}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\n", "\\PY{+w}{ }\\PY{n+nt}{instantaneous}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{default}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZob{}}\\PY{n+nt}{ interval}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZob{}}\\PY{n+nt}{ frequency}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{12000}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\\PY{p+pIndicator}{,}\\PY{n+nt}{ macrs}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{rho}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{u}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{S}\\PY{p+pIndicator}{]}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{models}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{precision}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{default}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{single}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{LBM}\\PY{p}{:}\\PY{+w}{ }\\PY{k+kt}{!not\\PYZhy{}inherit}\n", "\\PY{+w}{ }\\PY{n+nt}{tau}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{0.8}\n", "\\PY{+w}{ }\\PY{n+nt}{vel\\PYZus{}set}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{D2Q9}\n", "\\PY{+w}{ }\\PY{n+nt}{coll\\PYZus{}oper}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{RRBGK}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{engine}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{name}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{CUDA}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{BC}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{periodic\\PYZus{}dims}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{false}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{false}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{true}\\PY{p+pIndicator}{]}\n", "\\PY{+w}{ }\\PY{n+nt}{BC\\PYZus{}map}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{n+nt}{pos}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{W}\n", "\\PY{+w}{ }\\PY{n+nt}{BC}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{UniformFlow}\n", "\\PY{+w}{ }\\PY{n+nt}{rho}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{1.0}\n", "\\PY{+w}{ }\\PY{n+nt}{ux}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{0.05}\n", "\\PY{+w}{ }\\PY{n+nt}{uy}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{0}\n", "\\PY{+w}{ }\\PY{n+nt}{uz}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{0}\n", "\\PY{+w}{ }\\PY{n+nt}{order}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{1}\n", "\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{n+nt}{pos}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{E}\n", "\\PY{+w}{ }\\PY{n+nt}{BC}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{RegularizedNeumannOutlet}\n", "\\PY{+w}{ }\\PY{n+nt}{rho}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{1.0}\n", "\\PY{+w}{ }\\PY{n+nt}{wall\\PYZus{}normal}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{E}\n", "\\PY{+w}{ }\\PY{n+nt}{order}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{1}\n", "\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{n+nt}{pos}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{N}\n", "\\PY{+w}{ }\\PY{n+nt}{BC}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{RegularizedHWBB}\n", "\\PY{+w}{ }\\PY{n+nt}{wall\\PYZus{}normal}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{N}\n", "\\PY{+w}{ }\\PY{n+nt}{order}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{0}\n", "\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{n+nt}{pos}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{S}\n", "\\PY{+w}{ }\\PY{n+nt}{BC}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{RegularizedHWBB}\n", "\\PY{+w}{ }\\PY{n+nt}{wall\\PYZus{}normal}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{S}\n", "\\PY{+w}{ }\\PY{n+nt}{order}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{0}\n", "\\end{Verbatim}\n" ], "text/plain": [ "simulations:\n", " - name: periodicPoiseuilleChannel\n", " save_path: ./tests/validation/results/02_poiseuille_channel_flow/periodic\n", "\n", " n_steps: !unroll [250, 1000, 4000, 16000]\n", "\n", " report:\n", " frequency: 1000\n", "\n", " domain:\n", " domain_size:\n", " x: !unroll [4, 8, 16, 32]\n", " y: !unroll [4, 8, 16, 32]\n", " block_size: !unroll [4, 8, 8, 8]\n", "\n", " data:\n", " divergence: { frequency: 50 }\n", " instantaneous:\n", " default: { interval: { frequency: 0 }, macrs: [rho, u] }\n", " statistics:\n", " interval: { frequency: 0 }\n", "\n", " models:\n", " precision:\n", " default: single\n", "\n", " LBM:\n", " tau: 0.9\n", " vel_set: D2Q9\n", " coll_oper: RRBGK\n", " F:\n", " # FX is divided by 8\n", " x: !unroll [4.0e-4, 5.0e-5, 6.25e-6, 7.8125e-07]\n", " y: 0\n", "\n", " multiblock:\n", " overlap_F2C: 1\n", "\n", " engine:\n", " name: CUDA\n", "\n", " BC:\n", " periodic_dims: [true, false]\n", " BC_map:\n", " - pos: N\n", " BC: HWBB\n", " wall_normal: N\n", "\n", " - pos: S\n", " BC: HWBB\n", " wall_normal: S\n", "\n", " - name: regularizedPeriodicPoiseuilleChannel\n", " parent: periodicPoiseuilleChannel\n", "\n", " models:\n", " LBM:\n", " coll_oper: RRBGK\n", "\n", " BC:\n", " periodic_dims: [true, false]\n", " BC_map:\n", " - pos: N\n", " BC: RegularizedHWBB\n", " wall_normal: N\n", "\n", " - pos: S\n", " BC: RegularizedHWBB\n", " wall_normal: S\n", "\n", " - name: velocityNeumannPoiseuilleChannel\n", " parent: periodicPoiseuilleChannel\n", "\n", " save_path: ./tests/validation/results/02_poiseuille_channel_flow/velocity_neumann\n", "\n", " report: { frequency: 1000 }\n", "\n", " n_steps: 64000\n", " domain:\n", " domain_size:\n", " x: 256\n", " y: 32\n", " block_size: 8\n", "\n", " data:\n", " instantaneous:\n", " default: { interval: { frequency: 16000 }, macrs: [rho, u] }\n", "\n", " models:\n", " LBM: !not-inherit\n", " tau: 0.9\n", " vel_set: D2Q9\n", " coll_oper: RRBGK\n", "\n", " BC:\n", " periodic_dims: [false, false]\n", " BC_map:\n", " - pos: W\n", " BC: UniformFlow\n", " wall_normal: W\n", " rho: 1.0\n", " ux: 0.05\n", " uy: 0\n", " uz: 0\n", " order: 1\n", "\n", " - pos: E\n", " BC: RegularizedNeumannOutlet\n", " rho: 1.0\n", " wall_normal: E\n", " order: 1\n", "\n", " - pos: N\n", " BC: RegularizedHWBB\n", " wall_normal: N\n", " order: 0\n", "\n", " - pos: S\n", " BC: RegularizedHWBB\n", " wall_normal: S\n", " order: 0\n", "\n", " - name: velocityNeumannPoiseuilleChannelMultilevel\n", " parent: periodicPoiseuilleChannel\n", "\n", " save_path: ./tests/validation/results/02_poiseuille_channel_flow/multilevel\n", "\n", " n_steps: 64000\n", "\n", " domain:\n", " domain_size:\n", " x: 96\n", " y: 24\n", " block_size: 8\n", " refinement:\n", " static:\n", " default:\n", " volumes_refine:\n", " - { start: [0, 0], end: [8, 8], lvl: 1, is_abs: true }\n", " - { start: [0, 16], end: [8, 24], lvl: 1, is_abs: true }\n", " - { start: [8, 8], end: [24, 16], lvl: 1, is_abs: true }\n", " - { start: [16, 0], end: [32, 8], lvl: 1, is_abs: true }\n", " - { start: [24, 16], end: [48, 24], lvl: 1, is_abs: true }\n", " - { start: [40, 8], end: [48, 16], lvl: 1, is_abs: true }\n", " - { start: [56, 0], end: [72, 8], lvl: 1, is_abs: true }\n", " - { start: [80, 8], end: [88, 16], lvl: 1, is_abs: true }\n", " - { start: [88, 16], end: [96, 24], lvl: 1, is_abs: true }\n", "\n", " data:\n", " divergence: { frequency: 50 }\n", " instantaneous:\n", " default: { interval: { frequency: 12000 }, macrs: [rho, u, S] }\n", "\n", " models:\n", " precision:\n", " default: single\n", "\n", " LBM: !not-inherit\n", " tau: 0.8\n", " vel_set: D2Q9\n", " coll_oper: RRBGK\n", "\n", " engine:\n", " name: CUDA\n", "\n", " BC:\n", " periodic_dims: [false, false, true]\n", " BC_map:\n", " - pos: W\n", " BC: UniformFlow\n", " rho: 1.0\n", " ux: 0.05\n", " uy: 0\n", " uz: 0\n", " order: 1\n", "\n", " - pos: E\n", " BC: RegularizedNeumannOutlet\n", " rho: 1.0\n", " wall_normal: E\n", " order: 1\n", "\n", " - pos: N\n", " BC: RegularizedHWBB\n", " wall_normal: N\n", " order: 0\n", "\n", " - pos: S\n", " BC: RegularizedHWBB\n", " wall_normal: S\n", " order: 0" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import Code\n", "\n", "Code(filename=filename)" ] } ], "metadata": { "kernelspec": { "display_name": "nassu", "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.10" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }