test_sparse_lbm.ipynb 116 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from lbmpy.session import *\n",
    "from lbmpy.sparse import *\n",
    "from pystencils.field import FieldType\n",
    "import pycuda.gpuarray as gpuarray\n",
    "\n",
    "import pystencils as ps"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Sparse (list based) LBM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "domain_size = (20, 20)\n",
    "omega = 1.8\n",
    "target = 'cpu'\n",
    "\n",
    "ghost_layers = 1\n",
    "arr_size = tuple(ds + 2 * ghost_layers for ds in domain_size)\n",
    "lid_velocity = 0.01\n",
    "force = 1e-6\n",
    "\n",
Martin Bauer's avatar
Martin Bauer committed
39
    "channel = True\n",
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
    "if channel:\n",
    "    kwargs={'force': (force, 0)}\n",
    "else:\n",
    "    kwargs = {}\n",
    "\n",
    "method = create_lb_method(stencil='D2Q9', relaxation_rate=omega, compressible=False, **kwargs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
55
      "image/png": "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\n",
56
57
58
59
      "text/plain": [
       "<Figure size 1152x432 with 2 Axes>"
      ]
     },
Martin Bauer's avatar
Martin Bauer committed
60
61
62
     "metadata": {
      "needs_background": "light"
     },
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
     "output_type": "display_data"
    }
   ],
   "source": [
    "ubb = UBB( (lid_velocity, 0) )\n",
    "noslip = NoSlip()\n",
    "flags = {\n",
    "    'fluid': 1, \n",
    "    noslip: 2,\n",
    "    ubb: 4,\n",
    "}\n",
    "flag_arr = np.zeros(arr_size, dtype=np.uint16)\n",
    "flag_arr.fill(flags['fluid'])\n",
    "\n",
    "if channel:\n",
    "    flag_arr[0, :] = 0\n",
    "    flag_arr[-1, :] = 0   \n",
    "    flag_arr[:, 0] = flags[noslip]\n",
    "    flag_arr[:, -1] = flags[noslip]\n",
    "else:\n",
    "    flag_arr[:, -1] = flags[ubb]\n",
    "    flag_arr[:, 0] = flags[noslip]\n",
    "    flag_arr[0, :] = flags[noslip]\n",
    "    flag_arr[-1, :] = flags[noslip]\n",
    "\n",
    "plt.scalar_field(flag_arr)\n",
    "plt.colorbar();"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Mappings"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "mapping = SparseLbMapper(method.stencil, flag_arr, flags['fluid'], flags[noslip], flags[ubb])\n",
    "index_arr = mapping.create_index_array(ghost_layers)\n",
    "\n",
    "# Arrays\n",
    "#index_arr = index_arr_linear.reshape([len(method.stencil), mapping.num_fluid_cells])\n",
    "#index_arr = index_arr.swapaxes(0, 1)\n",
    "\n",
    "pdf_arr = np.empty((len(mapping), len(method.stencil)), order='f')\n",
    "pdf_arr_tmp = np.empty_like(pdf_arr)\n",
    "\n",
    "vel_arr = np.ones([mapping.num_fluid_cells, method.dim], order='f')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "pdf_field, pdf_field_tmp, vel_field = ps.fields(\"f(9), d(9), u(2): [1D]\",\n",
    "                                                #f=pdf_arr[:mapping.num_fluid_cells],\n",
    "                                                #d=pdf_arr_tmp[:mapping.num_fluid_cells],\n",
    "                                                #u=vel_arr\n",
    "                                               )\n",
    "pdf_field.field_type = FieldType.CUSTOM\n",
    "pdf_field.pdf_field_tmp = FieldType.CUSTOM"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Macroscopic quantities"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "cqc = method.conserved_quantity_computation\n",
    "inp_eqs = cqc.equilibrium_input_equations_from_init_values()\n",
    "setter_eqs = method.get_equilibrium(conserved_quantity_equations=inp_eqs)\n",
    "setter_eqs = setter_eqs.new_with_substitutions({sym: pdf_field(i)\n",
    "                                                for i, sym in enumerate(method.post_collision_pdf_symbols)})\n",
    "kernel_initialize = ps.create_kernel(setter_eqs, ghost_layers=((0, 0),), ).compile()\n",
    "\n",
    "def init():\n",
    "    kernel_initialize(f=pdf_arr[:mapping.num_fluid_cells])\n",
    "init()\n",
    "\n",
    "\n",
    "getter_eqs = cqc.output_equations_from_pdfs(pdf_field.center_vector,\n",
    "                                            {'velocity': vel_field})\n",
    "kernel_compute_u = ps.create_kernel(getter_eqs, ghost_layers=((0,0),) ).compile()\n",
    "\n",
    "def get_velocity(arr=pdf_arr):\n",
    "    fluid_cell_arr = mapping.coordinates\n",
    "    kernel_compute_u(f=pdf_arr[:mapping.num_fluid_cells], u=vel_arr)\n",
    "    full_velocity_arr = np.zeros(flag_arr.shape + (2,), dtype=np.float64)\n",
    "    full_velocity_arr.fill(np.nan)\n",
    "    arr = fluid_cell_arr[:mapping.num_fluid_cells]\n",
    "    full_velocity_arr[arr['x'], arr['y']] = vel_arr\n",
    "    return full_velocity_arr[1:-1, 1:-1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Stream Collide Kernel"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
186
      "image/png": "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\n",
187
      "text/latex": [
188
       "$\\displaystyle \\left\\{ d_{0} : {{d}_{0}^{0}}, \\  d_{1} : {{d}_{0}^{1}}, \\  d_{2} : {{d}_{0}^{2}}, \\  d_{3} : {{d}_{0}^{3}}, \\  d_{4} : {{d}_{0}^{4}}, \\  d_{5} : {{d}_{0}^{5}}, \\  d_{6} : {{d}_{0}^{6}}, \\  d_{7} : {{d}_{0}^{7}}, \\  d_{8} : {{d}_{0}^{8}}, \\  f_{0} : {{f}_{0}^{0}}, \\  f_{1} : {{f}_{\\mathbf{{idx}_{0}^{0}}}^{0}}, \\  f_{2} : {{f}_{\\mathbf{{idx}_{0}^{1}}}^{0}}, \\  f_{3} : {{f}_{\\mathbf{{idx}_{0}^{2}}}^{0}}, \\  f_{4} : {{f}_{\\mathbf{{idx}_{0}^{3}}}^{0}}, \\  f_{5} : {{f}_{\\mathbf{{idx}_{0}^{4}}}^{0}}, \\  f_{6} : {{f}_{\\mathbf{{idx}_{0}^{5}}}^{0}}, \\  f_{7} : {{f}_{\\mathbf{{idx}_{0}^{6}}}^{0}}, \\  f_{8} : {{f}_{\\mathbf{{idx}_{0}^{7}}}^{0}}\\right\\}$"
189
190
191
      ],
      "text/plain": [
       "{d₀: d_C__0, d₁: d_C__1, d₂: d_C__2, d₃: d_C__3, d₄: d_C__4, d₅: d_C__5, d₆: d\n",
192
193
194
       "_C__6, d₇: d_C__7, d₈: d_C__8, f₀: f_C__0, f₁: f_61b5837354b0, f₂: f_36af0df24\n",
       "bba, f₃: f_d214085c20d0, f₄: f_06c0d23f3496, f₅: f_5310e9cbaf08, f₆: f_cfd14fa\n",
       "00661, f₇: f_d120c0b13b57, f₈: f_675ebfd3380f}"
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#index_field = ps.Field.create_from_numpy_array(\"idx\", index_arr, index_dimensions=1)\n",
    "index_field = ps.Field.create_generic(\"idx\", spatial_dimensions=1, index_dimensions=1, dtype=index_arr.dtype)\n",
    "\n",
    "collision_rule = method.get_collision_rule()\n",
    "\n",
    "Q = len(method.stencil)\n",
    "symbol_subs = {sym: pdf_field.absolute_access((index_field(i-1),),()) \n",
    "               for i, sym in enumerate(method.pre_collision_pdf_symbols)}\n",
    "\n",
    "symbol_subs.update({sym: pdf_field_tmp(i) for i, sym in enumerate(method.post_collision_pdf_symbols)})\n",
    "\n",
    "symbol_subs[method.pre_collision_pdf_symbols[0]] = pdf_field(0) # special case for center\n",
    "symbol_subs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "collision_rule = method.get_collision_rule()\n",
    "update_rule = collision_rule.new_with_substitutions(symbol_subs)\n",
    "kernel_stream_collide = ps.create_kernel(update_rule, ghost_layers=[(0,0)], target=target).compile()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Boundary Kernels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "if not channel:\n",
    "    if target == 'gpu':\n",
    "        raise NotImplementedError(\"UBB on GPU not working yet\")\n",
    "        \n",
    "    ubb_mapper = SparseLbBoundaryMapper(ubb, method, pdf_field)\n",
Martin Bauer's avatar
Martin Bauer committed
247
248
249
    "    #TODO the following line is wrong: kernel contains accesses to index_field and pdf_field which have \n",
    "    #different size: a correct kernel comes out when by change the shape is taken from index field, \n",
    "    # when taken from pdf field, a wrong kernel is generated\n",
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
    "    ubb_kernel = ps.create_kernel(ubb_mapper.assignments(), ghost_layers=0).compile()\n",
    "    ubb_idx_arr = ubb_mapper.create_index_arr(mapping, flags[ubb])\n",
    "    ps.show_code(ubb_kernel.ast)\n",
    "    def handle_ubb():\n",
    "        ubb_kernel(indexField=ubb_idx_arr, f=pdf_arr[:mapping.num_fluid_cells])\n",
    "else:\n",
    "    def handle_ubb():\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Time Loop"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def time_step():\n",
    "    global pdf_arr, pdf_arr_tmp, index_arr\n",
    "    handle_ubb()\n",
    "    if target == 'gpu':\n",
    "        gpu_pdf_arr = gpuarray.to_gpu(pdf_arr)\n",
    "        gpu_pdf_arr_tmp = gpuarray.to_gpu(pdf_arr_tmp)\n",
    "        gpu_index_arr = gpuarray.to_gpu(index_arr)\n",
Martin Bauer's avatar
Martin Bauer committed
280
    "        \n",
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
    "        kernel_stream_collide(f=gpu_pdf_arr[:mapping.num_fluid_cells], \n",
    "                          d=gpu_pdf_arr_tmp[:mapping.num_fluid_cells], \n",
    "                          idx=gpu_index_arr)\n",
    "    \n",
    "        pdf_arr = gpu_pdf_arr.get()\n",
    "        pdf_arr_tmp = gpu_pdf_arr_tmp.get()\n",
    "        index_arr = gpu_index_arr.get()\n",
    "    else:\n",
    "        kernel_stream_collide(f=pdf_arr[:mapping.num_fluid_cells], \n",
    "                              d=pdf_arr_tmp[:mapping.num_fluid_cells], \n",
    "                              idx=index_arr)\n",
    "    pdf_arr_tmp, pdf_arr = pdf_arr, pdf_arr_tmp\n",
    "\n",
    "def run(steps=100):\n",
    "    for t in range(steps):\n",
    "        time_step()\n",
    "    return get_velocity()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
Martin Bauer's avatar
Martin Bauer committed
304
305
306
307
308
309
310
311
312
   "outputs": [],
   "source": [
    "init()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
313
314
315
   "outputs": [
    {
     "data": {
316
      "image/png": "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WoXMzEzo9Xq7s2fPnsXChQtRUlLiUNvp6enYuHEjqqur7c6KCD777DPs27fPobb379+PlStX4uzZsw7lU1JSsG3bNofqVlFRgQULFuDo0aMOtZ2RkYENGzbgwoULdmdFBIsXL8aePXvgyL+bfuDAASxfvhxnzpyxOwsAa9aswdatWx2qW1VVFebPn4+ioiKH2v7111+xbt06nD9/3qH8kiVLkJub61Ddjhw5gmXLlqGsrMyhtteuXYuMjAzU1tY6lCciakkOT1CVUhoASQDiAMQAeFgpFdPssDgAUfWPcQDmOtoeEZGzaN26NZYuXYrQ0FD0798f77zzDnbu3GnzB9Hw8HDExsYiKCgIo0ePxpIlS1BaWmpTVimFAwcOICoqCl26dMGLL76I9PR01NTU2JSPjIzEpEmToNPpcNddd+Gjjz7C4cOHbcoCgKurK2655RaEh4dj3LhxWL16NSorK23K+vn54euvv0ZYWBj69u2Lt99+G9nZ2TbXrX379oiPj4dOp8MDDzyAzz//HCdPnrQpq5RCYWEhoqOjER0djRdeeAGbN2+2uW4RERF48cUXodPp8Ne//hUffvghDh48aFMWADw8PNC3b1+0bdsWTz75JL755htUVFTYlPX29sa6devQpk0b3HLLLZg+fTqysrJsrltERATuvfde6HQ6jBw50q6TK0opHDt2DF26dEGnTp0wefJku06udOjQAa+//jp0Oh3uvPNOfPDBB/jjjz9sygKAr68vbr31VoSFhWHs2LF2nVzx9PREWloawsPD0atXL7z55pt2nVyJjIzEqFGjoNPpcN9999l9cuXUqVPo2rUrOnbsiEmTJtl1ciU8PBwzZ85EUFAQ7rjjDsyePduukysBAQG47bbbEBoaijFjxlzSyRUioqtORBx6ALgVwPomz6cBmNbsmE8APNzk+V4AYdb+7F69egkRkbNKS0sTrVYrAAweHTp0kAkTJkhqaqqcP3/ebH7cuHGi0WgMsi4uLnL77bdLYmKi5OXlmc2WlZVJUFCQUdutW7eWRx99VL744gs5ffq02fzHH38snp6eRvlu3brJtGnTJCMjQ2pra83mBwwYYJT18PCQ4cOHy9y5c6WwsNBsNiMjw2Td2rVrJ08//bSsXbtWqqqqzOYnTpworq6uRnW77bbbZObMmbJ7926z2crKSpN18/f3l4cffliWLl0qp06dMpufP3++eHl5GeVjYmJk6tSp8tNPP0lNTY3Z/JAhQ4yyrVq1kri4OElKSpIjR46YzWZmZoq/v79Rvm3btjJ+/Hj59ttvpbKy0mx+8uTJ4ubmZpBVSsmtt94qM2bMkJycHLPZmpoaCQ4ONmpbq9XKQw89JMnJyVJaWmo2//nnn4u3t7dRvnPnzjJlyhT58ccfLdYtLi7OKOvu7i6xsbEyZ84cOXTokNlsTk6OBAQEGOXDwsLkqaeekpSUFKmoqDCbnzZtmri7uxvl+/TpI2+99ZZkZWWJXq83mw8PDzfK+vr6yqhRo2Tx4sVy4sQJs9kvv/xSfHx8jPKdOnWS559/XtLS0uTixYtm8yNGjDDKurm5ydChQ+V///ufHDhwwGyWiOhqAJApZuaCl3KJb1sABU2eF9a/Zu8xAACl1DilVKZSKvPEiROX0C0ioitLo9HA3d3d6HU/Pz9otVpotVq4urqazXt6esLFxfDXr7u7e2Pe19fXbFYpBU9PT6PXvb29odVq4efnh1atWpnNu7u7w83NzeA1FxcXg74rpczmvby8jF7z8PBozJt6v4FGozHZt6ZtN+9bU6bq5ubmZlPdzPW9oW5arRYeHh5ms6bqppRqzGq1WqO+NW+nuaZ1M/V+A41GY7JvDVk/Pz+LdfPw8LBYNz8/P7NZwHTdvLy8GvNXsm6m2m7VqlVj1pG6+fr6Nvbd1M9xA3N1a9p3e39WvLy8GrOmfo6btmPqe9rw/dJqtdBoNBbbbt43W+tGRNTizM1crT0APABgfpPnjwOY0+yY7wAMaPJ8E4Be1v5srqASkTPT6/UycOBAcXd3l7vuuks++ugjOXjwoM35vLw8UUo1ruSsXr3a4kpOc1OmTDFYydmxY4fFlZymKisrJTQ0VHx9feWBBx6wupLT3IoVKwxWcjZv3mxxJae52NhYg5WcP/74w+Zsfn6+aDQaCQkJkX/84x/yzTffyLlz52zOv/rqqwJAevfuLf/5z3/k999/t7lu58+fl3bt2omPj4+MHDlSPvvsMzl27JjNba9evVoASMeOHeW5556TH374Qaqrq23OJyQkiKurqwwZMkTef/99yc/Ptzl7+PBhcXNzk+DgYBk7dqx89dVXcvbsWZvzb731lgCQnj17yhtvvCGZmZkWV9mbqq6ulsjISPH29pYRI0bIggULpKSkxOa2169fLwAkMjJSJk2aJN9//71cuHDB5vyoUaNEo9HI4MGD5b333pO9e/fanC0uLhYPDw/R6XTyxBNPyIoVK+TMmTM252fNmiUApHv37vLaa6/Jr7/+anPdampqpHPnzuLp6Sn33HOPfPrpp1JcXGxz25s3b268qmPixImyfv16i1d1EBFdbbCwgmr+FL91hQDaNXkeDqDYgWOIiK4pZWVlmDRpEr799lurq3amlJaWYtu2bejZs6fF1SNTpO4kHo4ePYrQ0FC72y4oKEBycjIGDhxocfXIHC8vL+zduxedOnWyO3v27Fk89dRTWLFihdVVO1NOnDiBjIwM9O7d26G6devWDUVFRWjTpo3dbRcWFmL+/PkYNGiQxRVqc9zc3JCXl4fo6GiLq26mVFRU4LHHHkNycjK0Wq3dbZeUlODHH39Enz59HKpbdHQ0CgsL0batyQugLCoqKkJSUhIGDx5scaXVkt27d6NLly52162qqgqjRo3CvHnzEBAQYHe7xcXF2LRpE/r27WtxtdKcG264AUeOHEG7du2sH2yi7XfffRdDhgyxuNJqTk1NDXbu3ImuXbvaXTciopamxIHd5QBAKeUKYB+AOwEUAfgNwCMisrvJMcMBTAQQD6AvgA9FpI+1P7t3796SmZnpUL+IiIiIiIjIeSmltotIb1PvObyCKiI1SqmJANYD0ABYKCK7lVL/rH///wCsRd3kNB9AJYCxjrZHRERERERE17dLucQXIrIWdZPQpq/9X5OvBcCES2mDiIiIiIiI/hwuZRdfIiIiIiIiosuGE1QiIiIiIiJyCpygEhERERERkVPgBJWIiIiIiIicAieoRERERERE5BQ4QSUiIiIiIiKnwAkqEREREREROQVOUImIiIiIiMgpcIJKRERERERETkGJSEv3wYhS6gSAwy3dD7rm6ACcbOlO0J8GxxtdTRxvdDVxvNHVxPH259RBRIJMveGUE1QiRyilMkWkd0v3g/4cON7oauJ4o6uJ442uJo43ao6X+BIREREREZFT4ASViIiIiIiInAInqHQ9mdfSHaA/FY43upo43uhq4nijq4njjQzwHlQiIiIiIiJyClxBJSIiIiIiIqfACSpd05RSDyildiul9Eqp3s3em6aUyldK7VVK3dVSfaTri1JqWP2YyldKvdTS/aHrj1JqoVLquFJqV5PXWiulvldK7a//b0BL9pGuD0qpdkqpNKVUXv3fpZPqX+d4o8tOKeWhlNqmlMquH2//qX+d440McIJK17pdAO4H8GPTF5VSMQBGA+gKYBiAj5VSmqvfPbqe1I+hJABxAGIAPFw/1ogup0Wo+73V1EsANolIFIBN9c+JLlUNgOdFpAuAfgAm1P9O43ijK+ECgCEicjOA7gCGKaX6geONmuEEla5pIpInIntNvHUvgC9E5IKIHASQD6DP1e0dXYf6AMgXkQMiUg3gC9SNNaLLRkR+BHCq2cv3Alhc//ViACOuaqfouiQiR0Xk9/qvywHkAWgLjje6AqTOufqnbvUPAccbNcMJKl2v2gIoaPK8sP41okvBcUUtJUREjgJ1kwoAwS3cH7rOKKUiAPQA8Cs43ugKUUpplFI7ABwH8L2IcLyREdeW7gCRNUqpjQBCTbz1ioikmIuZeI1bVtOl4rgiouuOUsoHwFcA/i0iZ5Uy9auO6NKJSC2A7kopfwBfK6Vuauk+kfPhBJWcnogMdSBWCKBdk+fhAIovT4/oT4zjilrKMaVUmIgcVUqFoW71geiSKaXcUDc5XSoiq+pf5nijK0pETiulNqPufnuONzLAS3zperUawGilVCul1A0AogBsa+E+0bXvNwBRSqkblFLuqNuIa3UL94n+HFYDGFP/9RgA5q4eIbKZqlsqXQAgT0RmN3mL440uO6VUUP3KKZRSngCGAtgDjjdqRonw6jS6diml7gMwB0AQgNMAdojIXfXvvQLg76jbpfDfIrKuxTpK1w2lVDyADwBoACwUkRkt3CW6ziillgEYDEAH4BiANwB8A2A5gPYAjgB4QESab6REZBel1AAA6QB2AtDXv/wy6u5D5Xijy0op9RfUbYKkQd0i2XIRma6UCgTHGzXBCSoRERERERE5BV7iS0RERERERE6BE1QiIiIiIiJyCpygEhERERERkVPgBJWIiIiIiIicAieoRERERERE5BQ4QSUiIiIiIiKnwAkqEREREREROQVOUImIiIiIiMgp/D9l68WO1yN6OQAAAABJRU5ErkJggg==\n",
317
318
319
320
      "text/plain": [
       "<Figure size 1152x432 with 1 Axes>"
      ]
     },
Martin Bauer's avatar
Martin Bauer committed
321
322
323
     "metadata": {
      "needs_background": "light"
     },
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
     "output_type": "display_data"
    }
   ],
   "source": [
    "init()\n",
    "result = run(100)\n",
    "plt.vector_field(result, step=1);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Check against reference"
   ]
  },
  {
   "cell_type": "code",
Martin Bauer's avatar
Martin Bauer committed
342
   "execution_count": 13,
343
344
345
346
347
348
349
350
351
352
353
354
355
   "metadata": {},
   "outputs": [],
   "source": [
    "if channel:\n",
    "    reference = create_channel(domain_size, force=force, lb_method=method)\n",
    "else:\n",
    "    reference = create_lid_driven_cavity(domain_size, relaxation_rate=omega, lid_velocity=lid_velocity,\n",
    "                                         compressible=False)\n",
    "reference.run(100)"
   ]
  },
  {
   "cell_type": "code",
Martin Bauer's avatar
Martin Bauer committed
356
   "execution_count": 14,
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
   "metadata": {},
   "outputs": [],
   "source": [
    "np.testing.assert_almost_equal(reference.velocity[:, :], result)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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",
380
   "version": "3.8.2"
381
382
383
384
385
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}