Commit 66d3915d authored by Michael Kuron's avatar Michael Kuron
Browse files

Merge branch 'UpdatedKernel' into 'master'

Generalize stream only kernel

See merge request pycodegen/lbmpy!74
parents d77c86e0 ae9f769e
import numpy as np
import sympy as sp
import warnings
from lbmpy.fieldaccess import StreamPullTwoFieldsAccessor
from lbmpy.methods.abstractlbmethod import LbmCollisionRule
......@@ -54,13 +55,24 @@ def create_lbm_kernel(collision_rule, input_field, output_field, accessor):
return result
def create_stream_pull_only_kernel(stencil, numpy_arr=None, src_field_name="src", dst_field_name="dst",
generic_layout='numpy', generic_field_type=np.float64):
"""Creates a stream-pull kernel, without collision.
def create_stream_only_kernel(stencil, numpy_arr=None, src_field_name="src", dst_field_name="dst",
generic_layout='numpy', generic_field_type=np.float64,
accessor=StreamPullTwoFieldsAccessor()):
"""Creates a stream kernel, without collision.
For parameters see function ``create_stream_pull_collide_kernel``
"""
Args:
stencil: lattice Boltzmann stencil which is used
numpy_arr: numpy array which containes the pdf field data. If no numpy array is provided the symbolic field
accesses are created with 'Field.create_generic'. Otherwise 'Field.create_from_numpy_array' is used.
src_field_name: name of the source field.
dst_field_name: name of the destination field.
generic_layout: data layout. for example 'fzyx' of 'zyxf'.
generic_field_type: field data type.
accessor: Field accessor which is used to create the update rule. See 'fieldaccess.PdfFieldAccessor'
Returns:
AssignmentCollection of the stream only update rule
"""
dim = len(stencil[0])
if numpy_arr is None:
src = Field.create_generic(src_field_name, dim, index_shape=(len(stencil),),
......@@ -71,15 +83,27 @@ def create_stream_pull_only_kernel(stencil, numpy_arr=None, src_field_name="src"
src = Field.create_from_numpy_array(src_field_name, numpy_arr, index_dimensions=1)
dst = Field.create_from_numpy_array(dst_field_name, numpy_arr, index_dimensions=1)
accessor = StreamPullTwoFieldsAccessor()
eqs = [Assignment(a, b) for a, b in zip(accessor.write(dst, stencil), accessor.read(src, stencil))]
return AssignmentCollection(eqs, [])
def create_stream_pull_only_kernel(stencil, numpy_arr=None, src_field_name="src", dst_field_name="dst",
generic_layout='numpy', generic_field_type=np.float64):
"""Creates a stream kernel with the pull scheme, without collision.
For parameters see function ``create_stream_pull_collide_kernel``
"""
warnings.warn("This function is depricated. Please use create_stream_only_kernel. If no PdfFieldAccessor is "
"provided to this function a standard StreamPullTwoFieldsAccessor is used ", DeprecationWarning)
return create_stream_only_kernel(stencil, numpy_arr=numpy_arr, src_field_name=src_field_name,
dst_field_name=dst_field_name, generic_layout=generic_layout,
generic_field_type=generic_field_type, accessor=StreamPullTwoFieldsAccessor())
def create_stream_pull_with_output_kernel(lb_method, src_field, dst_field, output):
stencil = lb_method.stencil
cqc = lb_method.conserved_quantity_computation
streamed = sp.symbols("streamed_:%d" % (len(stencil),))
streamed = sp.symbols(f"streamed_:{len(stencil)}")
accessor = StreamPullTwoFieldsAccessor()
stream_assignments = [Assignment(a, b) for a, b in zip(streamed, accessor.read(src_field, stencil))]
output_eq_collection = cqc.output_equations_from_pdfs(streamed, output)
......
......@@ -88,7 +88,7 @@ def test_neumann_angle():
sc.run(10000)
angles = liquid_lens_neumann_angles(sc.concentration[:, :, :])
assert sum(angles) == 360
np.testing.assert_almost_equal(sum(angles), 360)
analytic_angles = analytic_neumann_angles([0.01, 0.02, kappa3])
for ref, simulated in zip(analytic_angles, angles):
......
import pytest
import pystencils as ps
from lbmpy.stencils import get_stencil
from lbmpy.fieldaccess import StreamPullTwoFieldsAccessor, StreamPushTwoFieldsAccessor,\
AAOddTimeStepAccessor, AAEvenTimeStepAccessor, EsoTwistOddTimeStepAccessor, EsoTwistEvenTimeStepAccessor
from lbmpy.updatekernels import create_stream_only_kernel
@pytest.mark.parametrize('accessor', [StreamPullTwoFieldsAccessor(), StreamPushTwoFieldsAccessor(),
AAOddTimeStepAccessor(), AAEvenTimeStepAccessor(),
EsoTwistOddTimeStepAccessor(), EsoTwistEvenTimeStepAccessor()])
def test_stream_only_kernel(accessor):
domain_size = (4, 4)
stencil = get_stencil("D2Q9")
dh = ps.create_data_handling(domain_size, default_target='cpu')
src = dh.add_array('src', values_per_cell=len(stencil))
dh.fill('src', 0.0, ghost_layers=True)
dst = dh.add_array_like('dst', 'src')
dh.fill('dst', 0.0, ghost_layers=True)
pull = create_stream_only_kernel(stencil, None, src.name, dst.name, accessor=accessor)
for i, eq in enumerate(pull.main_assignments):
assert eq.rhs.offsets == accessor.read(src, stencil)[i].offsets
assert eq.lhs.offsets == accessor.write(dst, stencil)[i].offsets
\ No newline at end of file
Markdown is supported
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