Skip to content
Snippets Groups Projects
Commit 6dab2755 authored by Michael Kuron's avatar Michael Kuron :mortar_board:
Browse files

staggered diffusion test improvements

parent 8a042144
No related merge requests found
...@@ -6,6 +6,7 @@ import sympy as sp ...@@ -6,6 +6,7 @@ import sympy as sp
from pystencils.assignment import Assignment from pystencils.assignment import Assignment
from pystencils.astnodes import Block, Conditional, LoopOverCoordinate, SympyAssignment from pystencils.astnodes import Block, Conditional, LoopOverCoordinate, SympyAssignment
from pystencils.cpu.vectorization import vectorize from pystencils.cpu.vectorization import vectorize
from pystencils.field import Field
from pystencils.gpucuda.indexing import indexing_creator_from_params from pystencils.gpucuda.indexing import indexing_creator_from_params
from pystencils.simp.assignment_collection import AssignmentCollection from pystencils.simp.assignment_collection import AssignmentCollection
from pystencils.stencil import direction_string_to_offset, inverse_direction_string from pystencils.stencil import direction_string_to_offset, inverse_direction_string
...@@ -187,8 +188,18 @@ def create_indexed_kernel(assignments, ...@@ -187,8 +188,18 @@ def create_indexed_kernel(assignments,
raise ValueError("Unknown target %s. Has to be either 'cpu' or 'gpu'" % (target,)) raise ValueError("Unknown target %s. Has to be either 'cpu' or 'gpu'" % (target,))
def create_staggered_kernel(staggered_field, expressions, subexpressions=(), target='cpu', def create_staggered_kernel(*args, **kwargs):
gpu_exclusive_conditions=False, **kwargs): """Kernel that updates a staggered field. Dispatches to either create_staggered_kernel_1 or
create_staggered_kernel_2 depending on the argument types.
"""
if 'staggered_field' in kwargs or type(args[0]) is Field:
return create_staggered_kernel_1(*args, **kwargs)
else:
return create_staggered_kernel_2(*args, **kwargs)
def create_staggered_kernel_1(staggered_field, expressions, subexpressions=(), target='cpu',
gpu_exclusive_conditions=False, **kwargs):
"""Kernel that updates a staggered field. """Kernel that updates a staggered field.
.. image:: /img/staggered_grid.svg .. image:: /img/staggered_grid.svg
......
...@@ -21,8 +21,8 @@ class TestDiffusion: ...@@ -21,8 +21,8 @@ class TestDiffusion:
jj = j.staggered_access jj = j.staggered_access
divergence = -1 * D / (1 + np.sqrt(2) if j.index_shape[0] == 4 else 1) * \ divergence = -1 * D / (1 + np.sqrt(2) if j.index_shape[0] == 4 else 1) * \
sum([jj(d) for d in j.staggered_stencil + sum([jj(d) / np.linalg.norm(ps.stencil.direction_string_to_offset(d)) for d in j.staggered_stencil
[ps.stencil.inverse_direction_string(d) for d in j.staggered_stencil]]) + [ps.stencil.inverse_direction_string(d) for d in j.staggered_stencil]])
update = [ps.Assignment(c.center, c.center + dt * divergence)] update = [ps.Assignment(c.center, c.center + dt * divergence)]
flux = [ps.Assignment(j.staggered_access("W"), x_staggered), flux = [ps.Assignment(j.staggered_access("W"), x_staggered),
...@@ -31,7 +31,7 @@ class TestDiffusion: ...@@ -31,7 +31,7 @@ class TestDiffusion:
flux += [ps.Assignment(j.staggered_access("SW"), xy_staggered), flux += [ps.Assignment(j.staggered_access("SW"), xy_staggered),
ps.Assignment(j.staggered_access("NW"), xY_staggered)] ps.Assignment(j.staggered_access("NW"), xY_staggered)]
staggered_kernel = ps.kernelcreation.create_staggered_kernel_2(flux, target=dh.default_target).compile() staggered_kernel = ps.create_staggered_kernel(flux, target=dh.default_target).compile()
div_kernel = ps.create_kernel(update, target=dh.default_target).compile() div_kernel = ps.create_kernel(update, target=dh.default_target).compile()
def time_loop(steps): def time_loop(steps):
...@@ -57,10 +57,7 @@ class TestDiffusion: ...@@ -57,10 +57,7 @@ class TestDiffusion:
r = np.array([x, y]) - L[0] / 2 + 0.5 r = np.array([x, y]) - L[0] / 2 + 0.5
reference[x, y] = (4 * np.pi * D * T)**(-dh.dim / 2) * np.exp(-np.dot(r, r) / (4 * D * T)) * (2**dh.dim) reference[x, y] = (4 * np.pi * D * T)**(-dh.dim / 2) * np.exp(-np.dot(r, r) / (4 * D * T)) * (2**dh.dim)
if num_neighbors == 2: assert np.abs(dh.gather_array(c.name) - reference).max() < 5e-4
assert np.abs(dh.gather_array(c.name) - reference).max() < 1e-3
else:
assert np.abs(dh.gather_array(c.name) - reference).max() < 1e-2
def test_diffusion_2(self): def test_diffusion_2(self):
self._run(2) self._run(2)
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment