Skip to content
Snippets Groups Projects
Commit 11c94c03 authored by Philipp Suffa's avatar Philipp Suffa
Browse files

Fixes error, where psm plus force fails for macroscopic getter and setters

parent b9073ad6
No related branches found
No related tags found
1 merge request!187Optmizations for kernel generation for the partially saturated cells method
Pipeline #79745 failed
...@@ -7,6 +7,7 @@ from pystencils.field import Field, get_layout_of_array ...@@ -7,6 +7,7 @@ from pystencils.field import Field, get_layout_of_array
from pystencils.enums import Target from pystencils.enums import Target
from lbmpy.advanced_streaming.utility import get_accessor, Timestep from lbmpy.advanced_streaming.utility import get_accessor, Timestep
from lbmpy.partially_saturated_cells import replace_fraction_symbol_with_field
from lbmpy.relaxationrates import get_shear_relaxation_rate from lbmpy.relaxationrates import get_shear_relaxation_rate
from lbmpy.utils import second_order_moment_tensor from lbmpy.utils import second_order_moment_tensor
...@@ -26,7 +27,7 @@ def get_field_accesses(lb_method, pdfs, streaming_pattern, previous_timestep, pr ...@@ -26,7 +27,7 @@ def get_field_accesses(lb_method, pdfs, streaming_pattern, previous_timestep, pr
return field_accesses return field_accesses
def pdf_initialization_assignments(lb_method, density, velocity, pdfs, def pdf_initialization_assignments(lb_method, density, velocity, pdfs, fraction_field_access=None,
streaming_pattern='pull', previous_timestep=Timestep.BOTH, streaming_pattern='pull', previous_timestep=Timestep.BOTH,
set_pre_collision_pdfs=False): set_pre_collision_pdfs=False):
"""Assignments to initialize the pdf field with equilibrium""" """Assignments to initialize the pdf field with equilibrium"""
...@@ -42,10 +43,16 @@ def pdf_initialization_assignments(lb_method, density, velocity, pdfs, ...@@ -42,10 +43,16 @@ def pdf_initialization_assignments(lb_method, density, velocity, pdfs,
setter_eqs = lb_method.get_equilibrium(conserved_quantity_equations=inp_eqs) setter_eqs = lb_method.get_equilibrium(conserved_quantity_equations=inp_eqs)
setter_eqs = setter_eqs.new_with_substitutions({sym: field_accesses[i] setter_eqs = setter_eqs.new_with_substitutions({sym: field_accesses[i]
for i, sym in enumerate(lb_method.post_collision_pdf_symbols)}) for i, sym in enumerate(lb_method.post_collision_pdf_symbols)})
if lb_method.fraction_field is not None:
if fraction_field_access is None:
raise ValueError("If setting up LBM with PSM, please specify a fraction field access in the macroscopic setter")
else:
setter_eqs = replace_fraction_symbol_with_field(setter_eqs, lb_method.fraction_field, fraction_field_access)
return setter_eqs return setter_eqs
def macroscopic_values_getter(lb_method, density, velocity, pdfs, def macroscopic_values_getter(lb_method, density, velocity, pdfs, fraction_field_access=None,
streaming_pattern='pull', previous_timestep=Timestep.BOTH, streaming_pattern='pull', previous_timestep=Timestep.BOTH,
use_pre_collision_pdfs=False): use_pre_collision_pdfs=False):
...@@ -58,7 +65,14 @@ def macroscopic_values_getter(lb_method, density, velocity, pdfs, ...@@ -58,7 +65,14 @@ def macroscopic_values_getter(lb_method, density, velocity, pdfs,
output_spec['velocity'] = velocity output_spec['velocity'] = velocity
if density is not None: if density is not None:
output_spec['density'] = density output_spec['density'] = density
return cqc.output_equations_from_pdfs(field_accesses, output_spec) getter_equ = cqc.output_equations_from_pdfs(field_accesses, output_spec)
if lb_method.fraction_field is not None:
if fraction_field_access is None:
raise ValueError("If setting up LBM with PSM, please specify a fraction field access in the macroscopic getter")
else:
getter_equ = replace_fraction_symbol_with_field(getter_equ, lb_method.fraction_field, fraction_field_access)
return getter_equ
macroscopic_values_setter = pdf_initialization_assignments macroscopic_values_setter = pdf_initialization_assignments
......
...@@ -104,10 +104,10 @@ def get_psm_force_from_solid_collision(solid_collisions, stencil, object_force_f ...@@ -104,10 +104,10 @@ def get_psm_force_from_solid_collision(solid_collisions, stencil, object_force_f
return AssignmentCollection(force_assignments) return AssignmentCollection(force_assignments)
def replace_fraction_symbol_with_field(assignments, psm_config): def replace_fraction_symbol_with_field(assignments, fraction_field_symbol, fraction_field_access):
new_assignments = [] new_assignments = []
for ass in assignments: for ass in assignments:
rhs = ass.rhs.subs(psm_config.fraction_field_symbol, psm_config.fraction_field.center(0)) rhs = ass.rhs.subs(fraction_field_symbol, fraction_field_access.center(0))
new_assignments.append(Assignment(ass.lhs, rhs)) new_assignments.append(Assignment(ass.lhs, rhs))
return new_assignments return new_assignments
...@@ -160,8 +160,8 @@ def replace_by_psm_collision_rule(collision_rule, psm_config): ...@@ -160,8 +160,8 @@ def replace_by_psm_collision_rule(collision_rule, psm_config):
collision_assignments.append(Assignment(main.lhs, rhs)) collision_assignments.append(Assignment(main.lhs, rhs))
collision_assignments = AssignmentCollection(collision_assignments) collision_assignments = AssignmentCollection(collision_assignments)
ac = LbmCollisionRule(method, replace_fraction_symbol_with_field(collision_assignments, psm_config), ac = LbmCollisionRule(method, replace_fraction_symbol_with_field(collision_assignments, psm_config.fraction_field_symbol, psm_config.fraction_field),
replace_fraction_symbol_with_field(collision_rule.subexpressions, psm_config), replace_fraction_symbol_with_field(collision_rule.subexpressions, psm_config.fraction_field_symbol, psm_config.fraction_field),
collision_rule.simplification_hints) collision_rule.simplification_hints)
ac.topological_sort() ac.topological_sort()
return ac return ac
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment