{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from IPython.display import clear_output\n", "from lbmpy.session import *\n", "from lbmpy.relaxationrates import relaxation_rate_from_lattice_viscosity\n", "\n", "from pystencils.typing import BasicType, TypedSymbol" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Demo: Interpolation Bounce Back Boundaries\n", "In this notebook we present how to use interpolation bounce back boundaries. We will show this on a simple flow around sphere in two dimensions using the linearised bounce back boundary by [Bouzidi et. al.](https://doi.org/10.1063/1.1399290) and the `QuadraticBounceBack` boundary condition by [Geier et. al.](https://www.sciencedirect.com/science/article/pii/S0898122115002126)\n", "\n", "The first part of the demo is similar to other demos / tutorials, so we will not go into detail about these parts" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "stencil = LBStencil(Stencil.D2Q9)\n", "reference_length = 30\n", "maximal_velocity = 0.05\n", "reynolds_number = 500\n", "kinematic_vicosity = (reference_length * maximal_velocity) / reynolds_number\n", "\n", "initial_velocity=(maximal_velocity, 0)\n", "omega = relaxation_rate_from_lattice_viscosity(kinematic_vicosity)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "domain_size = (400, 150)\n", "dim = len(domain_size)\n", "circle_mid = np.array((40, 75))\n", "circle_rad = 10" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "dh = ps.create_data_handling(domain_size=domain_size)\n", "\n", "src = dh.add_array('pdfs', values_per_cell=len(stencil))\n", "dh.fill(src.name, 0.0, ghost_layers=True)\n", "dst = dh.add_array('pdfs_tmp', values_per_cell=len(stencil))\n", "dh.fill(dst.name, 0.0, ghost_layers=True)\n", "\n", "velField = dh.add_array('velField', values_per_cell=dh.dim)\n", "dh.fill('velField', 0.0, ghost_layers=True)\n", "\n", "densityField = dh.add_array('densityField', values_per_cell=1)\n", "dh.fill('densityField', 1.0, ghost_layers=True)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "lbm_config = LBMConfig(stencil=stencil, method=Method.CUMULANT, relaxation_rate=omega,\n", " compressible=True, output={\"velocity\": velField, \"density\": densityField})\n", "\n", "method = create_lb_method(lbm_config=lbm_config)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "init = pdf_initialization_assignments(method, 1.0, (0.0, 0.0, 0.0), src.center_vector)\n", "\n", "ast_init = ps.create_kernel(init, target=dh.default_target)\n", "kernel_init = ast_init.compile()\n", "\n", "dh.run_kernel(kernel_init)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "lbm_optimisation = LBMOptimisation(symbolic_field=src, symbolic_temporary_field=dst)\n", "update = create_lb_update_rule(lb_method=method,\n", " lbm_config=lbm_config,\n", " lbm_optimisation=lbm_optimisation)\n", "\n", "ast_kernel = ps.create_kernel(update, target=dh.default_target)\n", "kernel = ast_kernel.compile()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "def set_sphere(x, y, *_):\n", " return (x-circle_mid[0])**2 + (y-circle_mid[1])**2 < circle_rad**2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Interpolation Boundary Conditions implementation details\n", "\n", "The most important part of the interpolation bounce back boundary is, that we need to define the distance to the wall for each boundary cell. Thus, we need to provide a Python CallBack function to the boundary that calculates the normalised wall distance `q` for each cell and stores the value in `boundary_data`. The normalised wall distance is defined as:\n", "\n", "$$\n", "\\begin{align}\n", "q = \\frac{|\\boldsymbol{x}_{F} - \\boldsymbol{x}_{w}|}{|\\boldsymbol{x}_{F} - \\boldsymbol{x}_{b}|}.\n", "\\end{align}\n", "$$\n", "\n", " The variable `boundary_data` is an index vector that every boundary condition holds internally. For simple boundaries it stores the `x`- and `y`- (and `z` in 3D) coordinate to represent a fluid cell that is next to a boundary cell and the lattice direction `dir` to get from the fluid cell to the boundary cell.\n", "\n", "In the case of the interpolation boundaries we have an additional value `q` that needs to be stored in each cell. This value needs to be between 0 and 1, otherwise the boundary condition would fall back to a simple bounce back boundary without interpolation.\n", "\n", "
\n", "\"Boundary.svg\" \n", "
\n", "\n", "Two dimensional representation of the boundary nodes with the normalised wall distance `q`. The figure was inspired by [Directional lattice Boltzmann boundary conditions](https://doi.org/10.13097/archive-ouverte/unige:160770). \n", "\n", "The linear Bouzidi boundary condition is implemented using the following equation\n", "$$\n", "\\begin{align}\n", " f_{\\bar{i}}^{t + 1}(\\boldsymbol{x}_b) = \n", "\\begin{cases}\n", " \\frac{1}{2q} f_{i}(\\boldsymbol{x}_F) + \\frac{2q-1}{2q} f_{\\bar{i}}(\\boldsymbol{x}_{F}), & \\text{if } q \\geq 0.5\\\\\n", " 2 q f_{i}(\\boldsymbol{x}_F) + (1 - 2q) f_{i}(\\boldsymbol{x}_{FF}), & q > 0 \\land q < 0.5 \\\\\n", " f_{i}(\\boldsymbol{x}_F), & q = -1\n", "\\end{cases}\n", "\\end{align}\n", "$$\n", "\n", "where $f_{\\bar{i}}^{t + 1}(\\boldsymbol{x}_b)$ is the missing lattice link that will be needed in the next streaming step. Furthermore, $f_{i}(\\boldsymbol{x}_F)$ represents the lattice link flowing in wall direction at $\\boldsymbol{x}_{F}$, $f_{\\bar{i}}(\\boldsymbol{x}_{F})$ is the inverse direction at $\\boldsymbol{x}_{F}$ and $f_{i}(\\boldsymbol{x}_{FF})$ is the lattice link at the next cell.\n", "\n", "**The linearised bounce back boundary by [Bouzidi et. al.](https://doi.org/10.1063/1.1399290) needs a second fluid node for the interpolation. This fluid node is not guaranteed to exist. In this case, we implemented a fallback scenario to a simple bounce back scheme with interpolation by setting `q` to -1.**\n", "\n", "To overcome this problem, we can use the `QuadraticBounceBack` boundary condition by [Geier et. al.](https://www.sciencedirect.com/science/article/pii/S0898122115002126). It uses the following rule:\n", "\n", "$$\n", "\\begin{align}\n", "f_{\\bar{i}}^{\\mathrm{p}}(\\boldsymbol{x}_F) &= \\frac{f_{\\bar{i}}(\\boldsymbol{x}_F) - f_{i}(\\boldsymbol{x}_F)}{2} + \\frac{f_{\\bar{i}}(\\boldsymbol{x}_F) + f_{i}(\\boldsymbol{x}_F)- \\omega(f_{\\bar{i}}^{\\mathrm{eq}}(\\boldsymbol{x}_F) + f_{i}^{\\mathrm{eq}}(\\boldsymbol{x}_F))}{2 - 2\\omega} \\\\\n", "f_{\\bar{i}}^{\\mathrm{wall}}(\\boldsymbol{x}_F) &= (1 - q)f_{\\bar{i}}^{\\mathrm{p}}(\\boldsymbol{x}_F) + q f_{\\bar{i}}(\\boldsymbol{x}_F) \\\\\n", "f_{\\bar{i}}^{t + 1}(\\boldsymbol{x}_b) &= \\frac{1}{q+1} f_{\\bar{i}}^{\\mathrm{wall}}(\\boldsymbol{x}_F) + \\frac{q}{q+1}f_{i}(\\boldsymbol{x}_F)\n", "\\end{align}\n", "$$\n", "\n", "In this BC the idea is to realise the interpolation with the pre collision PDF value (marked with the subscript p). Since the pre collision PDF value is not available a simple reconstruction needs to be done. This happens via the BGK rule and the relaxation rate for the fluid viscosity. Thus, this boundary condition needs the equilibrium at the wall. However, the equilibrium at the wall can be calculated inplace from the PDFs. Thus, this BC does not need any further information and can be applied in all cases. Furthermore, we have no more branches with the subgrid distance `q`" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def init_wall_distance(boundary_data, **_):\n", " dim = boundary_data.dim\n", " coords = [coord for coord, _ in zip(['x', 'y', 'z'], range(dim))]\n", "\n", " for cell in boundary_data.index_array:\n", " direction = np.array(stencil[cell['dir']])\n", " fluid_cell = np.array(tuple([cell[coord] for coord in coords])) - np.array([0.5] * dim)\n", " boundary_cell = fluid_cell + direction\n", " \n", " f = fluid_cell - circle_mid\n", " d = (boundary_cell - circle_mid) - f\n", " \n", " a = d.dot(d)\n", " b = 2.0 * ( d.dot(f))\n", " c = f.dot(f) - circle_rad**2\n", " \n", " bb4ac = b * b - ( 4.0 * a * c )\n", " assert bb4ac > 0\n", " \n", " sqrtbb4ac = np.sqrt(bb4ac)\n", " q = np.min( [( -b + sqrtbb4ac ) / ( 2.0 * a ), ( -b - sqrtbb4ac ) / ( 2.0 * a )] )\n", " \n", " assert q > 0 and q < 1\n", " \n", " cell['q'] = q" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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AAAAAAAAAAAAABRJDA0AAAAAAAAAAAAAFEkMDQAAAAAAAAAAAAAUSQwNAAAAAAAAAAAAABRJDA0AAAAAAAAAAAAAFEkMDQAAAAAAAAAAAAAUSQwNAAAAAAAAAAAAABRJDA0AAAAAAAAAAAAAFEkMDQAAAAAAAAAAAAAUSQwNAAAAAAAAAAAAABRJDA0AAAAAAAAAAAAAFEkMDQAAAAAAAAAAAAAUSQwNAAAAAAAAAAAAABRJDA0AAAAAAAAAAAAAFEkMDQAAAAAAAAAAAAAUSQwNAAAAAAAAAAAAABRJDA0AAAAAAAAAAAAAFEkMDQAAAAAAAAAAAAAUSQwNAAAAAAAAAAAAABRJDA0AAAAAAAAAAAAAFEkMDQAAAAAAAAAAAAAUSQwNAAAAAAAAAAAAABRJDA0AAAAAAAAAAAAAFEkMDQAAAAAAAAAAAAAUSQwNAAAAAAAAAAAAABRJDA0AAAAAAAAAAAAAFEkMDQAAAAAAAAAAAAAUSQwNAAAAAAAAAAAAABRJDA0AAAAAAAAAAAAAFEkMDQAAAAAAAAAAAAAUSQwNAAAAAAAAAAAAABRJDA0AAAAAAAAAAAAAFEkMDQAAAAAAAAAAAAAUSQwNAAAAAAAAAAAAABRJDA0AAAAAAAAAAAAAFEkMDQAAAAAAAAAAAAAUSQwNAAAAAAAAAAAAABRJDA0AAAAAAAAAAAAAFEkMDQAAAAAAAAAAAAAUSQwNAAAAAAAAAAAAABRJDA0AAAAAAAAAAAAAFEkMDQAAAAAAAAAAAAAUSQwNAAAAAAAAAAAAABRJDA0AAAAAAAAAAAAAFEkMDQAAAAAAAAAAAAAUSQwNAAAAAAAAAAAAABRJDA0AAAAAAAAAAAAAFEkMDQAAAAAAAAAAAAAUSQwNAAAAAAAAAAAAABRJDA0AAAAAAAAAAAAAFEkMDQAAAAAAAAAAAAAUSQwNAAAAAAAAAAAAABRJDA0AAAAAAAAAAAAAFEkMDQAAAAAAAAAAAAAUSQwNAAAAAAAAAAAAABRJDA0AAAAAAAAAAAAAFEkMDQAAAAAAAAAAAAAUSQwNAAAAAAAAAAAAABRJDA0AAAAAAAAAAAAAFEkMDQAAAAAAAAAAAAAUSQwNAAAAAAAAAAAAABRJDA0AAAAAAAAAAAAAFEkMDQAAAAAAAAAAAAAUSQwNAAAAAAAAAAAAABRJDA0AAAAA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SZLDDz88ffv23eH7Xbp0ybHHHptHH3208Z3mDBo0aIfP3guUd2XdunXrml2zdOnSXH/99XnggQfy6quv7nCvd999N2vWrGnxt7VkyJAhLT4/8MADs379+h3OyR+JoQEAAAAAAAAAAABo4r1ToZPsNPbt169fs/f/8Ic/tPj8/Q455JAm7zSne/fuO3z2/pOrW7vunXfe2e753Llz89WvfjX19fUtzvueTZs2tWpdc1qaM/m3WZubk3/T/JnlAAAAAAAAAAAAAHxoNTQ0NF5XVFS0em1zdvZ+a/bYG2praxtD6L59+2bmzJl55pln8vvf/z5bt25NQ0NDGhoaMnfu3MZ39oW5P+ycDA0AAAAAAAAAAABAE7179268fu211zJo0KAdrn399ddb3OPVV1/d6fdee+217b67t916662pr69P586d8+ijj2bo0KHNrnv/qdl0PCdDAwAAAAAAAAAAANDExz/+8cbrX/3qVy2u3dHzj33sY0mSlStX7jCYTpJt27Zl8eLFTd7pCL/97W+TJH/2Z3+2wxA6SRYtWrS3RqIVxNAAAAAAAAAAAAAANHHcccflwAMPTJL8z//5P9PQ0NDsuldeeSUPPfRQs89Gjx6dJGloaMjNN9+8w2/97//9v/PWW281eacj1NfXJ0k2bty4wzWvvvpq7rnnnr01Eq0ghgYAAAAAAAAAAACgia5du+ZLX/pSkuTXv/51Zs6cud2a+vr6TJ48OVu3bm12jwkTJqR///5Jkquuuiq/+c1vtluzatWqTJ06NUnSvXv3xm92hKOOOipJ8sILL2ThwoXbPd+4cWPOPvvsbNq0aW+PRgsqO3oAgD0xs1fz/6cybW3VXp6Ef29H/2wAAAAAAAAAAIAyTJ8+Pf/rf/2v1NXV5eKLL86vf/3r/PVf/3X69u2bF154Idddd11+9atfZfjw4fnVr3613fv77bdfZs+enc9+9rNZt25dTjzxxEybNi2nnHJKKisrs2DBglxzzTV5/fXXkySzZs3KwQcfvLd/ZqO/+qu/yk033ZR33303Y8aMyUUXXZRPfepT6datW5555plcf/31efHFF3PCCSfkySef7LA5aUoMDQAAAAAAAAAAAMB2DjjggDz44IMZPXp0Xn311dxxxx254447mqz50pe+lE9/+tM7PNF57NixueWWW3Leeedl/fr1ufTSS3PppZc2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nHDCCXn44Yc3wxMAAAAAAAAAAAAAAE2hvLkLWB9/+MMfcvbZZ2fBggU1rr/22mt57bXXMnHixLz44ou5995765xfXV2dr3zlKxk5cmSN63PmzMk999yTe+65J2eeeWZuvvnmFAqFTfUYAAAAAAAAAAAAAEATKJkw9B133JHTTjstq1evznbbbZezzz47hx9+eLp06ZK5c+dmxowZuf/++9OyZct617jooouKQeh+/frlggsuyG677ZYZM2bkqquuyuTJkzNy5Mh069Ytl1122eZ6NAAAAAAAAAAAAABgA5REGHratGk588wzs3r16hxxxBG5//7706lTp1rjzj333KxYsaLONaZPn56rrroqSXLAAQdk3LhxadOmTZLkwAMPzLHHHpsBAwZk0qRJufLKK3Paaadlt91223QPBQAAAAAAAAAAAABslLLmLqAxzj333Cxfvjxdu3bN3XffXWcQeo2Kioo6r1977bWpqqpKkowYMaIYhF6jbdu2GTFiRJKkqqoq1113XdMUDwAAAAAAAAAAAABsElt8GPqFF17Io48+miT52te+lq5du673GtXV1bnvvvuSJH369MkhhxxS57hDDjkke+65Z5Lk3nvvTXV19QZWDQAAAAAAAAAAAABsalt8GPoPf/hDsX3iiScW22+++WZefPHFLFiwYJ1rzJw5M3PmzEmSDBgwoMGxa/pnz56dl19+eQMqBgAAAAAAAAAAAAA2hy0+DP3kk08mSTp16pS+ffvmv/7rv/LBD34wXbp0Se/evdO1a9fsuuuuufTSS7No0aI615g2bVqx3adPnwbvt3b/2vMAAAAAAAAAAAAAgC1LeXMXsC5Tp05NkvTs2TPnnntubrzxxlpjZs6cmUsuuSR33XVX/vd//zfdu3ev0T9r1qxiu7KyssH79ejRo8556zJ79uwG+1977bVGrwUAAAAAAAAAAAAArNsWH4b+17/+lSR54YUX8uyzz6Zz58654oorcsIJJ6Rjx455/vnn8/3vfz8PPfRQpkyZkhNPPDHjx49PWdm/D71+5513iu327ds3eL927doV2/WdNF2XtUPUAAAAAAAAAAAAAMCmV7buIc1r8eLFSZLly5enRYsWeeihh3LWWWelW7duadWqVQ444IA88MADOeqoo5Ikjz/+eO6+++4aayxbtqzYrqioaPB+rVq1KraXLl3aVI8BAAAAAAAAAAAAADSxLT4M3bp162L7xBNPzCGHHFJrTFlZWX784x8XP9955531rrFixYoG77d8+fJiu02bNo2uc9asWQ3+TJw4sdFrAQAAAAAAAAAAANC0li5dmksvvTQf/OAH065duxQKhRQKhZx//vlJkttuu6147eWXX27WWmm88uYuYF06dOhQPB16zenPddl7772z0047Zc6cOXnqqadqrbHGokWLGrzfmnslSfv27RtdZ2VlZaPHAgAAAAAAAAAAAJvW5x74XOYvnd/cZWxyXdt0zahPjdos91q4cGF+85vf5MEHH8zUqVMzb968tGzZMttvv30OPPDAHHvssfnsZz+bFi1abJZ61sfKlSvz0Y9+NI8//nhzl7LFevnll9OrV6/1mjN48ODce++9m6agRtriw9A9evTI3Llzk6w7cNyjR4/MmTMn8+bNq3F97XmzZ89ucI1Zs2bVWA8AAAAAAAAAAAAoPfOXzs+8JfPWPZBGueWWW/Kd73wnCxYsqHF96dKlefvtt/Piiy/mt7/9bfbaa6/8/Oc/z+GHH77JayoUCkmSiy++OJdcckmDY//whz8Ug9BDhw7NkCFD0rVr1yQp/klp2uLD0HvvvXfxpOdVq1Y1OHZNf3l5zcfaa6+9iu0XXnihwTXW7u/bt+961QoAAAAAAAAAAACwtfn2t7+dn/zkJ0nezWiefPLJOfbYY7PLLrtkxYoV+fvf/54777wzjz76aKZOnZqPfvSj+c1vfpPPfvazzVz5v/35z39Okuywww655ZZbtsjTq7ckgwcPzmWXXbbOcR07dtwM1TRsiw9DH3nkkbntttuSJDNmzMjHPvaxese+9NJLSZKddtqpxvVevXqle/fuefXVVzN27NgG7zdu3LjiGj179tzwwgEAAAAAAAAAAABK3I033lgMQvfo0SP3339/PvjBD9YYc/jhh2fYsGEZNWpUvvSlL2X58uX54he/mN133z377bdfM1Rd25w5c5Iku+66qyB0I3Tu3Dn77LNPc5fRKGXNXcC6HHvssWnZsmWS5O6776533NixY4tHrx9xxBE1+gqFQgYPHpzk3ZOfn3zyyTrXePLJJ4snQw8ePLh4fDoAAAAAAAAAAADA+80///nPDB8+PEnSvn37PPbYY7WC0Gv73Oc+l9tvvz1JsmLFipx66qmprq7eLLWuy/Lly5OkmEll67HFh6G33XbbnH766UmSP/3pT/nd735Xa8w777yT888/v/j5rLPOqjXm/PPPT3n5uwdhn3vuuVm6dGmN/qVLl+bcc89N8u4R7muvBwAAAAAAAAAAAPB+c91112XZsmVJkosvvji77777OuecfPLJOeaYY5IkU6ZMyQMPPFBrTM+ePVMoFDJ06NAG1xo6dGgKhUJ69uxZ5/w1Lr300hQKhRo/Q4cOzcsvv1z8PHbs2CTvHr679rj3rt0Yb7zxRi666KL069cvnTt3TuvWrdOzZ8+ceuqpmTBhQr1z1tzz5z//eZ1jTj/99OKYNZnW97ruuutSKBRSXl6et99+e71r3xpt8WHo5N2/SHfeeeckyamnnppzzz03o0ePztNPP53bbrstBx10UP76178mSc4+++wceOCBtdbo3bt38bcTJk2alP79+2fUqFGZNGlSRo0alf79+2fSpElJkm9/+9vZY489Ns/DAQAAAAAAAAAAAGxhqqurc8cddyRJ2rRpkzPOOKPRc88777xi+9Zbb23y2prTI488kt133z2XX355/vrXv2bhwoVZvnx5/vnPf+Y3v/lNjjjiiHzta1/L6tWra8zr1q1b9tprryTJ6NGj61x7zJgxxfa6xuy3337p2LFj8fqagPjaIfH3i/LmLqAxunXrlocffjjHHntspk+fnhtuuCE33HBDrXFf/vKXc/3119e7zuWXX5558+blV7/6VSZPnpyTTz651phhw4blsssua9L6AQAAAAAAAAAAAErJ3/72t/zrX/9Kkhx55JHp1KlTo+d+5CMfSdu2bbNkyZJ6T0reGI888khWrFiRfffdN8m7B+mec845NcZss8022W677fL8888nSU477bRMmjQpBxxwQI2AdkVFRaPv+9e//jWf/vSns2LFirRs2TJf/epXM3jw4LRr1y6TJ0/OFVdckZkzZ+bGG29Mu3btcuWVV9aYP2DAgEydOrV4SvXa5syZkxkzZhQ/T506NW+88Ua6detWvFZdXZ3x48cnSQYOHNjourd2JRGGTpK+ffvmr3/9a2666abcddddefHFF7No0aJst9126d+/f84666wMGjSowTXKysryy1/+Mp/5zGcycuTIPPXUU5k/f366du2aAw88MGeddVaOOuqozfREAAAAAAAAAAAAAFumZ599ttj+0Ic+tF5zW7RokQ9+8IN54okn8sYbb+TVV19N9+7dm6y23r171/i83XbbZZ999qlz7Jrr7dq1K/5Z39h1OfPMM7NixYq0aNEiDzzwQD7+8Y8X+w488MCceOKJOfzwwzN16tT85Cc/yZe+9KXsvffexTEDBw7MTTfdlLlz5+aFF15Inz59in1rToLee++9s3Tp0rz00ksZO3ZsPvvZzxbHPPvss8WA+oABAzboGRrrrbfeypQpU9Y5rlevXsXvtrmUTBg6efcvwOHDh2f48OEbtc7RRx+do48+uomqAgAAAAAAAAAAANi6zJ8/v9jeYYcd1nv+9ttvX2wvWLCgScPQzWHixIl56qmnkiSnn356jSD0Gttss01GjhyZww8/PKtXr87Pfvaz3HjjjcX+tQPMY8aMqRGGXnNa9MCBA4th6DFjxtQIQ68ZU1ZWliOOOKJpH/A97rvvvtx3333rHDd69OhmP6W6rFnvDgAAAAAAAAAAAMAW55133im2N+Tk37XnvP32201SU3P685//XGwPGzas3nH9+/dP3759a81J3g2IrwlAjxkzpkbfms8DBw4shovrG/PBD34wnTt3rtH38ssvp7q6OtXV1Y14mq2LMDQAAAAAAAAAAAAANXTo0KHYXrRo0XrPX3tOx44dm6Sm5jRlypQkSUVFRfr169fg2IMPPjhJ8uKLL2bFihU1+tacDr3mlOckefXVVzN9+vQUCoUMGDAggwYNSpJMnTo1b7zxRpKkuro648ePT5LNchLzkCFDiuHqhn6a+1ToRBgaAAAAAAAAAAAAgPfYdttti+25c+eu9/zXX3+9zrVK1b/+9a8kSZcuXVJeXt7g2B122CHJuwHmN998s0bfmvDw3Llz88ILLyRJRo8enSTZa6+90q1bt1RWVmbXXXdNdXV1MTT93HPPZcGCBUn+HajmXcLQAAAAAAAAAAAAANTwwQ9+sNiePHnyes1dtWpVnnvuuSRJt27d0r179yatrTkVCoV1jqmurq63b+0g85gxY5L8+5TotU9ZXtN+75hCoZAjjzxyPSre+glDAwAAAAAAAAAAAFDDPvvsky5duiRJxo0bl4ULFzZ67p///OcsWbIkSXL44YfX6i8reze+unr16gbXWbx4caPvuamt+S4WLFiQqqqqBseuORW7UChkm222qdG34447pnfv3kn+HXRe82dDYeg1f37gAx+oteb7nTA0AAAAAAAAAAAAADUUCoWceuqpSZKlS5fmF7/4RaPnjhgxotgeOnRorf4OHTokSd58880G1/n73//e6Htuavvss0+SZMWKFes8KXvixIlJkj322CMVFRW1+tecDj127Ni8+uqrefHFF1MoFGqcGj1o0KAkydSpUzNv3ryMGzcuSc3ANO8ShgYAAAAAAAAAAACglq9//etp1apVkuTSSy/N9OnT1znnd7/7XR588MEkyV577ZVPfepTtcb06tUrSfLMM8+kurq6znWmTJmS559/vsF7tW7dOkmyfPnydda1sT760Y8W27/85S/rHffEE09k6tSpteasbU2gee7cubn55puTvPtddevWrTimsrIyu+66a6qrq3PDDTdkwYIFSVIjMM27hKEBAAAAAAAAAAAAqKVXr1656qqrkiSLFi3KRz7ykTz77LP1jv/973+fIUOGJEkqKiry61//OmVltaOqawK9r776au68885a/e+8806+/OUvr7O+HXfcMUkyY8aMdT/MRjrooINy4IEHJkluueWW/OlPf6o1ZuHChTnrrLOSJGVlZTn77LPrXGvt051/+tOf1rr23nFrxhQKhRx55JF1rtmzZ88UCoUUCoVGPc/WpLy5CwAAAAAAAAAAAABgy3TeeeflpZdeyvXXX59XXnklBxxwQD7/+c/n2GOPzS677JKVK1fmhRdeyG9/+9s8+uijSd4NQt9xxx350Ic+VOeap5xySi655JK8/fbbGTZsWKZPn55PfOITKRQKmTRpUq655prMmTMn/fr1y+TJk+ut7bDDDsvMmTPzP//zP/n5z3+e/v37F0+L7tixY7bbbrsm/S5GjhyZgw8+OCtWrMgxxxyTc889N5/+9KfTvn37TJ48OVdccUVeeumlJMnw4cOzzz771LlO9+7ds/vuu2f69OlZuHBhkvrD0L/61a+KY/bZZ59su+22TfpM9XnrrbcyZcqUdY5r0aJF+vbtuxkqqp8wNAAAAAAAAAAAAAD1uu6669KnT59897vfzb/+9a/8+te/zq9//es6x/bp0yc333xz8fTnunTr1i233HJLPv/5z2fZsmW5+OKLc/HFFxf7W7dunTvuuCMPPvhgg2Ho4cOH56677sry5cvzla98pUbfkCFDctttt63fg67Dfvvtl/vvvz8nnnhi3n777VxzzTW55pprao376le/mh/96EcNrjVgwIBM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FDJmzJjmLqeklDd3AQAAAAAAAAAAAABN7fc/fCpL3l7R3GVscm07VuSkCw9s7jKg2QhDAwAAAAAAAAAAAFudJW+vyOK3ljd3GTSj2267LaeddlqSZObMmU6o3kqVNXcBAAAAAAAAAAAAAAAbQhgaAAAAAAAAAAAAAChJwtAAAAAAAAAAAAAAQEkShgYAAAAAAAAAAACgXitWrMjPfvazDBo0KN26dUtFRUV22GGHHH300fnNb36T1atXN2qdOXPm5Jvf/GZ69+6dtm3bplu3bjn66KPz0EMPrXPuPffck+OOOy6VlZVp1apVOnTokF133TVHHHFEvve972XixInFsWPGjEmhUMhpp51WvNarV68UCoUaP2PGjKlxjyeffDIXXXRRBg4cmB122CEVFRXp2LFj9tprr5x99tmZOnVq476wJH/84x9zyimnZNddd027du3SqVOn7L333jn55JPz3//931m6dGmj13qvP/3pTznllFPSq1evtGnTJh07dswHP/jBXHDBBXnttdc2eN1SVd7cBQAAAAAAAAAAAACwZfrnP/+Zo446KtOmTatx/fXXX89DDz2Uhx56KD//+c9z3333pUuXLvWuM2nSpBxzzDGZN29e8drSpUuLa3z961/PddddV2veqlWr8vnPfz5/+MMfalxfsWJFFi1alJkzZ2bChAl56KGHMmnSpA1+zttuu61GeHqNlStXZtq0aZk2bVp+8Ytf5Kc//WnOOeecetdZsGBBPve5z+XRRx+t1Td16tRMnTo1o0aNyq233pqhQ4euV42LFy/OqaeemnvuuafG9WXLluW5557Lc889l5tuuil33nlnPvWpT63X2qVMGBoAAAAAAAAAAACAWhYtWpQPf/jDeemll5Ikxx13XL785S+ne/fumTlzZm644YaMHTs2EyZMyKc+9amMHz8+LVq0qLXOkiVLcuKJJ2bhwoX5zne+k6OPPjqtWrXK//3f/+VHP/pRXnvttVx//fXZeeed881vfrPG3JtuuqkYhD788MNz+umnZ7fddkv79u3zr3/9K1OmTMlDDz2Uf/3rX8U5Bx54YJ5//vncd999ueiii5Ik//u//5vu3bvXWLtXr17FdlVVVbbZZpsce+yxGTBgQPbYY4+0a9cur776ap555pn89Kc/zfz58/O1r30tffr0yYc//OE6n3PQoEF5/vnnkyT7779/zjzzzOyzzz5p1apVZs2alXHjxmXUqFHr/b/FqlWr8ulPfzqjR49OoVDIySefnBNOOCG9evXKypUrM3HixFx99dV55ZVX8pnPfCaPP/549t9///W+TykShgYAAAAAAAAAAACglksvvbQYhL7ooovygx/8oNi3//775zOf+UxOPfXU/Nd//VeeeOKJjBw5MmeffXatdd5444289dZb+fOf/5wjjzyyeP2ggw7KZz7zmRx88MGZPXt2vve97+WUU07JdtttVxzz+9//Pkly8MEHZ/To0Skvrxl9/fCHP5zzzjuvRhi6Xbt22WeffWqcFN27d+/07Nmz3mc96qij8oUvfCFt27atcb1fv3455phjct555+XII4/Mc889l4svvrjOMPR3v/vdYhD6q1/9akaMGJFCoVDjOzvuuONyxRVX5M0336y3lrpcd911GT16dFq2bJn77rsvRx11VI3+Qw45JKeeemqOOOKI/O1vf8v555+f8ePHr9c9SlVZcxcAAAAAAAAAAAAAwJZl+fLlueWWW5Ike+21Vy655JJaYwqFQn72s59l2223TZLccMMN9a531lln1QhCr9G9e/dcffXVSd49Wfn222+v0T937twkyWGHHVYrCL22Ll26NPxA67DTTjvVCkKvrVOnTvnP//zPJMmECROyYMGCGv1vvvlmRo4cmST50Ic+lOuvv75GEHptFRUV2X777Rtd28qVK4vf0de+9rVaQeg1ttlmm/z4xz8u1jh9+vRG36OUCUMDAAAAAAAAAAAAUMPTTz+dt956K0kydOjQtGjRos5xHTt2zEknnZQkmTp1al577bU6x5122mn13uv4449P586dkyR//vOfa/TtuOOOSZL7778/8+fPX59H2CiLFy/Oyy+/nL/97W+ZMmVKpkyZkpYtWxb7n3322RrjR48enSVLliRJzjvvvHq/rw0xceLE4ve65ruuz9qB8yeeeKLJatiSCUMDAAAAAAAAAAAAUMOUKVOK7YMPPrjBsWv3rz1vjYqKinzgAx+od37Lli3Tr1+/OucPGTIkSTJ9+vTsvvvu+fKXv5w777wzs2fPXvdDrKf58+fnwgsvzJ577pkOHTqkV69e2WeffbLvvvtm3333zTHHHFNj7NomT55cbNd1AvbGmDRpUrF96KGHplAo1PvTvn374tg1p2pv7eo/LxwAAAAAAAAAAACA96V//etfxfb222/f4NgddtihznlrdOnSJeXlDUdW19zjvfO//OUvZ8aMGbnqqquycOHC3Hrrrbn11luTJLvttluOO+64nHPOOdl1110bfqB1ePrpp/OJT3wiCxYsaNT4pUuX1vi8djh6zWnWTWXevHkbNG/NSdVbO2FoAAAAAAAAAAAAAOpVKBQa7K+urt6o+eta4/LLL8+ZZ56Z//qv/8qjjz6aJ598MkuWLMmMGTNy9dVX56c//Wl++tOf5itf+co671OXFStW5KSTTsqCBQvSsmXLnHvuuRk8eHB69+6dbbbZJq1atUqSvPTSS9ltt93WWW9TW7VqVbE9ZsyYbLvtto2at912222qkrYowtAAAAAAAAAAAAAA1NClS5die+7cuendu3e9Y19//fU6562xYMGCrFq1Ki1atKh3jTWnH9c1P0l22WWXXHjhhbnwwguzcuXKTJw4MX/4wx/y85//PMuWLcs555yTgw8+OP369Vvns73XY489lpdeeilJcuONN+aMM86oc9ybb75Z7xpdu3Yttl977bX06tVrveuoz9rh54qKiuyzzz5NtvbWoKy5CwAAAAAAAAAAAABgy7J24Pb//u//Ghw7ceLEOuetsWLFijz77LP1zq+qqspf//rXeue/V8uWLdO/f/9cd911+e1vf5vk3ZOa77rrrhrjGnMidZL87W9/K7ZPPvnkesdNmjSp3r4PfehDxfa4ceMadd/GWjvg/cgjjzTp2lsDYWgAAAAAAAAAAAAAath///3TuXPnJMntt9+eVatW1TnunXfeye9///skyV577ZUdd9yxznG33357vfe65557iqcuf/SjH12vOj/ykY8U2/Pnz6/R17p162J7+fLl9a5RVVVVbC9ZsqTOMatXr87IkSPrXWPQoEFp165dkmTEiBH1fl8b4vDDDy+emH3zzTfn7bffbrK1twbC0AAAAAAAAAAAAADU0KpVq5x++ulJ3j05+dJLL601prq6Ol/72teKIeSvfe1r9a530003ZcKECbWuz507N8OHD0+StG3bNkOGDKnR/5vf/KZGWPm91j4puVevXjX61g5mz5gxo9419thjj2K7vtD2f/zHf+SZZ56pd43OnTvnrLPOSpI8/fTTOf/881NdXV3n2JUrV2bevHn1rvVerVu3Ln5Hc+fOzcknn5zFixfXO/6dd97JDTfc0Oj1S115cxcAAAAAAAAAAAAAwJbn+9//fu6+++689NJL+cEPfpApU6bky1/+crp3756ZM2fmhhtuyJgxY5Ikhx56aM4888w61+nWrVvatm2bj33sY/nGN76Ro48+Oq1atcrEiRPzwx/+MK+++mqS5Ac/+EG22267GnNPPfXUDB8+PCeccEIOO+yw7LbbbmndunVef/31/OlPf8pNN92UJGnfvn1OOeWUGnP79euX1q1bZ9myZfne976X8vLy9OzZM2Vl754lvNNOO6VNmzb5xCc+ke222y7z5s3Ld7/73fzzn//Msccem65du2b69On5xS9+kUcffTT9+/fPX/7yl3q/rx/84Af505/+lOeffz433HBDnnjiiZx11lnZd999U1FRkdmzZ2fChAn57W9/m8suuyxDhw5t9P8WF1xwQR599NE8+uijeeihh7LXXnvlK1/5Sg499NB07tw577zzTv7+979nzJgxuffee9O6desGw+lbE2FoAAAAAAAAAAAAAGrp0KFDHn300Rx11FF54YUXcs899+See+6pNa5///75n//5n7Ro0aLOddq2bZu77rorRx11VH70ox/lRz/6Ua0x5513Xr75zW/WOf/111/PTTfdVAw+v1fnzp0zatSoVFZW1qr/vPPOy1VXXZVnnnkmn/jEJ2r0jx49OgMHDky7du1yxx135LjjjsuyZcvys5/9LD/72c9qjB04cGBuuOGG7LPPPnXWsOY5H3vssXzmM5/JuHHj8vTTT9cbEF9fLVq0yP3335+vfOUrueOOO/LKK6/kwgsvrHf8e0PlW7Oy5i4AAAAAAAAAAAAAgC1Tz5498+yzz+aGG27IgAEDsu2226Zly5bZfvvt88lPfjK//vWvM27cuHTp0qXBdQ444IA888wzOe+884qnO2+77bb55Cc/mT/+8Y+5/vrr65z3wgsvZMSIETnuuOOy1157Zdttt015eXm22WabHHLIIbnkkkvy97//PR//+MfrnH/FFVfkF7/4RY444oh06dKl3sD2Jz7xiUyaNCmnnHJKunfvnpYtW6Zbt24ZMGBARo4cmUcffTTt2rVb5/fVtWvXjB07NnfffXc++9nPprKyMq1atco222yTffbZJ1/84hdz33335Qtf+MI613qvNm3a5Pbbb8+kSZNy9tlnZ++9906nTp1SXl6ezp07Z7/99suwYcNy1113Zdq0aeu9fqkqVFdXVzd3Ee8Hs2fPTo8ePZIks2bNqvXbB+tr6pBCndeP3vGBjVoXAAAAAAAAAACA5tGh73fqvP78kOc3at2mzq81pxdffDFVVVUpLy/PHnvs0eDY3//wqSx5e8Vmqqz5tO1YkZMuPLC5y4BGW5+/jxujvAlqAgAAAAAAAAAAANiiCAjD+0NZcxcAAAAAAAAAAAAAALAhhKEBAAAAAAAAAAAAgJIkDA0AAAAAAAAAAAAAlKSSDkNfcMEFKRQKxZ8xY8asc87DDz+cE044IZWVlWnVqlUqKytzwgkn5OGHH970BQMAAAAAAAAAAAAATaZkw9DPPvtsrr322kaPr66uzllnnZWjjjoq99xzT+bMmZMVK1Zkzpw5ueeee3LUUUflrLPOSnV19SasGgAAAAAAAAAAAABoKiUZhl69enXOOOOMVFVVZbvttmvUnIsuuigjR45MkvTr1y933nlnJk6cmDvvvDP9+vVLkowcOTLf+973NlndAAAAAAAAAAAAAEDTKckw9E9/+tM89dRT6dOnT4YNG7bO8dOnT89VV12VJDnggAPyl7/8JSeffHIOPPDAnHzyyZkwYUIOOOCAJMmVV16ZGTNmbNL6AQAAAAAAAAAAAICNV3Jh6FmzZhVPb77ppptSUVGxzjnXXnttqqqqkiQjRoxImzZtavS3bds2I0aMSJJUVVXluuuua9qiAQAAAAAAAAAAAIAmV3Jh6HPOOSeLFi3KkCFDMnDgwHWOr66uzn333Zck6dOnTw455JA6xx1yyCHZc889kyT33ntvqqurm6xmAAAAAAAAAAAAAKDplVQY+ve//30eeOCBdOnSJT/+8Y8bNWfmzJmZM2dOkmTAgAENjl3TP3v27Lz88ssbVSsAAAAAAAAAAAAAUFNTH1hc3qSrbUJvvfVWvv71rydJrrzyynTr1q1R86ZNm1Zs9+nTp8Gxa/dPmzYtvXr1anR9s2fPbrD/tddea/RaAAAAAAAAAAAAQG0tWrRIVVVVVq1aldWrV6esrKTOhIX3vVWrVmXVqlVJ3v37uSmUTBj6ggsuyNy5c3PYYYdl2LBhjZ43a9asYruysrLBsT169KhzXmOsPRcAAAAAAAAAAABoeq1bt87y5ctTXV2dRYsWpWPHjs1dErAe3nrrrWK7bdu2TbJmSfxKxIQJE3LLLbekvLw8N998cwqFQqPnvvPOO8V2+/btGxzbrl27YnvRokXrXygAAAAAAAAAAACwyawdfp47d27efvvtrF69uhkrAtaluro6y5Yty7x58zJv3rzi9W222aZJ1t/iT4ZesWJFzjzzzFRXV+cb3/hG9t133/Wav2zZsmK7oqKiwbGtWrUqtpcuXbpe91nXSdKvvfZaDjrooPVaEwAAAAAAAAAAAPi3du3apU2bNlm6dGlWrVqVOXPmpFAopEWLFs1dGlCPVatWpbq6usa1Tp061cjtbowtPgz9wx/+MNOmTcvOO++ciy++eL3nt27duthesWJFg2OXL19ebLdp02a97lNZWbl+hQEAAAAAAAAAAADrpVAoZOedd84rr7xSPPS0uro6VVVVzVwZ0FjdunXLtttu22TrbdFh6BdeeCE/+tGPkiQjRoxIu3bt1nuNDh06FNuLFi1qcOzixYuL7fbt26/3vQAAAAAAAAAAAIBNq6ysLLvssksWL16cd955p3hKNLBlKisrS0VFRdq1a5f27dunoqKiSdffosPQ1157bVasWJFdd901S5Ysye9+97taY6ZMmVJsP/bYY5k7d26S5NOf/nTatWtX48Tm2bNnN3i/WbNmFds9evTY2PIBAAAAAAAAAACATaBQKKR9+/YOPgW27DD08uXLkyQvvfRSPv/5z69z/A9+8INie+bMmWnXrl322muv4rUXXnihwflr9/ft23d9ywUAAAAAAAAAAAAANqOy5i5gU+vVq1e6d++eJBk7dmyDY8eNG5ck2WmnndKzZ89NXRoAAAAAAAAAAAAAsBG26DD0bbfdlurq6gZ/Lr744uL40aNHF6+vCTMXCoUMHjw4ybsnPz/55JN13uvJJ58sngw9ePDgFAqFTftwAAAAAAAAAAAAAMBG2aLD0E3l/PPPT3l5eZLk3HPPzdKlS2v0L126NOeee26SpLy8POeff/7mLhEAAAAAAAAAAAAAWE/vizB07969M3z48CTJpEmT0r9//4waNSqTJk3KqFGj0r9//0yaNClJ8u1vfzt77LFHc5YLAAAAAAAAAAAAADRCeXMXsLlcfvnlmTdvXn71q19l8uTJOfnkk2uNGTZsWC677LJmqA4AAAAAAAAAAAAAWF/vi5Ohk6SsrCy//OUv8+CDD2bw4MHp3r17Kioq0r179wwePDh//OMfc8stt6Ss7H3zlQAAAAAA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CUMDAAAAAAAAAAAAACVJGBoAAAAAAAAAAAAAKEnC0AAAAAAAAAAAAABASRKGBgAAAAAAAAAAAABKkjA0AAAAAAAAAAAAAFCShKEBAAAAAAAAAAAAgJIkDA0AAAAAAAAAAAAAlCRhaAAAAAAAAAAAAACgJAlDAwAAAAAAAAAAAAAlSRgaAAAAAAAAAAAAAChJwtAAAAAAAAAAAAAAQEkShgYAAAAAAAAAAAAASpIwNAAAAAAAAAAAAABQkoShAQAAAAAAAAAAAICSJAwNAAAAAAAAAAAAAJQkYWgAAAAAAAAAAAAAoCQJQwMAAAAAAAAAAAAAJUkYGgAAAAAAAAAAAAAoScLQAAAAAAAAAAAAAEBJEoYGAAAAAAAAAAAAAEqSMDQAAAAAAAAAAAAAUJKEoQEAAAAAAAAAAACAkiQMDQAAAAAAAAAAAACUJGFoAAAAAAAAAAAAAKAkCUMDAAAAAAAAAAAAACVJGBoAAAAAAAAAAAAAKEnC0AAAAAAAAAAAAABASRKGBgAAAAAAAAAAAABKkjA0AAAAAAAAAAAAAFCShKEBAAAAAAAAAAAAgJIkDA0AAAAAAAAAAAAAlCRhaAAAAAAAAAAAAACgJAlDAwAAAAAAAAAAAAAlSRgaAAAAAAAAAAAAAChJwtAAAAAAAAAAAAAAQEkShgYAAAAAAAAAAAAASpIwNAAAAAAAAAAAAABQkoShAQAAAAAAAAAAAICSJAwNAAAAAAAAAAAAAJQkYWgAAAAAAAAAAAAAoCQJQwMAAAAAAAAAAAAAJUkYGgAAAAAAAAAAAAAoScLQAAAAAAAAAAAAAEBJEoYGAAAAAAAAAAAAAEqSMDQAAAAAAAAAAAAAUJKEoQEAAAAAAAAAAACAkiQMDQAAAAAAAAAAAACUJGFoAAAAAAAAAAAAAKAkCUMDAAAAAAAAAAAAACVJGBoAAAAAAAAAAAAAKEnC0AAAAAAAAAAAAABASRKGBgAAAAAAAAAAAABKkjA0AAAAAAAAAAAAAFCShKEBAAAAAAAAAAAAgJIkDA0AAAAAAAAAAAAAlCRhaAAAAAAAAAAAAACgJAlDAwAAAAAAAAAAAAAlSRgaAAAAAAAAAAAAAChJwtAAAAAAAAAAAAAAQEkShgYAAAAAAAAAAAAASpIwNAAAAAAAAAAAAABQkoShAQAAAAAAAAAAAICSJAwNAAAAAAAA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9p4xY8asc473L4AmVk1JeuCBB6o7depUnaTOnz333LN6xowZzV0m8D5R31703p8BAwbUu8bq1aurzzzzzAbnn3nmmdWrV6/efA8GlLSG9pMhQ4Y0ep2m2p+mT59eveeee9a7RqdOnaoffPDBjXxqYGvQFPvXrbfe2uh3tFtvvbXBtexfQGMceeSRjdpzTj311Orly5c3uJb3L2Bzaqr9y/sXsLn96U9/atSe07Vr1+qHH3643nW8ewGbW1PsX969gC3JX//61+ry8vIae8fo0aPrHe/9C2DTKA8l59lnn81JJ52UJUuWpH379vmP//iPDBo0KEuXLs3vfve7/OIXv8jf//73HHPMMXnqqafSvn375i4ZeJ84++yzc84559Tb365du3r7LrrooowcOTJJ0q9fv1xwwQXZbbfdMmPGjFx11VWZPHlyRo4cmW7duuWyyy5r8tqBrVuPHj3St2/fPPLII+s9tyn2p0WLFuVTn/pU/v73vydJzjjjjJx88slp06ZNRo8enR/96EdZuHBhTjzxxDzxxBP5wAc+sOEPC2xVNmb/WuN///d/071793r7Kysr6+2zfwGNNWfOnCRJ9+7dc+KJJ+aII47IzjvvnFWrVuWJJ57I1VdfnTlz5uTXv/51qqqq8tvf/rbetbx/AZtTU+5fa3j/AjaXHj16ZNCgQdl///3To0eP7Ljjjlm9enVmz56du+66K3fffXfmz5+fY489Nk899VSde4Z3L6A5NMX+tYZ3L6A5rV69OmeccUaqqqqy3XbbZd68eeuc4/0LYBNp7jQ262/gwIHVSarLy8urH3/88Vr9V111VfG3fC699NJmqBB4v1mz51x88cUbNP/FF18s/qbkAQccUL1kyZIa/YsXL64+4IADinvf9OnTm6BqYGv3/e9/v/r++++vnjt3bnV1dXX1zJkzi/tVY09Wbar96eKLLy7e+6qrrqrV//jjjxfvM2jQoPV7UGCr0xT719qn48ycOXODa7F/AY11zDHHVI8aNaq6qqqqzv433nijunfv3sU9Zdy4cXWO8/4FbG5NtX95/wI2t/r2rbXdc889xT3lhBNOqNXv3QtoDk2xf3n3ArYU1157bXWS6j59+lT/x3/8xzpPhvb+BbDplDVZqprN4qmnnsqYMWOSJMOGDcuhhx5aa8y3vvWt9O3bN0ly3XXXZeXKlZuzRID1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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "bh = LatticeBoltzmannBoundaryHandling(method, dh, src.name, name=\"bh\")\n", "\n", "inflow = UBB(initial_velocity)\n", "outflow = ExtrapolationOutflow(stencil[4], method)\n", "wall = NoSlip(\"wall\")\n", "# obstacle = NoSlip(\"obstacle\")\n", "# obstacle = NoSlipLinearBouzidi(\"obstacle\", init_wall_distance=init_wall_distance)\n", "obstacle = QuadraticBounceBack(omega, \"obstacle\", init_wall_distance=init_wall_distance)\n", "\n", "bh.set_boundary(inflow, slice_from_direction('W', dim))\n", "bh.set_boundary(outflow, slice_from_direction('E', dim))\n", "for direction in ('N', 'S'):\n", " bh.set_boundary(wall, slice_from_direction(direction, dim))\n", "\n", "bh.set_boundary(obstacle, mask_callback=set_sphere)\n", "\n", "plt.figure(dpi=200)\n", "plt.boundary_handling(bh)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "def timeloop(timeSteps):\n", " for i in range(timeSteps):\n", " bh()\n", " dh.run_kernel(kernel)\n", " dh.swap(src.name, dst.name)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mask = np.fromfunction(set_sphere, (domain_size[0], domain_size[1], len(domain_size)))\n", "if 'is_test_run' not in globals():\n", " timeloop(50000) # initial steps\n", "\n", " def run():\n", " timeloop(50)\n", " return np.ma.array(dh.gather_array('velField'), mask=mask)\n", "\n", " animation = plt.vector_field_magnitude_animation(run, frames=600, rescale=True)\n", " set_display_mode('video')\n", " res = display_animation(animation)\n", "else:\n", " timeloop(10)\n", " res = None\n", "res" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.4" } }, "nbformat": 4, "nbformat_minor": 2 }