diff --git a/lbmpy/boundaries/boundaryhandling.py b/lbmpy/boundaries/boundaryhandling.py index 8a94802d0aa0dfe766913fcd0707a791b7fb9648..ccc8fb270d8de8cd67b51140a66808507c05ff06 100644 --- a/lbmpy/boundaries/boundaryhandling.py +++ b/lbmpy/boundaries/boundaryhandling.py @@ -2,12 +2,13 @@ import numpy as np import sympy as sp from lbmpy.advanced_streaming.indexing import BetweenTimestepsIndexing from lbmpy.advanced_streaming.utility import is_inplace, Timestep, AccessPdfValues -from pystencils import Field, Assignment, TypedSymbol, create_kernel +from pystencils import Assignment, Field, TypedSymbol, create_kernel from pystencils.stencil import inverse_direction from pystencils import CreateKernelConfig, Target from pystencils.boundaries import BoundaryHandling from pystencils.boundaries.createindexlist import numpy_data_type_for_boundary_object from pystencils.backends.cbackend import CustomCodeNode +from pystencils.simp import add_subexpressions_for_field_reads class LatticeBoltzmannBoundaryHandling(BoundaryHandling): @@ -194,13 +195,16 @@ def create_lattice_boltzmann_boundary_kernel(pdf_field, index_field, lb_method, boundary_assignments = boundary_functor(f_out, f_in, dir_symbol, inv_dir, lb_method, index_field) boundary_assignments = indexing.substitute_proxies(boundary_assignments) - # Code Elements inside the loop - elements = [Assignment(dir_symbol, index_field[0]('dir'))] - elements += boundary_assignments.all_assignments - config = CreateKernelConfig(index_fields=[index_field], target=target, default_number_int="int32", skip_independence_check=True, **kernel_creation_args) + default_data_type = config.data_type.default_factory() + if pdf_field.dtype != default_data_type: + boundary_assignments = add_subexpressions_for_field_reads(boundary_assignments, data_type=default_data_type) + + elements = [Assignment(dir_symbol, index_field[0]('dir'))] + elements += boundary_assignments.all_assignments + kernel = create_kernel(elements, config=config) # Code Elements ahead of the loop diff --git a/lbmpy/updatekernels.py b/lbmpy/updatekernels.py index 89cfa30f829e4a2426ba85246aeda5701fb02cef..31612dd4cde7c7d16b952c43ed4f98d2e9973e38 100644 --- a/lbmpy/updatekernels.py +++ b/lbmpy/updatekernels.py @@ -10,7 +10,8 @@ from pystencils.sympyextensions import fast_subs # -------------------------------------------- LBM Kernel Creation ----------------------------------------------------- -def create_lbm_kernel(collision_rule, src_field, dst_field=None, accessor=StreamPullTwoFieldsAccessor()): +def create_lbm_kernel(collision_rule, src_field, dst_field=None, accessor=StreamPullTwoFieldsAccessor(), + data_type=None): """Replaces the pre- and post collision symbols in the collision rule by field accesses. Args: @@ -19,6 +20,7 @@ def create_lbm_kernel(collision_rule, src_field, dst_field=None, accessor=Stream dst_field: field used for writing pdf values if accessor.is_inplace this parameter is ignored accessor: instance of PdfFieldAccessor, defining where to read and write values to create e.g. a fused stream-collide kernel See 'fieldaccess.PdfFieldAccessor' + data_type: If a datatype is given the field reads are isolated and written to TypedSymbols of type data_type Returns: LbmCollisionRule where pre- and post collision symbols have been replaced @@ -49,8 +51,9 @@ def create_lbm_kernel(collision_rule, src_field, dst_field=None, accessor=Stream new_split_groups.append([fast_subs(e, substitutions) for e in split_group]) result.simplification_hints['split_groups'] = new_split_groups - if accessor.is_inplace: - result = add_subexpressions_for_field_reads(result, subexpressions=True, main_assignments=True) + if accessor.is_inplace or (data_type is not None and src_field.dtype != data_type): + result = add_subexpressions_for_field_reads(result, subexpressions=True, main_assignments=True, + data_type=data_type) return result