Skip to content
Snippets Groups Projects

WIP: Fluctuating Equations non-normalized

Files
3
+ 39
10
@@ -75,8 +75,10 @@ LES methods:
Fluctuating LB:
- ``fluctuating=(variance1, variance2, )``: enables fluctuating lattice Boltzmann by randomizing collision process.
Pass sequence of variances for each moment, or `True` to use symbolic variances
- ``fluctuating=dict``: set to a dictionary to enable thermal fluctuations
Must pass either ``temperature`` in the dict to set a temperature or ``variances`` which contains number of moment
variances for the fluctuations
Additional dict parameters are ``rng_node`` to set the random number generator used
@@ -178,7 +180,7 @@ from lbmpy.fieldaccess import (
AAEvenTimeStepAccessor, AAOddTimeStepAccessor, CollideOnlyInplaceAccessor, EsoTwistEvenTimeStepAccessor,
EsoTwistOddTimeStepAccessor, PdfFieldAccessor, PeriodicTwoFieldsAccessor, StreamPullTwoFieldsAccessor,
StreamPushTwoFieldsAccessor)
from lbmpy.fluctuatinglb import fluctuation_correction, method_with_rescaled_equilibrium_values
from lbmpy.fluctuatinglb import fluctuation_correction, fluctuating_variance_equations
from lbmpy.methods import create_mrt3, create_mrt_orthogonal, create_mrt_raw, create_srt, create_trt, create_trt_kbc
from lbmpy.methods.creationfunctions import create_generic_mrt
from lbmpy.methods.cumulantbased import CumulantBasedLbMethod
@@ -193,7 +195,7 @@ from pystencils import Assignment, AssignmentCollection, create_kernel
from pystencils.cache import disk_cache_no_fallback
from pystencils.data_types import collate_types
from pystencils.field import Field, get_layout_of_array
from pystencils.rng import random_symbol
from pystencils.rng import random_symbol, PhiloxFourFloats
from pystencils.simp.assignment_collection import SymbolGen
from pystencils.stencil import have_same_entries
@@ -309,9 +311,6 @@ def create_lb_collision_rule(lb_method=None, optimization={}, **kwargs):
if rho_in is not None and isinstance(rho_in, Field):
rho_in = rho_in.center
if params['fluctuating']:
lb_method = method_with_rescaled_equilibrium_values(lb_method)
if u_in is not None:
density_rhs = sum(lb_method.pre_collision_pdf_symbols) if rho_in is None else rho_in
eqs = [Assignment(cqc.zeroth_order_moment_symbol, density_rhs)]
@@ -326,9 +325,39 @@ def create_lb_collision_rule(lb_method=None, optimization={}, **kwargs):
collision_rule = simplification(collision_rule)
if params['fluctuating']:
variances = SymbolGen("variance") if params['fluctuating'] is True else params['fluctuating']
correction = fluctuation_correction(lb_method, random_symbol(collision_rule.subexpressions, dim=lb_method.dim),
if not isinstance(params["fluctuating"], dict):
raise ValueError("Must pass a dictionary as fluctuating parameter")
variances = None
if "variances" in params["fluctuating"]:
variances = params["fluctuating"]["variances"]
elif "temperature" in params["fluctuating"]:
variances = [v for v, _ in zip(iter(SymbolGen("variance")), lb_method.moments)]
temperature = sp.Symbol("temperature") if params["fluctuating"]["temperature"] is True\
else params["fluctuating"]["temperature"]
variance_equations = fluctuating_variance_equations(method=lb_method,
temperature=temperature,
c_s_sq=params["c_s_sq"],
variances=variances)
collision_rule.subexpressions += variance_equations
collision_rule.topological_sort(sort_subexpressions=True, sort_main_assignments=False)
else:
raise ValueError("Fluctuating dict must contain temperature or variance key")
rng_node = PhiloxFourFloats
if "rng_node" in params["fluctuating"]:
rng_node = params["fluctuating"]["rng_node"]
correction = fluctuation_correction(lb_method,
random_symbol(collision_rule.subexpressions,
rng_node=rng_node,
dim=lb_method.dim),
variances)
for i, corr in enumerate(correction):
collision_rule.main_assignments[i] = Assignment(collision_rule.main_assignments[i].lhs,
collision_rule.main_assignments[i].rhs + corr)
@@ -527,7 +556,7 @@ def update_with_default_parameters(params, opt_params=None, fail_on_unknown_para
'entropic_newton_iterations': None,
'omega_output_field': None,
'smagorinsky': False,
'fluctuating': False,
'fluctuating': None,
'output': {},
'velocity_input': None,
Loading