{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Turbulent Channel (Reynolds 180)\n", "\n", "The simulation of a periodic turbulent channel is also used for validation of a multilevel domain. A friction Reynolds number of 180 is fixed for both cases. The pressure gradient is estabilished through a constant body force." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from nassu.cfg.model import ConfigScheme\n", "\n", "filename = \"tests/validation/cases/04_turbulent_channel_flow.nassu.yaml\"\n", "\n", "sim_cfgs = ConfigScheme.sim_cfgs_from_file_dct(filename)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "The multilevel setup tries to reproduce a DNS using a optimized amount of grid nodes." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "sim_cfg_mb = next(\n", " sim_cfg\n", " for (name, _), sim_cfg in sim_cfgs.items()\n", " if sim_cfg.name == \"periodicTurbulentChannelMultilevel\"\n", ")\n", "sim_cfgs_use = {\"mb\": sim_cfg_mb}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Functions to use for turbulence channel processing" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import pathlib\n", "from nassu.cfg.schemes.simul import SimulationConfigs\n", "from vtk.util.numpy_support import vtk_to_numpy\n", "from tests.validation.notebooks import common\n", "\n", "\n", "def get_experimental_profiles(reynolds_tau: float) -> dict[str, pd.DataFrame]:\n", " files_tau: dict[float, dict[str, str]] = {\n", " 142: {\n", " \"ux\": \"Turbulent_channel/Re_tau_142/u_avg.csv\",\n", " \"ux_rms\": \"Turbulent_channel/Re_tau_142/u_rms.csv\",\n", " \"uy_rms\": \"Turbulent_channel/Re_tau_142/v_rms.csv\",\n", " \"uz_rms\": \"Turbulent_channel/Re_tau_142/w_rms.csv\",\n", " },\n", " 520: {\n", " \"ux\": \"Turbulent_channel/Re_tau_520/u_avg.csv\",\n", " \"ux_rms\": \"Turbulent_channel/Re_tau_142/u_rms.csv\",\n", " },\n", " }\n", "\n", " files_get = files_tau[reynolds_tau]\n", " vals_exp: dict[str, pd.DataFrame] = {}\n", " for name, comp_file in files_get.items():\n", " filename = pathlib.Path(\"tests/validation/comparison\") / comp_file\n", " df = pd.read_csv(filename, delimiter=\",\")\n", " vals_exp[name] = df\n", " return vals_exp\n", "\n", "\n", "def get_height_scale(sim_cfg: SimulationConfigs, reynolds_tau: float, u_ref: float) -> float:\n", " kin_visc = sim_cfg.models.LBM.kinematic_viscosity\n", " return u_ref / kin_visc\n", "\n", "\n", "reader_output = {}\n", "for name, sim_cfg in sim_cfgs_use.items():\n", " stats_export = sim_cfg.output.stats[\"default\"]\n", " last_step = stats_export.interval.get_all_process_steps(sim_cfg.n_steps)[-1]\n", " reader = stats_export.read_vtm_export(last_step)\n", " reader_output[sim_cfg.name] = reader.GetOutput()\n", "\n", "\n", "def get_macr_compressed(\n", " sim_cfg: SimulationConfigs, macr_name: str, is_2nd_order: bool\n", ") -> np.ndarray:\n", " global reader, reader_output\n", "\n", " output_use = reader_output[sim_cfg.name]\n", "\n", " macr_name_read = macr_name if not is_2nd_order else f\"{macr_name}_2nd\"\n", " ds = sim_cfg.domain.domain_size\n", "\n", " p0 = np.array((ds.x // 2, 0, ds.z // 2))\n", " p1 = np.array((ds.x // 2, ds.y - 1, ds.z // 2))\n", " n_points = ds.y\n", " pos = np.linspace(p0, p1, num=n_points, endpoint=True)\n", " norm_pos = (pos[:, 1] + 0.5) / (len(pos) + 1)\n", "\n", " # Sum 0.5 because data is cell centered in vtm\n", " line = common.create_line(p0 + 0.5, p1 + 0.5, n_points - 1)\n", "\n", " probe_filter = common.probe_over_line(line, output_use)\n", " probed_data = vtk_to_numpy(probe_filter.GetOutput().GetPointData().GetArray(macr_name_read))\n", "\n", " return np.array([norm_pos, probed_data])" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Results\n", "\n", "The average velocity profile is shown for the case. It can be a good approximation from reference results for the multilevel case." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAg0AAAHHCAYAAAA8g2vbAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAVHJJREFUeJzt3XlUU9f+NvAnRMABBXFgUBQUZ6Iojig/Qa1THSKiFlRw1lZbW7B6oc5W0RasrXrV1us8i8jtpVWrXlFUnEWJVosI4gDOMqkMyXn/6EtuU0ATSAgkz2etrJpz9jn5pgbzsM8+e4sEQRBARERE9B4m+i6AiIiIKgeGBiIiIlILQwMRERGphaGBiIiI1MLQQERERGphaCAiIiK1MDQQERGRWhgaiIiISC0MDURERKQWhgYiUtvChQshEonUartlyxaIRCKkpKQot3l6esLT01M3xWmoItVCVFkwNBAZkMIvapFIhNOnTxfZLwgCHBwcIBKJMGjQIK285rJlyxAVFaWVcxFRxcbQQGSAqlatil27dhXZfvLkSTx48ADm5uZae62SQsPYsWPx5s0bNG7cWGuvRUT6xdBAZIAGDhyI/fv3o6CgQGX7rl274ObmBltbW53XIBaLUbVqVbUvZxBRxcfQQGSAfH198fz5cxw9elS5LS8vDxEREfDz81NpGxMTA5FIhJiYGJXtKSkpEIlE2LJlS4mvIxKJkJOTg61btyovi4wbNw5A8WMaipObm4sFCxbA2dkZ5ubmcHBwwOzZs5Gbm6ts4+LiAi8vryLHKhQKNGjQAD4+PirbVq1ahTZt2qBq1aqwsbHB1KlT8fLly3fWQUTvx9BAZIAcHR3RrVs37N69W7nt0KFDyMjIwEcffaS119m+fTvMzc3h4eGB7du3Y/v27Zg6daraxysUCgwZMgRhYWEYPHgwVq9eDalUiu+++w6jRo1Sths1ahROnTqF9PR0leNPnz6NR48eqbynqVOn4ssvv0T37t3x/fffY/z48di5cyf69euH/Pz8sr9pIiNWRd8FEJFu+Pn5ITg4GG/evEG1atWwc+dO9OzZE/b29lp7jTFjxmDatGlo0qQJxowZo/Hxu3btwrFjx3Dy5En06NFDud3FxQXTpk3D2bNn4e7ujlGjRmH+/PmIiIjAjBkzlO327t0LCwsLfPjhhwD+DBEbN27Ezp07VXpUvLy80L9/f+zfv79ITwsRqY89DUQGauTIkXjz5g2io6ORlZWF6OjoCveFuX//frRq1QotW7bEs2fPlI9evXoBAE6cOAEAaN68OVxdXbF3717lsXK5HBERERg8eDCqVaumPJ+lpSU++OADlfO5ubnBwsJCeT4iKh32NBAZqHr16qFPnz7YtWsXXr9+DblcrnLtvyJITEzE77//jnr16hW7/8mTJ8o/jxo1CiEhIXj48CEaNGiAmJgYPHnyROUyRmJiIjIyMlC/fv33no+INMfQQGTA/Pz8MHnyZKSnp2PAgAGwsrIq0qakuxvkcrmOq/tzTINEIsHKlSuL3e/g4KD886hRoxAcHIz9+/fj888/x759+2BpaYn+/furnK9+/frYuXNnsecrKZwQkXoYGogM2LBhwzB16lScO3dOpWv/r2rXrg0AePXqlcr2e/fuqfUaZbmlsmnTprh27Rp69+793vM4OTmhc+fO2Lt3L2bMmIHIyEhIpVKVOSeaNm2KY8eOoXv37spLFkSkPRzTQGTALCwssG7dOixcuBCDBw8utk3jxo0hFotx6tQple3//Oc/1XqNGjVqFAkc6ho5ciQePnyIn376qci+N2/eICcnR2XbqFGjcO7cOWzatAnPnj1TuTRReD65XI4lS5YUOV9BQUGp6ySiP7GngcjABQQEvHO/paUlRowYgdWrV0MkEqFp06aIjo5W+/q/m5sbjh07hpUrV8Le3h5OTk7o0qWLWseOHTsW+/btw7Rp03DixAl0794dcrkct27dwr59+3DkyBF07NhR2X7kyJGYNWsWZs2aBWtra/Tp00flfD179sTUqVMRGhqK+Ph49O3bF6ampkhMTMT+/fvx/fffV7hxHUSVCUMDEWH16tXIz8/H+vXrYW5ujpEjR+Lbb7+Fi4vLe49duXIlpkyZgrlz5+LNmzcICAhQOzSYmJggKioK3333HbZt24aDBw+ievXqaNKkCWbOnInmzZurtG/YsCHc3d1x5swZTJo0CaampkXOuX79eri5uWHDhg0ICQlBlSpV4OjoiDFjxqB79+7q/Q8homKJBEEQ9F0EERERVXwc00BERERqYWggIiIitTA0EBERkVoYGoiIiEgtDA1ERESkFoYGIiIiUotBzNOgUCjw6NEj1KxZs0xT2hIRERkbQRCQlZUFe3t7mJi8uy/BIELDo0ePVBa2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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "# Despite the reynolds value being 180, the experimental data for 142 and 180 is pretty much the same\n", "reynolds_tau = 142\n", "u_ref = 0.00529\n", "\n", "fig, ax = plt.subplots(1, 1)\n", "fig.set_size_inches(6, 5)\n", "\n", "for i, sim_cfg in enumerate(sim_cfgs_use.values()):\n", " height_scale = get_height_scale(sim_cfg, reynolds_tau, u_ref)\n", "\n", " analytical_values = get_experimental_profiles(reynolds_tau)\n", "\n", " macr_compr = get_macr_compressed(sim_cfg, \"ux\", is_2nd_order=False)\n", " y = macr_compr[0].copy()\n", " ux_avg = macr_compr[1].copy()\n", "\n", " ux_avg /= u_ref\n", " y *= height_scale * sim_cfg.domain.domain_size.y\n", "\n", " exp_y = analytical_values[\"ux\"][\"y+\"]\n", " exp_ux_avg = analytical_values[\"ux\"][\"u/u*\"]\n", "\n", " ax.plot(y, ux_avg, \"--k\", label=f\"N={sim_cfg.domain.domain_size.x}\")\n", " ax.plot(exp_y, exp_ux_avg, \"ok\", label=\"Experimental\", fillstyle=\"none\")\n", "\n", " ax.set_title(\"Multilevel\")\n", "\n", " ax.legend()\n", " ax.set_xlim(1, 160)\n", " ax.set_xscale(\"symlog\")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "The results of the ${\\mathrm{u_{rms}}}$ velocity profiles shown below also indicate a good representation with the multilevel approach." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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HTt2tGlKWyIiIk8jhMDVq1fRq1cveHnZ1lagiKDhv//9r9HCNkRERGSds2fPok+fPjadQxFBQ8eOHQFIF+zn5+fk2hARESlHVVUVgoKCDPdSWygiaNB3Sfj5+TFoICIiagU5uveZCElEREQWYdBAREREFmHQQERERBZRRE4DERE5Vn19PWpra51dDbJA27ZtoVarHfJaDBqIiMhIbW0tSktLUV9f7+yqkIU6deqEnj172n0uIwYNRERkIIRARUUF1Go1goKCbJ4MiOxLCIHr16/jwoULAIDAwEC7vh6DBiIiMqirq8P169fRq1cv+Pr6Ors6ZIF27doBAC5cuIAePXrYtauCISQRERnodDoAgEajcXJNyBr6AO/mzZt2fR0GDURE1ATX+VEWR71fDBqIiIjIIsxpUCCdTof9+/ejoqICgYGBGDduXLN9WNYeT0REZApbGhQmNzcXAwYMQHR0NB555BFER0djwIAByM3NleV4IiIlmj17NlQqFV588UWj8ry8PJfuatm0aRM6depkcp9KpUJeXp5D69MSBg0Kkpubi4SEBISFhUGr1eLq1avQarUICwtDQkJCk0DA2uOJiGyVmpqK9PR0k/vS09ORmppqt9f28fHBSy+9hF9++cVur+HpGDQohE6nw5IlSzBlyhTk5eUhPDwcHTp0QHh4OPLy8jBlyhQsXbrUkPls7fGNX6uwsBBbt25FYWGhyWOIiExRq9VISUlpEjikp6cjJSXFrl2jEyZMQM+ePZGZmWn2mJ9//hnTp09H79694evri7CwMGzdutXomJycHISFhaFdu3bo2rUrJkyYgGvXrgEACgsLMWrUKLRv3x6dOnXC2LFjUVZWBkBq7YiLizM61zPPPIOoqChZr9OZGDQoxP79+3HmzBksX768yWQrXl5eSEpKQmlpKfbv39+q4/XYnUFEtkhOTkZaWppR4KAPGNLS0pCcnGy311ar1cjIyMC6devw448/mjymuroaI0aMwEcffYTi4mLMnTsXM2fOxKFDhwAAFRUVmD59OubMmYMTJ06gsLAQ8fHxEEKgrq4OcXFxiIyMxNdffw2tVou5c+e6dPeH3JgIqRAVFRUAgNDQUJP79eX646w9HrjVnTFlyhRs3boVoaGhKC4uRkZGBhISEpCTk4P4+Hh5LoiI3JY+MEhJScGqVatQW1tr94BB7/e//z2G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kJub6+yqETWRmppqWL+isfT0dKTaIQuNQTWZkp5+K2CorTWfHGkPv/3tbxETE4OkpKQm+15++WWsXbsWzz33HAoKCnDs2DHExMSgtrYWgNTFsXv3bnz88ccYOnQo1q1bh8GDB6O0tBQAsHHjRmi1WkRERGDbtm0YNGgQDh48CADw8vJC46mPbt682WJ9o6OjUVBQgG+++QY3btzA3XffDQCIjIxEQUEBCgoK4Ovri9GjR9v0/yIHBg3NyM3NRUJCAsLCwqDVanH16lVotVqEhYUhISGBgQO5HLVajZSUlCaBg37aarnXsWBQTaY0zGGoqWma4+AIL774Ij788ENotVqj8gMHDmDq1KmYMWMGhg0bhttuuw3ff/+90TEqlQpjx47FypUrcfToUWg0GuzcudOw/6677kJSUhKKiooQGhqK7OxsAED37t2btDwcO3asxbpGR0ejpKQE2dnZuOeeewx/p7/97W+xb98+FBYWGroxnE5YISMjQ4wcOVJ06NBBdO/eXUydOlV89913LT5v+/btYvDgwcLb21uEhoaKjz76yJqXFZWVlQKAqKystOp5tqirqxPBwcEiNjZW6HQ6o306nU7ExsaKkJAQUVdX57A6EVkiLS1NABBpaWkmH8tlx44dQqVSidjYWKHVasXVq1eFVqsVsbGxQqVSiR07dsj6euQYN27cEN9++624ceNGq56fliYEIP20pFwuiYmJYurUqUZlM2fOFD4+PqLhrW7RokUiKChIHDhwQHz77bfiiSeeEH5+fobnHjx4ULzwwgviP//5jygrKxPbt28XGo1G/Otf/xKnT58Wy5YtE0VFReLMmTNi165domvXruJvf/ubEEKITz75RKhUKrF582bx/fffi5SUFOHn5yciIyObrfuNGzeEt7e36Nixo3jxxRcN5dXV1cLHx0d07NhRZGRktHgOc++bnPdQq4KGmJgYsXHjRlFcXCyOHTsm7r//ftG3b1/x66+/mn3OgQMHhFqtFn/5y1/Et99+K55//nnRtm1bcfz4cYtf1xlBQ0FBgQAgtFqtyf1FRUUCgCgoKHBYnYgspQ8UNBqNXQIGBtXuy9agYcUK84FBWpq03x5MBQ2lpaWGvwG9n3/+WUydOlV06NBB9OjRQzz//PNi1qxZhud+++23IiYmRnTv3l14e3uLQYMGiXXr1gkhhDh37pyIi4sT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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(1, 1)\n", "fig.set_size_inches(6, 5)\n", "\n", "vel_name_map = {\"ux\": \"u\", \"uy\": \"v\", \"uz\": \"w\"}\n", "\n", "for i, sim_cfg in enumerate(sim_cfgs_use.values()):\n", " for macr_name, marker, color in [(\"ux\", \"o\", \"k\"), (\"uy\", \"^\", \"r\"), (\"uz\", \"s\", \"b\")]:\n", " macr_compr_rms = get_macr_compressed(sim_cfg, macr_name, is_2nd_order=True)\n", " macr_compr_avg = get_macr_compressed(sim_cfg, macr_name, is_2nd_order=False)\n", "\n", " y = macr_compr_rms[0].copy()\n", " vel_2nd = macr_compr_rms[1].copy()\n", " vel_avg = macr_compr_avg[1].copy()\n", " vel_rms = (vel_2nd - vel_avg**2) ** 0.5\n", "\n", " vel_rms /= u_ref\n", " y *= height_scale * sim_cfg.domain.domain_size.y\n", " # Remove wall value\n", " vel_rms = vel_rms[1:]\n", " y = y[1:]\n", "\n", " name_vel = vel_name_map[macr_name]\n", " df = analytical_values[f\"{macr_name}_rms\"]\n", " exp_y = df[\"y+\"]\n", " exp_rms = df[f\"{name_vel}'/u*\"]\n", "\n", " ax.plot(y, vel_rms, f\"x{color}\", label=f\"Nassu {name_vel.upper()}\")\n", " ax.plot(\n", " exp_y, exp_rms, f\"{marker}{color}\", label=f\"Exp. {name_vel.upper()}\", fillstyle=\"none\"\n", " )\n", "\n", " ax.set_title(\"Multilevel\")\n", "\n", " ax.legend()\n", " ax.set_xlim(0, 80)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Version" ] }, { "cell_type": "code", "execution_count": 6, "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": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
simulations:\n",
       "  - name: periodicTurbulentChannel\n",
       "    save_path: ./tests/validation/results/04_turbulent_channel_flow/\n",
       "\n",
       "    n_steps: 600000\n",
       "    report:\n",
       "      frequency: 1000\n",
       "\n",
       "    domain:\n",
       "      # u* = 0.00493 / l = 64 / ETT = l/u* = 12,984\n",
       "      # Re_tau = 142\n",
       "      # y+ = 2.0\n",
       "      domain_size:\n",
       "        x: 512\n",
       "        y: 128\n",
       "        z: 128\n",
       "      block_size: 8\n",
       "\n",
       "    data:\n",
       "      divergence: { frequency: 50 }\n",
       "      instantaneous:\n",
       "        default: { interval: { frequency: 200000 }, macrs: [rho, u, S] }\n",
       "      statistics:\n",
       "        interval: { frequency: 100, start_step: 300000 }\n",
       "        macrs_1st_order: [rho, u]\n",
       "        macrs_2nd_order: [u]\n",
       "        exports:\n",
       "          default: { interval: { frequency: 50000 } }\n",
       "\n",
       "    models:\n",
       "      precision:\n",
       "        default: single\n",
       "\n",
       "      LBM:\n",
       "        tau: 0.5074\n",
       "        F:\n",
       "          x: 4.72e-7\n",
       "          y: 0\n",
       "          z: 0\n",
       "        vel_set: D3Q27\n",
       "        coll_oper: RRBGK\n",
       "      initialization:\n",
       "        vtm_filename: "../nassuArtifacts/macrs/turbulent_channel.vtm"\n",
       "\n",
       "      engine:\n",
       "        name: CUDA\n",
       "\n",
       "      BC:\n",
       "        periodic_dims: [true, false, true]\n",
       "        BC_map:\n",
       "          - pos: N\n",
       "            BC: RegularizedHWBB\n",
       "            wall_normal: N\n",
       "            order: 1\n",
       "\n",
       "          - pos: S\n",
       "            BC: RegularizedHWBB\n",
       "            wall_normal: S\n",
       "            order: 1\n",
       "\n",
       "  - name: periodicTurbulentChannelMultilevel\n",
       "    save_path: ./tests/validation/results/04_turbulent_channel_flow/\n",
       "\n",
       "    n_steps: 200000\n",
       "    # u* = 0.00525 / l = 48 / ETT = l/u* = 9,150\n",
       "    # Re_tau = 180\n",
       "    # y+ = 3.75 (lvl 0)\n",
       "\n",
       "    report:\n",
       "      frequency: 1000\n",
       "\n",
       "    domain:\n",
       "      domain_size:\n",
       "        x: 384\n",
       "        y: 96\n",
       "        z: 96\n",
       "      block_size: 8\n",
       "      refinement:\n",
       "        static:\n",
       "          default:\n",
       "            volumes_refine:\n",
       "              - start: [0, 0, 0]\n",
       "                end: [384, 8, 96]\n",
       "                lvl: 1\n",
       "                is_abs: true\n",
       "              - start: [0, 88, 0]\n",
       "                end: [384, 96, 96]\n",
       "                lvl: 1\n",
       "                is_abs: true\n",
       "\n",
       "    data:\n",
       "      divergence: { frequency: 50 }\n",
       "      instantaneous:\n",
       "        default: { interval: { frequency: 200000 }, macrs: [rho, u, S] }\n",
       "        start_simul:\n",
       "          { interval: { end_step: 2000, frequency: 500 }, macrs: [rho, u, S] }\n",
       "      statistics:\n",
       "        interval: { frequency: 50, start_step: 50000 }\n",
       "        macrs_1st_order: [rho, u]\n",
       "        macrs_2nd_order: [u]\n",
       "        exports:\n",
       "          default: { interval: { frequency: 50000 } }\n",
       "\n",
       "    models:\n",
       "      precision:\n",
       "        default: single\n",
       "\n",
       "      LBM:\n",
       "        tau: 0.5042\n",
       "        F:\n",
       "          x: 5.75e-7\n",
       "          y: 0\n",
       "          z: 0\n",
       "        vel_set: D3Q27\n",
       "        coll_oper: RRBGK\n",
       "      initialization:\n",
       "        vtm_filename: "../nassuArtifacts/macrs/turbulent_channel.vtm"\n",
       "\n",
       "      engine:\n",
       "        name: CUDA\n",
       "\n",
       "      BC:\n",
       "        periodic_dims: [true, false, true]\n",
       "        BC_map:\n",
       "          - pos: N\n",
       "            BC: RegularizedHWBB\n",
       "            wall_normal: N\n",
       "            order: 1\n",
       "\n",
       "          - pos: S\n",
       "            BC: RegularizedHWBB\n",
       "            wall_normal: S\n",
       "            order: 1\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}{periodicTurbulentChannel}\n", "\\PY{+w}{ }\\PY{n+nt}{save\\PYZus{}path}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{./tests/validation/results/04\\PYZus{}turbulent\\PYZus{}channel\\PYZus{}flow/}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{n\\PYZus{}steps}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{600000}\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{c+c1}{\\PYZsh{} u* = 0.00493 / l = 64 / ETT = l/u* = 12,984}\n", "\\PY{+w}{ }\\PY{c+c1}{\\PYZsh{} Re\\PYZus{}tau = 142}\n", "\\PY{+w}{ }\\PY{c+c1}{\\PYZsh{} y+ = 2.0}\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}{512}\n", "\\PY{+w}{ }\\PY{n+nt}{y}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{128}\n", "\\PY{+w}{ }\\PY{n+nt}{z}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{128}\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}{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}{200000}\\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", "\\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}{100}\\PY{p+pIndicator}{,}\\PY{n+nt}{ start\\PYZus{}step}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{300000}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\n", "\\PY{+w}{ }\\PY{n+nt}{macrs\\PYZus{}1st\\PYZus{}order}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{rho}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{u}\\PY{p+pIndicator}{]}\n", "\\PY{+w}{ }\\PY{n+nt}{macrs\\PYZus{}2nd\\PYZus{}order}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{u}\\PY{p+pIndicator}{]}\n", "\\PY{+w}{ }\\PY{n+nt}{exports}\\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}{50000}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\\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.5074}\n", "\\PY{+w}{ }\\PY{n+nt}{F}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{x}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{4.72e\\PYZhy{}7}\n", "\\PY{+w}{ }\\PY{n+nt}{y}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{0}\n", "\\PY{+w}{ }\\PY{n+nt}{z}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{0}\n", "\\PY{+w}{ }\\PY{n+nt}{vel\\PYZus{}set}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{D3Q27}\n", "\\PY{+w}{ }\\PY{n+nt}{coll\\PYZus{}oper}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{RRBGK}\n", "\\PY{+w}{ }\\PY{n+nt}{initialization}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{vtm\\PYZus{}filename}\\PY{p}{:}\\PY{+w}{ }\\PY{l+s}{\\PYZdq{}}\\PY{l+s}{../nassuArtifacts/macrs/turbulent\\PYZus{}channel.vtm}\\PY{l+s}{\\PYZdq{}}\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}{,}\\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}{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}{1}\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}{1}\n", "\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{n+nt}{name}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{periodicTurbulentChannelMultilevel}\n", "\\PY{+w}{ }\\PY{n+nt}{save\\PYZus{}path}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{./tests/validation/results/04\\PYZus{}turbulent\\PYZus{}channel\\PYZus{}flow/}\n", "\n", "\\PY{+w}{ }\\PY{n+nt}{n\\PYZus{}steps}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{200000}\n", "\\PY{+w}{ }\\PY{c+c1}{\\PYZsh{} u* = 0.00525 / l = 48 / ETT = l/u* = 9,150}\n", "\\PY{+w}{ }\\PY{c+c1}{\\PYZsh{} Re\\PYZus{}tau = 180}\n", "\\PY{+w}{ }\\PY{c+c1}{\\PYZsh{} y+ = 3.75 (lvl 0)}\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{l+lScalar+lScalarPlain}{384}\n", "\\PY{+w}{ }\\PY{n+nt}{y}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{96}\n", "\\PY{+w}{ }\\PY{n+nt}{z}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{96}\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{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{+w}{ }\\PY{n+nv}{0}\\PY{p+pIndicator}{]}\n", "\\PY{+w}{ }\\PY{n+nt}{end}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{384}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{8}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{96}\\PY{p+pIndicator}{]}\n", "\\PY{+w}{ }\\PY{n+nt}{lvl}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{1}\n", "\\PY{+w}{ }\\PY{n+nt}{is\\PYZus{}abs}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{true}\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZhy{}}\\PY{+w}{ }\\PY{n+nt}{start}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{0}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{88}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{0}\\PY{p+pIndicator}{]}\n", "\\PY{+w}{ }\\PY{n+nt}{end}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{384}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{96}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{96}\\PY{p+pIndicator}{]}\n", "\\PY{+w}{ }\\PY{n+nt}{lvl}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{1}\n", "\\PY{+w}{ }\\PY{n+nt}{is\\PYZus{}abs}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{true}\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}{200000}\\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", "\\PY{+w}{ }\\PY{n+nt}{start\\PYZus{}simul}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZob{}}\\PY{n+nt}{ interval}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZob{}}\\PY{n+nt}{ end\\PYZus{}step}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{2000}\\PY{p+pIndicator}{,}\\PY{n+nt}{ frequency}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{500}\\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", "\\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}{50}\\PY{p+pIndicator}{,}\\PY{n+nt}{ start\\PYZus{}step}\\PY{p}{:}\\PY{+w}{ }\\PY{n+nv}{50000}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\n", "\\PY{+w}{ }\\PY{n+nt}{macrs\\PYZus{}1st\\PYZus{}order}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{rho}\\PY{p+pIndicator}{,}\\PY{+w}{ }\\PY{n+nv}{u}\\PY{p+pIndicator}{]}\n", "\\PY{+w}{ }\\PY{n+nt}{macrs\\PYZus{}2nd\\PYZus{}order}\\PY{p}{:}\\PY{+w}{ }\\PY{p+pIndicator}{[}\\PY{n+nv}{u}\\PY{p+pIndicator}{]}\n", "\\PY{+w}{ }\\PY{n+nt}{exports}\\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}{50000}\\PY{+w}{ }\\PY{p+pIndicator}{\\PYZcb{}}\\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.5042}\n", "\\PY{+w}{ }\\PY{n+nt}{F}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{x}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{5.75e\\PYZhy{}7}\n", "\\PY{+w}{ }\\PY{n+nt}{y}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{0}\n", "\\PY{+w}{ }\\PY{n+nt}{z}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{0}\n", "\\PY{+w}{ }\\PY{n+nt}{vel\\PYZus{}set}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{D3Q27}\n", "\\PY{+w}{ }\\PY{n+nt}{coll\\PYZus{}oper}\\PY{p}{:}\\PY{+w}{ }\\PY{l+lScalar+lScalarPlain}{RRBGK}\n", "\\PY{+w}{ }\\PY{n+nt}{initialization}\\PY{p}{:}\n", "\\PY{+w}{ }\\PY{n+nt}{vtm\\PYZus{}filename}\\PY{p}{:}\\PY{+w}{ }\\PY{l+s}{\\PYZdq{}}\\PY{l+s}{../nassuArtifacts/macrs/turbulent\\PYZus{}channel.vtm}\\PY{l+s}{\\PYZdq{}}\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}{,}\\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}{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}{1}\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}{1}\n", "\\end{Verbatim}\n" ], "text/plain": [ "simulations:\n", " - name: periodicTurbulentChannel\n", " save_path: ./tests/validation/results/04_turbulent_channel_flow/\n", "\n", " n_steps: 600000\n", " report:\n", " frequency: 1000\n", "\n", " domain:\n", " # u* = 0.00493 / l = 64 / ETT = l/u* = 12,984\n", " # Re_tau = 142\n", " # y+ = 2.0\n", " domain_size:\n", " x: 512\n", " y: 128\n", " z: 128\n", " block_size: 8\n", "\n", " data:\n", " divergence: { frequency: 50 }\n", " instantaneous:\n", " default: { interval: { frequency: 200000 }, macrs: [rho, u, S] }\n", " statistics:\n", " interval: { frequency: 100, start_step: 300000 }\n", " macrs_1st_order: [rho, u]\n", " macrs_2nd_order: [u]\n", " exports:\n", " default: { interval: { frequency: 50000 } }\n", "\n", " models:\n", " precision:\n", " default: single\n", "\n", " LBM:\n", " tau: 0.5074\n", " F:\n", " x: 4.72e-7\n", " y: 0\n", " z: 0\n", " vel_set: D3Q27\n", " coll_oper: RRBGK\n", " initialization:\n", " vtm_filename: \"../nassuArtifacts/macrs/turbulent_channel.vtm\"\n", "\n", " engine:\n", " name: CUDA\n", "\n", " BC:\n", " periodic_dims: [true, false, true]\n", " BC_map:\n", " - pos: N\n", " BC: RegularizedHWBB\n", " wall_normal: N\n", " order: 1\n", "\n", " - pos: S\n", " BC: RegularizedHWBB\n", " wall_normal: S\n", " order: 1\n", "\n", " - name: periodicTurbulentChannelMultilevel\n", " save_path: ./tests/validation/results/04_turbulent_channel_flow/\n", "\n", " n_steps: 200000\n", " # u* = 0.00525 / l = 48 / ETT = l/u* = 9,150\n", " # Re_tau = 180\n", " # y+ = 3.75 (lvl 0)\n", "\n", " report:\n", " frequency: 1000\n", "\n", " domain:\n", " domain_size:\n", " x: 384\n", " y: 96\n", " z: 96\n", " block_size: 8\n", " refinement:\n", " static:\n", " default:\n", " volumes_refine:\n", " - start: [0, 0, 0]\n", " end: [384, 8, 96]\n", " lvl: 1\n", " is_abs: true\n", " - start: [0, 88, 0]\n", " end: [384, 96, 96]\n", " lvl: 1\n", " is_abs: true\n", "\n", " data:\n", " divergence: { frequency: 50 }\n", " instantaneous:\n", " default: { interval: { frequency: 200000 }, macrs: [rho, u, S] }\n", " start_simul:\n", " { interval: { end_step: 2000, frequency: 500 }, macrs: [rho, u, S] }\n", " statistics:\n", " interval: { frequency: 50, start_step: 50000 }\n", " macrs_1st_order: [rho, u]\n", " macrs_2nd_order: [u]\n", " exports:\n", " default: { interval: { frequency: 50000 } }\n", "\n", " models:\n", " precision:\n", " default: single\n", "\n", " LBM:\n", " tau: 0.5042\n", " F:\n", " x: 5.75e-7\n", " y: 0\n", " z: 0\n", " vel_set: D3Q27\n", " coll_oper: RRBGK\n", " initialization:\n", " vtm_filename: \"../nassuArtifacts/macrs/turbulent_channel.vtm\"\n", "\n", " engine:\n", " name: CUDA\n", "\n", " BC:\n", " periodic_dims: [true, false, true]\n", " BC_map:\n", " - pos: N\n", " BC: RegularizedHWBB\n", " wall_normal: N\n", " order: 1\n", "\n", " - pos: S\n", " BC: RegularizedHWBB\n", " wall_normal: S\n", " order: 1" ] }, "execution_count": 7, "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.11.9" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }