Skip to content
Snippets Groups Projects
Select Git revision
  • 3715b05090da53741c8d52ce519542c4d61502f9
  • master default protected
  • v2.0-dev protected
  • zikeliml/Task-96-dotExporterForAST
  • zikeliml/124-rework-tutorials
  • fma
  • fhennig/v2.0-deprecations
  • holzer-master-patch-46757
  • 66-absolute-access-is-probably-not-copied-correctly-after-_eval_subs
  • gpu_bufferfield_fix
  • hyteg
  • vectorization_sqrt_fix
  • target_dh_refactoring
  • const_fix
  • improved_comm
  • gpu_liveness_opts
  • release/1.3.7 protected
  • release/1.3.6 protected
  • release/2.0.dev0 protected
  • release/1.3.5 protected
  • release/1.3.4 protected
  • release/1.3.3 protected
  • release/1.3.2 protected
  • release/1.3.1 protected
  • release/1.3 protected
  • release/1.2 protected
  • release/1.1.1 protected
  • release/1.1 protected
  • release/1.0.1 protected
  • release/1.0 protected
  • release/0.4.4 protected
  • last/Kerncraft
  • last/OpenCL
  • last/LLVM
  • release/0.4.3 protected
  • release/0.4.2 protected
36 results

test_abs.py

Blame
  • test_jacobi_cbackend.py 2.64 KiB
    import numpy as np
    
    from pystencils import get_code_obj
    from pystencils.astnodes import Block, KernelFunction, SympyAssignment
    from pystencils.cpu import make_python_function
    from pystencils.field import Field
    from pystencils.transformations import (
        make_loop_over_domain, move_constants_before_loop, resolve_field_accesses)
    
    
    def test_jacobi_fixed_field_size():
        size = (30, 20)
    
        src_field_c = np.random.rand(*size)
        src_field_py = np.copy(src_field_c)
        dst_field_c = np.zeros(size)
        dst_field_py = np.zeros(size)
    
        f = Field.create_from_numpy_array("f", src_field_c)
        d = Field.create_from_numpy_array("d", dst_field_c)
    
        jacobi = SympyAssignment(d[0, 0], (f[1, 0] + f[-1, 0] + f[0, 1] + f[0, -1]) / 4)
        body = Block([jacobi])
        loop_node, gl_info = make_loop_over_domain(body)
        ast_node = KernelFunction(loop_node, 'cpu', 'c', make_python_function, ghost_layers=gl_info)
        resolve_field_accesses(ast_node)
        move_constants_before_loop(ast_node)
    
        for x in range(1, size[0] - 1):
            for y in range(1, size[1] - 1):
                dst_field_py[x, y] = 0.25 * (src_field_py[x - 1, y] + src_field_py[x + 1, y] +
                                             src_field_py[x, y - 1] + src_field_py[x, y + 1])
    
        kernel = ast_node.compile()
        kernel(f=src_field_c, d=dst_field_c)
        error = np.sum(np.abs(dst_field_py - dst_field_c))
        np.testing.assert_allclose(error, 0.0, atol=1e-13)
    
        code_display = get_code_obj(ast_node)
        assert 'for' in str(code_display)
        assert 'for' in code_display._repr_html_()
    
    
    def test_jacobi_variable_field_size():
        size = (3, 3, 3)
        f = Field.create_generic("f", 3)
        d = Field.create_generic("d", 3)
        jacobi = SympyAssignment(d[0, 0, 0], (f[1, 0, 0] + f[-1, 0, 0] + f[0, 1, 0] + f[0, -1, 0]) / 4)
        body = Block([jacobi])
        loop_node, gl_info = make_loop_over_domain(body)
        ast_node = KernelFunction(loop_node, 'cpu', 'c', make_python_function, ghost_layers=gl_info)
        resolve_field_accesses(ast_node)
        move_constants_before_loop(ast_node)
    
        src_field_c = np.random.rand(*size)
        src_field_py = np.copy(src_field_c)
        dst_field_c = np.zeros(size)
        dst_field_py = np.zeros(size)
    
        for x in range(1, size[0]-1):
            for y in range(1, size[1]-1):
                for z in range(1, size[2]-1):
                    dst_field_py[x, y, z] = 0.25 * (src_field_py[x - 1, y, z] + src_field_py[x + 1, y, z] +
                                                    src_field_py[x, y - 1, z] + src_field_py[x, y + 1, z])
    
        kernel = ast_node.compile()
        kernel(f=src_field_c, d=dst_field_c)
        error = np.sum(np.abs(dst_field_py-dst_field_c))
        np.testing.assert_allclose(error, 0.0, atol=1e-13)