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

Merge branch 'UpdatedKernel' into 'master'

Generalize stream only kernel

See merge request !74
parents d77c86e0 ae9f769e
Branches
Tags
1 merge request!74Generalize stream only kernel
Pipeline #31957 passed with stages
in 23 minutes and 43 seconds
import numpy as np import numpy as np
import sympy as sp import sympy as sp
import warnings
from lbmpy.fieldaccess import StreamPullTwoFieldsAccessor from lbmpy.fieldaccess import StreamPullTwoFieldsAccessor
from lbmpy.methods.abstractlbmethod import LbmCollisionRule from lbmpy.methods.abstractlbmethod import LbmCollisionRule
...@@ -54,13 +55,24 @@ def create_lbm_kernel(collision_rule, input_field, output_field, accessor): ...@@ -54,13 +55,24 @@ def create_lbm_kernel(collision_rule, input_field, output_field, accessor):
return result return result
def create_stream_pull_only_kernel(stencil, numpy_arr=None, src_field_name="src", dst_field_name="dst", 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): generic_layout='numpy', generic_field_type=np.float64,
"""Creates a stream-pull kernel, without collision. 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]) dim = len(stencil[0])
if numpy_arr is None: if numpy_arr is None:
src = Field.create_generic(src_field_name, dim, index_shape=(len(stencil),), 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" ...@@ -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) 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) 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))] eqs = [Assignment(a, b) for a, b in zip(accessor.write(dst, stencil), accessor.read(src, stencil))]
return AssignmentCollection(eqs, []) 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): def create_stream_pull_with_output_kernel(lb_method, src_field, dst_field, output):
stencil = lb_method.stencil stencil = lb_method.stencil
cqc = lb_method.conserved_quantity_computation cqc = lb_method.conserved_quantity_computation
streamed = sp.symbols("streamed_:%d" % (len(stencil),)) streamed = sp.symbols(f"streamed_:{len(stencil)}")
accessor = StreamPullTwoFieldsAccessor() accessor = StreamPullTwoFieldsAccessor()
stream_assignments = [Assignment(a, b) for a, b in zip(streamed, accessor.read(src_field, stencil))] 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) output_eq_collection = cqc.output_equations_from_pdfs(streamed, output)
......
...@@ -88,7 +88,7 @@ def test_neumann_angle(): ...@@ -88,7 +88,7 @@ def test_neumann_angle():
sc.run(10000) sc.run(10000)
angles = liquid_lens_neumann_angles(sc.concentration[:, :, :]) 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]) analytic_angles = analytic_neumann_angles([0.01, 0.02, kappa3])
for ref, simulated in zip(analytic_angles, angles): 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
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