UniformGridGPU.py 4.18 KB
Newer Older
Martin Bauer's avatar
Martin Bauer committed
1
import sympy as sp
2
import numpy as np
3
import pystencils as ps
Martin Bauer's avatar
Martin Bauer committed
4
5
from lbmpy.creationfunctions import create_lb_method, create_lb_update_rule
from lbmpy.boundaries import NoSlip, UBB
6
from lbmpy.fieldaccess import StreamPullTwoFieldsAccessor, StreamPushTwoFieldsAccessor
Martin Bauer's avatar
Martin Bauer committed
7
8
9
from pystencils_walberla import generate_pack_info_from_kernel
from lbmpy_walberla import generate_lattice_model, generate_boundary
from pystencils_walberla import CodeGeneration, generate_sweep
10
11
from pystencils.data_types import TypedSymbol
from pystencils.fast_approximation import insert_fast_sqrts, insert_fast_divisions
12
from lbmpy.macroscopic_value_kernels import macroscopic_values_getter, macroscopic_values_setter
Martin Bauer's avatar
Martin Bauer committed
13

14
omega = sp.symbols("omega")
15
16
17
18
19
20
21
22
compile_time_block_size = False

if compile_time_block_size:
    sweep_block_size = (128, 1, 1)
else:
    sweep_block_size = (TypedSymbol("cudaBlockSize0", np.int32),
                        TypedSymbol("cudaBlockSize1", np.int32),
                        1)
Martin Bauer's avatar
Martin Bauer committed
23

Martin Bauer's avatar
Martin Bauer committed
24
25
sweep_params = {'block_size': sweep_block_size}

26
options_dict = {
27
    'srt': {
Martin Bauer's avatar
Martin Bauer committed
28
29
        'method': 'srt',
        'stencil': 'D3Q19',
30
        'relaxation_rate': omega,
Martin Bauer's avatar
Martin Bauer committed
31
        'compressible': False,
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
    },
    'trt': {
        'method': 'trt',
        'stencil': 'D3Q19',
        'relaxation_rate': omega,
    },
    'mrt': {
        'method': 'mrt',
        'stencil': 'D3Q19',
        'relaxation_rates': [0, omega, 1.3, 1.4, omega, 1.2, 1.1],
    },
    'entropic': {
        'method': 'mrt3',
        'stencil': 'D3Q19',
        'compressible': True,
        'relaxation_rates': [omega, omega, sp.Symbol("omega_free")],
        'entropic': True,
    },
    'smagorinsky': {
        'method': 'srt',
        'stencil': 'D3Q19',
        'smagorinsky': True,
        'relaxation_rate': omega,
    }
}

with CodeGeneration() as ctx:
59
60
61
    accessor = StreamPullTwoFieldsAccessor()
    #accessor = StreamPushTwoFieldsAccessor()
    assert not accessor.is_inplace, "This app does not work for inplace accessors"
62
63
64

    common_options = {
        'field_name': 'pdfs',
Martin Bauer's avatar
Martin Bauer committed
65
        'temporary_field_name': 'pdfs_tmp',
66
        'kernel_type': accessor,
Martin Bauer's avatar
Martin Bauer committed
67
        'optimization': {'cse_global': True,
68
                         'cse_pdfs': False}
Martin Bauer's avatar
Martin Bauer committed
69
    }
70
    options = options_dict.get(ctx.config, options_dict['srt'])
71
72
    options.update(common_options)

73
74
75
76
77
    stencil_str = options['stencil']
    q = int(stencil_str[stencil_str.find('Q')+1:])
    pdfs, velocity_field = ps.fields("pdfs({q}), velocity(3) : double[3D]".format(q=q), layout='fzyx')
    options['optimization']['symbolic_field'] = pdfs

78
79
80
81
    vp = [
        ('int32_t', 'cudaBlockSize0'),
        ('int32_t', 'cudaBlockSize1')
    ]
Martin Bauer's avatar
Martin Bauer committed
82
83
84
    lb_method = create_lb_method(**options)
    update_rule = create_lb_update_rule(lb_method=lb_method, **options)

85
86
87
    update_rule = insert_fast_divisions(update_rule)
    update_rule = insert_fast_sqrts(update_rule)

Martin Bauer's avatar
Martin Bauer committed
88
    # CPU lattice model - required for macroscopic value computation, VTK output etc.
89
90
91
    options_without_opt = options.copy()
    del options_without_opt['optimization']
    generate_lattice_model(ctx, 'UniformGridGPU_LatticeModel', lb_method, update_rule_params=options_without_opt)
Martin Bauer's avatar
Martin Bauer committed
92
93

    # gpu LB sweep & boundaries
94
95
96
97
98
    generate_sweep(ctx, 'UniformGridGPU_LbKernel', update_rule,
                   field_swaps=[('pdfs', 'pdfs_tmp')],
                   inner_outer_split=True, target='gpu', gpu_indexing_params=sweep_params,
                   varying_parameters=vp)

Martin Bauer's avatar
Martin Bauer committed
99
100
101
    generate_boundary(ctx, 'UniformGridGPU_NoSlip', NoSlip(), lb_method, target='gpu')
    generate_boundary(ctx, 'UniformGridGPU_UBB', UBB([0.05, 0, 0]), lb_method, target='gpu')

102
103
104
105
106
107
108
109
    # getter & setter
    setter_assignments = macroscopic_values_setter(lb_method, velocity=velocity_field.center_vector,
                                                   pdfs=pdfs.center_vector, density=1)
    getter_assignments = macroscopic_values_getter(lb_method, velocity=velocity_field.center_vector,
                                                   pdfs=pdfs.center_vector,  density=None)
    generate_sweep(ctx, 'UniformGridGPU_MacroSetter', setter_assignments)
    generate_sweep(ctx, 'UniformGridGPU_MacroGetter', getter_assignments)

Martin Bauer's avatar
Martin Bauer committed
110
111
    # communication
    generate_pack_info_from_kernel(ctx, 'UniformGridGPU_PackInfo', update_rule, target='gpu')