From 1386091a47ddaed05f5325a1e5e831ba2c3c5219 Mon Sep 17 00:00:00 2001 From: Markus Holzer <markus.holzer@fau.de> Date: Wed, 11 May 2022 11:54:40 +0200 Subject: [PATCH] Changed boundary dtype to int32 --- pystencils/boundaries/boundaryhandling.py | 10 +++++----- pystencils/boundaries/createindexlist.py | 13 ++++++++----- pystencils/cpu/kernelcreation.py | 4 ++-- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/pystencils/boundaries/boundaryhandling.py b/pystencils/boundaries/boundaryhandling.py index e9fe218b4..2be86510e 100644 --- a/pystencils/boundaries/boundaryhandling.py +++ b/pystencils/boundaries/boundaryhandling.py @@ -424,28 +424,28 @@ class BoundaryOffsetInfo(CustomCodeNode): code = "\n" for i in range(dim): offset_str = ", ".join([str(d[i]) for d in stencil]) - code += "const int64_t %s [] = { %s };\n" % (offset_sym[i].name, offset_str) + code += "const int32_t %s [] = { %s };\n" % (offset_sym[i].name, offset_str) inv_dirs = [] for direction in stencil: inverse_dir = tuple([-i for i in direction]) inv_dirs.append(str(stencil.index(inverse_dir))) - code += "const int64_t %s [] = { %s };\n" % (self.INV_DIR_SYMBOL.name, ", ".join(inv_dirs)) + code += "const int32_t %s [] = { %s };\n" % (self.INV_DIR_SYMBOL.name, ", ".join(inv_dirs)) offset_symbols = BoundaryOffsetInfo._offset_symbols(dim) super(BoundaryOffsetInfo, self).__init__(code, symbols_read=set(), symbols_defined=set(offset_symbols + [self.INV_DIR_SYMBOL])) @staticmethod def _offset_symbols(dim): - return [TypedSymbol(f"c{d}", create_type(np.int64)) for d in ['x', 'y', 'z'][:dim]] + return [TypedSymbol(f"c{d}", create_type(np.int32)) for d in ['x', 'y', 'z'][:dim]] - INV_DIR_SYMBOL = TypedSymbol("invdir", np.int64) + INV_DIR_SYMBOL = TypedSymbol("invdir", np.int32) def create_boundary_kernel(field, index_field, stencil, boundary_functor, target=Target.CPU, **kernel_creation_args): elements = [BoundaryOffsetInfo(stencil)] - dir_symbol = TypedSymbol("dir", np.int64) + dir_symbol = TypedSymbol("dir", np.int32) elements += [SympyAssignment(dir_symbol, index_field[0]('dir'))] elements += boundary_functor(field, direction_symbol=dir_symbol, index_field=index_field) config = CreateKernelConfig(index_fields=[index_field], target=target, **kernel_creation_args) diff --git a/pystencils/boundaries/createindexlist.py b/pystencils/boundaries/createindexlist.py index be8fee7e5..afa2d5a9f 100644 --- a/pystencils/boundaries/createindexlist.py +++ b/pystencils/boundaries/createindexlist.py @@ -25,12 +25,13 @@ except ImportError: boundary_index_array_coordinate_names = ["x", "y", "z"] direction_member_name = "dir" +default_index_array_dtype = np.int32 def numpy_data_type_for_boundary_object(boundary_object, dim): coordinate_names = boundary_index_array_coordinate_names[:dim] - return np.dtype([(name, np.int32) for name in coordinate_names] - + [(direction_member_name, np.int32)] + return np.dtype([(name, default_index_array_dtype) for name in coordinate_names] + + [(direction_member_name, default_index_array_dtype)] + [(i[0], i[1].numpy_dtype) for i in boundary_object.additional_data], align=True) @@ -45,7 +46,8 @@ def _create_index_list_python(flag_field_arr, boundary_mask, nr_of_ghost_layers = 0 coordinate_names = boundary_index_array_coordinate_names[:len(flag_field_arr.shape)] - index_arr_dtype = np.dtype([(name, np.int32) for name in coordinate_names] + [(direction_member_name, np.int32)]) + index_arr_dtype = np.dtype([(name, default_index_array_dtype) for name in coordinate_names] + + [(direction_member_name, default_index_array_dtype)]) # boundary cells are extracted via np.where. To ensure continous memory access in the compute kernel these cells # have to be sorted. @@ -117,9 +119,10 @@ def create_boundary_index_list(flag_field, stencil, boundary_mask, fluid_mask, """ dim = len(flag_field.shape) coordinate_names = boundary_index_array_coordinate_names[:dim] - index_arr_dtype = np.dtype([(name, np.int32) for name in coordinate_names] + [(direction_member_name, np.int32)]) + index_arr_dtype = np.dtype([(name, default_index_array_dtype) for name in coordinate_names] + + [(direction_member_name, default_index_array_dtype)]) - stencil = np.array(stencil, dtype=np.int32) + stencil = np.array(stencil, dtype=default_index_array_dtype) args = (flag_field, nr_of_ghost_layers, boundary_mask, fluid_mask, stencil, single_link) args_no_gl = (flag_field, boundary_mask, fluid_mask, stencil, single_link) diff --git a/pystencils/cpu/kernelcreation.py b/pystencils/cpu/kernelcreation.py index 8870e65b3..746e7b191 100644 --- a/pystencils/cpu/kernelcreation.py +++ b/pystencils/cpu/kernelcreation.py @@ -9,7 +9,7 @@ from pystencils.config import CreateKernelConfig from pystencils.enums import Target, Backend from pystencils.astnodes import Block, KernelFunction, LoopOverCoordinate, SympyAssignment from pystencils.cpu.cpujit import make_python_function -from pystencils.typing import StructType, TypedSymbol, create_type +from pystencils.typing import StructType, TypedSymbol, create_type, get_type_of_expression from pystencils.typing.transformations import add_types from pystencils.field import Field, FieldType from pystencils.node_collection import NodeCollection @@ -137,7 +137,7 @@ def create_indexed_kernel(assignments: Union[AssignmentCollection, NodeCollectio data_type = idx_field.dtype if data_type.has_element(name): rhs = idx_field[0](name) - lhs = TypedSymbol(name, np.int64) + lhs = TypedSymbol(name, data_type.get_element_type(name)) return SympyAssignment(lhs, rhs) raise ValueError(f"Index {name} not found in any of the passed index fields") -- GitLab