test_boundary_indexlist_creation.py 5.21 KB
 1 2 3 4 5 6 ``````import numpy as np from itertools import product import pystencils.boundaries.createindexlist as cil import pytest `````` Markus Holzer committed Oct 26, 2021 7 `````` `````` 8 9 10 11 ``````@pytest.mark.parametrize('single_link', [False, True]) @pytest.mark.skipif(not cil.cython_funcs_available, reason='Cython functions are not available') def test_equivalence_cython_python_version(single_link): # D2Q9 `````` Markus Holzer committed Oct 26, 2021 12 `````` stencil_2d = tuple((x, y) for x, y in product([-1, 0, 1], [-1, 0, 1])) `````` 13 `````` # D3Q19 `````` Markus Holzer committed Oct 26, 2021 14 15 `````` stencil_3d = tuple( (x, y, z) for x, y, z in product([-1, 0, 1], [-1, 0, 1], [-1, 0, 1]) if abs(x) + abs(y) + abs(z) < 3) `````` 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 `````` for dtype in [int, np.int16, np.uint32]: fluid_mask = dtype(1) mask = dtype(2) flag_field_2d = np.ones([15, 16], dtype=dtype) * fluid_mask flag_field_3d = np.ones([15, 16, 17], dtype=dtype) * fluid_mask flag_field_2d[0, :] = mask flag_field_2d[-1, :] = mask flag_field_2d[7, 7] = mask flag_field_3d[0, :, :] = mask flag_field_3d[-1, :, :] = mask flag_field_3d[7, 7, 7] = mask `````` Markus Holzer committed Jun 18, 2021 31 32 `````` result_python_2d = cil._create_index_list_python(flag_field_2d, mask, fluid_mask, stencil_2d, single_link, True, 1) `````` 33 `````` `````` Markus Holzer committed Jun 18, 2021 34 35 `````` result_python_3d = cil._create_index_list_python(flag_field_3d, mask, fluid_mask, stencil_3d, single_link, True, 1) `````` 36 37 38 39 40 41 42 43 44 `````` result_cython_2d = cil.create_boundary_index_list(flag_field_2d, stencil_2d, mask, fluid_mask, 1, True, single_link) result_cython_3d = cil.create_boundary_index_list(flag_field_3d, stencil_3d, mask, fluid_mask, 1, True, single_link) np.testing.assert_equal(result_python_2d, result_cython_2d) np.testing.assert_equal(result_python_3d, result_cython_3d) `````` Markus Holzer committed Oct 26, 2021 45 `````` `````` 46 47 48 49 ``````@pytest.mark.parametrize('single_link', [False, True]) @pytest.mark.skipif(not cil.cython_funcs_available, reason='Cython functions are not available') def test_equivalence_cell_idx_list_cython_python_version(single_link): # D2Q9 `````` Markus Holzer committed Oct 26, 2021 50 `````` stencil_2d = tuple((x, y) for x, y in product([-1, 0, 1], [-1, 0, 1])) `````` 51 `````` # D3Q19 `````` Markus Holzer committed Oct 26, 2021 52 53 `````` stencil_3d = tuple( (x, y, z) for x, y, z in product([-1, 0, 1], [-1, 0, 1], [-1, 0, 1]) if abs(x) + abs(y) + abs(z) < 3) `````` 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 `````` for dtype in [int, np.int16, np.uint32]: fluid_mask = dtype(1) mask = dtype(2) flag_field_2d = np.ones([15, 16], dtype=dtype) * fluid_mask flag_field_3d = np.ones([15, 16, 17], dtype=dtype) * fluid_mask flag_field_2d[0, :] = mask flag_field_2d[-1, :] = mask flag_field_2d[7, 7] = mask flag_field_3d[0, :, :] = mask flag_field_3d[-1, :, :] = mask flag_field_3d[7, 7, 7] = mask `````` Markus Holzer committed Jun 18, 2021 69 70 `````` result_python_2d = cil._create_index_list_python(flag_field_2d, mask, fluid_mask, stencil_2d, single_link, False) `````` 71 `````` `````` Markus Holzer committed Jun 18, 2021 72 73 `````` result_python_3d = cil._create_index_list_python(flag_field_3d, mask, fluid_mask, stencil_3d, single_link, False) `````` 74 75 76 77 78 79 80 81 `````` result_cython_2d = cil.create_boundary_index_list(flag_field_2d, stencil_2d, mask, fluid_mask, None, False, single_link) result_cython_3d = cil.create_boundary_index_list(flag_field_3d, stencil_3d, mask, fluid_mask, None, False, single_link) np.testing.assert_equal(result_python_2d, result_cython_2d) np.testing.assert_equal(result_python_3d, result_cython_3d) `````` Markus Holzer committed Jun 18, 2021 82 `````` `````` Markus Holzer committed Oct 26, 2021 83 `````` `````` Markus Holzer committed Jun 18, 2021 84 85 ``````@pytest.mark.parametrize('inner_or_boundary', [False, True]) def test_normal_calculation(inner_or_boundary): `````` Markus Holzer committed Oct 26, 2021 86 `````` stencil = tuple((x, y) for x, y in product([-1, 0, 1], [-1, 0, 1])) `````` Markus Holzer committed Jun 18, 2021 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 `````` domain_size = (32, 32) dtype = np.uint32 fluid_mask = dtype(1) mask = dtype(2) flag_field = np.ones([domain_size[0], domain_size[1]], dtype=dtype) * fluid_mask radius_inner = domain_size[0] // 4 radius_outer = domain_size[0] // 2 y_mid = domain_size[1] / 2 x_mid = domain_size[0] / 2 for x in range(0, domain_size[0]): for y in range(0, domain_size[1]): if (y - y_mid) ** 2 + (x - x_mid) ** 2 < radius_inner ** 2: flag_field[x, y] = mask if (x - x_mid) ** 2 + (y - y_mid) ** 2 > radius_outer ** 2: flag_field[x, y] = mask args_no_gl = (flag_field, mask, fluid_mask, np.array(stencil, dtype=np.int32), True) index_list = cil._create_index_list_python(*args_no_gl, inner_or_boundary=inner_or_boundary, nr_of_ghost_layers=1) checkmask = mask if inner_or_boundary else fluid_mask for cell in index_list: idx = cell[2] cell = tuple((cell[0], cell[1])) sum_cells = np.zeros(len(cell)) for dir_idx, direction in enumerate(stencil): neighbor_cell = tuple([cell_i + dir_i for cell_i, dir_i in zip(cell, direction)]) if any(not 0 <= e < upper for e, upper in zip(neighbor_cell, flag_field.shape)): continue if flag_field[neighbor_cell] & checkmask: sum_cells += np.array(direction) assert np.argmax(np.inner(sum_cells, stencil)) == idx``````