From c1721980a1c2d5c7a9f1ae65181e4a51129700da Mon Sep 17 00:00:00 2001 From: Martin Bauer <martin.bauer@fau.de> Date: Fri, 16 Nov 2018 10:36:50 +0100 Subject: [PATCH] New function to create LB equilibrium from initial values assignments --- lbstep.py | 17 ++++++----------- macroscopic_value_kernels.py | 10 ++++++++++ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lbstep.py b/lbstep.py index c85f2ced..fbb50668 100644 --- a/lbstep.py +++ b/lbstep.py @@ -1,10 +1,10 @@ from types import MappingProxyType - import numpy as np from lbmpy.boundaries.boundaryhandling import LatticeBoltzmannBoundaryHandling from lbmpy.creationfunctions import switch_to_symbolic_relaxation_rates_for_omega_adapting_methods, \ create_lb_function, update_with_default_parameters -from lbmpy.macroscopic_value_kernels import create_advanced_velocity_setter_collision_rule +from lbmpy.macroscopic_value_kernels import create_advanced_velocity_setter_collision_rule, \ + pdf_initialization_assignments from lbmpy.simplificationfactory import create_simplification_strategy from lbmpy.stencils import get_stencil from pystencils import create_kernel, make_slice, create_data_handling @@ -389,23 +389,18 @@ class LatticeBoltzmannStep: def _compile_macroscopic_setter_and_getter(self): lb_method = self.method - dim = lb_method.dim - q = len(lb_method.stencil) cqc = lb_method.conserved_quantity_computation pdf_field = self._data_handling.fields[self._pdf_arr_name] rho_field = self._data_handling.fields[self.density_data_name] rho_field = rho_field.center if self.density_data_index is None else rho_field(self.density_data_index) vel_field = self._data_handling.fields[self.velocity_data_name] - pdf_symbols = [pdf_field(i) for i in range(q)] - getter_eqs = cqc.output_equations_from_pdfs(pdf_symbols, {'density': rho_field, 'velocity': vel_field}) + getter_eqs = cqc.output_equations_from_pdfs(pdf_field.center_vector, + {'density': rho_field, 'velocity': vel_field}) getter_kernel = create_kernel(getter_eqs, target='cpu', cpu_openmp=self._optimization['openmp']).compile() - inp_eqs = cqc.equilibrium_input_equations_from_init_values(rho_field, [vel_field(i) for i in range(dim)]) - setter_eqs = lb_method.get_equilibrium(conserved_quantity_equations=inp_eqs) - setter_eqs = setter_eqs.new_with_substitutions({sym: pdf_field(i) - for i, sym in enumerate(lb_method.post_collision_pdf_symbols)}) - + setter_eqs = pdf_initialization_assignments(lb_method, rho_field, + vel_field.center_vector, pdf_field.center_vector) setter_eqs = create_simplification_strategy(lb_method)(setter_eqs) setter_kernel = create_kernel(setter_eqs, target='cpu', cpu_openmp=self._optimization['openmp']).compile() return getter_kernel, setter_kernel diff --git a/macroscopic_value_kernels.py b/macroscopic_value_kernels.py index 2e712391..2cdda084 100644 --- a/macroscopic_value_kernels.py +++ b/macroscopic_value_kernels.py @@ -4,6 +4,16 @@ from pystencils.field import Field, get_layout_of_array from lbmpy.simplificationfactory import create_simplification_strategy +def pdf_initialization_assignments(lb_method, density, velocity, pdfs): + """Assignments to initialize the pdf field with equilibrium""" + cqc = lb_method.conserved_quantity_computation + inp_eqs = cqc.equilibrium_input_equations_from_init_values(density, velocity) + setter_eqs = lb_method.get_equilibrium(conserved_quantity_equations=inp_eqs) + setter_eqs = setter_eqs.new_with_substitutions({sym: pdfs[i] + for i, sym in enumerate(lb_method.post_collision_pdf_symbols)}) + return setter_eqs + + def compile_macroscopic_values_getter(lb_method, output_quantities, pdf_arr=None, field_layout='numpy', target='cpu'): """ Create kernel to compute macroscopic value(s) from a pdf field (e.g. density or velocity) -- GitLab