Skip to content
Snippets Groups Projects
AntidunesLatticeModelGeneration.py 2.2 KiB
Newer Older
import sympy as sp

from lbmpy.creationfunctions import LBMConfig, LBMOptimisation, create_lb_collision_rule
from lbmpy.enums import ForceModel, Method, Stencil
from lbmpy.stencils import LBStencil

from pystencils_walberla import CodeGeneration
from lbmpy_walberla import generate_lattice_model

# general parameters
generatedMethod = "Cumulants"  # "TRT", "SRT"
stencilStr = "D3Q27"
stencil = LBStencil(Stencil.D3Q19 if stencilStr == "D3Q19" else Stencil.D3Q27)
force = sp.symbols("force_:3")
layout = "fzyx"

if generatedMethod == "Cumulants":
    omega = sp.Symbol("omega")
    # method definition
    lbm_config = LBMConfig(
        stencil=stencil,
        method=Method.CUMULANT,
        relaxation_rate=omega,
        compressible=True,
        force=force,
        zero_centered=False,
        streaming_pattern="pull",
        galilean_correction=True if stencil == LBStencil(Stencil.D3Q27) else False,
    )  # free surface implementation only works with pull pattern
elif generatedMethod == "TRT":
    omega_e = sp.Symbol("omega_e")
    omega_o = sp.Symbol("omega_o")
    # method definition
    lbm_config = LBMConfig(
        stencil=stencil,
        method=Method.TRT,
        smagorinsky=False,
        relaxation_rates=[omega_e, omega_o],
        compressible=True,
        force=force,
        force_model=ForceModel.GUO,
        zero_centered=False,
        streaming_pattern="pull",
    )  # free surface implementation only works with pull pattern
elif generatedMethod == "SRT":
    omega = sp.Symbol("omega")
    # method definition
    lbm_config = LBMConfig(
        stencil=stencil,
        method=Method.SRT,
        smagorinsky=True,
        relaxation_rate=omega,
        compressible=True,
        force=force,
        force_model=ForceModel.GUO,
        zero_centered=False,
        streaming_pattern="pull",
    )  # free surface implementation only works with pull pattern

# optimizations to be used by the code generator
lbm_opt = LBMOptimisation(cse_global=True, field_layout=layout)

collision_rule = create_lb_collision_rule(
    lbm_config=lbm_config, lbm_optimisation=lbm_opt
)

with CodeGeneration() as ctx:
    generate_lattice_model(
        ctx, "AntidunesLatticeModel", collision_rule, field_layout=layout
    )