diff --git a/python/lbmpy_walberla/packing_kernels.py b/python/lbmpy_walberla/packing_kernels.py index d5caad4e97d4f45187b1e9321810f8f99fea76ed..8a8728031cd4eb56ba4366e25ef6fd85b1f2e1b5 100644 --- a/python/lbmpy_walberla/packing_kernels.py +++ b/python/lbmpy_walberla/packing_kernels.py @@ -99,7 +99,7 @@ class PackingKernelsCodegen: self.dst_field = dst_field if dst_field else fields(f'pdfs_dst({stencil.Q}) :{self.data_type}[{stencil.D}D]') self.accessors = [get_accessor(streaming_pattern, t) for t in get_timesteps(streaming_pattern)] - self.mask_field = fields(f'mask : uint32 [{self.dim}D]') + self.mask_field = fields(f'mask : uint32 [{self.dim}D]', layout=src_field.layout) def create_uniform_kernel_families(self, kernels_dict=None): kernels = dict() if kernels_dict is None else kernels_dict diff --git a/python/lbmpy_walberla/storage_specification.py b/python/lbmpy_walberla/storage_specification.py index a07c619b373420b27f2e2b53c119afd6598a6f9c..60fd96d242bdf0c9513a1ff3d7d99efdc5898ec3 100644 --- a/python/lbmpy_walberla/storage_specification.py +++ b/python/lbmpy_walberla/storage_specification.py @@ -14,6 +14,7 @@ from pystencils_walberla.cmake_integration import CodeGenerationContext from pystencils_walberla.jinja_filters import add_pystencils_filters_to_jinja_env from pystencils_walberla.utility import config_from_context from lbmpy_walberla.packing_kernels import PackingKernelsCodegen +from lbmpy_walberla.utility import create_pdf_field def generate_lbm_storage_specification(generation_context: CodeGenerationContext, class_name: str, @@ -36,26 +37,28 @@ def generate_lbm_storage_specification(generation_context: CodeGenerationContext default_dtype = config.data_type.default_factory() if issubclass(default_dtype.numpy_dtype.type, np.float64): - constant_suffix = "" data_type_string = "double" elif issubclass(default_dtype.numpy_dtype.type, np.float32): - constant_suffix = "f" data_type_string = "float" elif issubclass(default_dtype.numpy_dtype.type, np.float16): - constant_suffix = "" data_type_string = "half" else: raise ValueError(f"default datatype {default_dtype.numpy_dtype.type} is not supported. " f"Supported are only np.float64, np.float32 and np.float16") symbolic_field = lbm_optimisation.symbolic_field - assert symbolic_field, "The symbolic pdf field must be added to LBMOptimisation as symbolic_field" + if not symbolic_field: + symbolic_field = create_pdf_field(config=config, name="pdfs_src", stencil=stencil, + field_layout=lbm_optimisation.field_layout) + if is_inplace(streaming_pattern): - symbolic_temporary_field = symbolic_field.new_field_with_different_name("pdfs_tmp") + symbolic_temporary_field = create_pdf_field(config=config, name="pdfs_dst", stencil=stencil, + field_layout=lbm_optimisation.field_layout) else: - assert lbm_optimisation.symbolic_temporary_field, \ - "The destination field must be added to LBMOptimisation as symbolic_temporary_field" symbolic_temporary_field = lbm_optimisation.symbolic_temporary_field + if not symbolic_temporary_field: + symbolic_temporary_field = create_pdf_field(config=config, name="pdfs_dst", stencil=stencil, + field_layout=lbm_optimisation.field_layout) cg = PackingKernelsCodegen(stencil, streaming_pattern, class_name, config, src_field=symbolic_field, dst_field=symbolic_temporary_field) diff --git a/python/lbmpy_walberla/sweep_collection.py b/python/lbmpy_walberla/sweep_collection.py index 7aed4a33b57755930ea67ded7764c6613688394e..22770379c23ec586ef92b947546623457ca74fff 100644 --- a/python/lbmpy_walberla/sweep_collection.py +++ b/python/lbmpy_walberla/sweep_collection.py @@ -18,6 +18,7 @@ from lbmpy.updatekernels import create_lbm_kernel, create_stream_only_kernel from pystencils_walberla.kernel_selection import KernelCallNode, KernelFamily from pystencils_walberla.utility import config_from_context from pystencils_walberla import generate_sweep_collection +from lbmpy_walberla.utility import create_pdf_field from .alternating_sweeps import EvenIntegerCondition from .function_generator import kernel_family_function_generator @@ -46,10 +47,16 @@ def generate_lbm_sweep_collection(ctx, class_name: str, collision_rule: LbmColli config.cpu_vectorize_info['assume_inner_stride_one'] = False src_field = lbm_optimisation.symbolic_field + if not src_field: + src_field = create_pdf_field(config=config, name="pdfs", stencil=lbm_config.stencil, + field_layout=lbm_optimisation.field_layout) if is_inplace(streaming_pattern): dst_field = src_field else: dst_field = lbm_optimisation.symbolic_temporary_field + if not dst_field: + dst_field = create_pdf_field(config=config, name="pdfs_tmp", stencil=lbm_config.stencil, + field_layout=lbm_optimisation.field_layout) config = replace(config, ghost_layers=0) diff --git a/python/lbmpy_walberla/utility.py b/python/lbmpy_walberla/utility.py index 1289c381e7b50ac7e83d34fca887e6d659959b92..75460d5f9458104e02f21ba52d54acbb261628b7 100644 --- a/python/lbmpy_walberla/utility.py +++ b/python/lbmpy_walberla/utility.py @@ -1,4 +1,8 @@ +import numpy as np +from pystencils import CreateKernelConfig, fields + from lbmpy.advanced_streaming import Timestep +from lbmpy.stencils import LBStencil def timestep_suffix(timestep: Timestep): @@ -9,3 +13,9 @@ def timestep_suffix(timestep: Timestep): """ return ("_" + str(timestep)) if timestep != Timestep.BOTH else '' + +def create_pdf_field(config: CreateKernelConfig, name: str, stencil: LBStencil, field_layout: str = 'fzyx'): + default_dtype = config.data_type.default_factory() + data_type = default_dtype.numpy_dtype + return fields(f'{name}({stencil.Q}) :{data_type}[{stencil.D}D]', layout=field_layout) + diff --git a/python/lbmpy_walberla/walberla_lbm_package.py b/python/lbmpy_walberla/walberla_lbm_package.py index fd9f4500bf7dc7516c2bb09c048879ebe1673b7f..80b37a4a90f717e79ea60890a802a363c45dde52 100644 --- a/python/lbmpy_walberla/walberla_lbm_package.py +++ b/python/lbmpy_walberla/walberla_lbm_package.py @@ -51,7 +51,7 @@ def generate_lbm_package(ctx: CodeGenerationContext, name: str, **kernel_parameters) spatial_shape = None - if lbm_optimisation.symbolic_field.has_fixed_shape: + if lbm_optimisation.symbolic_field and lbm_optimisation.symbolic_field.has_fixed_shape: spatial_shape = lbm_optimisation.symbolic_field.spatial_shape + (lbm_config.stencil.Q, ) generate_boundary_collection(ctx, f'{name}BoundaryCollection', boundary_generators=boundaries, diff --git a/tests/lbm_generated/Example.py b/tests/lbm_generated/Example.py index 5233639be24c6574cee6440300bfe73e22e5e2ae..c4e3eaa96d596b2745811e30739790748740f884 100644 --- a/tests/lbm_generated/Example.py +++ b/tests/lbm_generated/Example.py @@ -23,7 +23,8 @@ with CodeGeneration() as ctx: omega = sp.symbols("omega") stencil = LBStencil(Stencil.D3Q19) - pdfs, vel_field = fields(f"pdfs({stencil.Q}), velocity({stencil.D}): {data_type}[{stencil.D}D]", layout='fzyx') + pdfs, vel_field = fields(f"pdfs({stencil.Q}), velocity({stencil.D}): {data_type}[{stencil.D}D]", + layout='fzyx') macroscopic_fields = {'velocity': vel_field}