def check_for_matching_equilibrium(method_name, stencil, compressibility):
    omega = sp.Symbol("omega")
    if method_name == Method.SRT:
        method = create_srt(stencil,
                            omega,
                            compressible=compressibility,
                            equilibrium_order=2)
    elif method_name == Method.TRT:
        method = create_trt(stencil,
                            omega,
                            omega,
                            compressible=compressibility,
                            equilibrium_order=2)
    elif method_name == Method.MRT:
        method = create_mrt_orthogonal(stencil, [omega] * stencil.Q,
                                       weighted=False,
                                       compressible=compressibility,
                                       equilibrium_order=2)
    else:
        raise ValueError("Unknown method")

    reference_equilibrium = discrete_maxwellian_equilibrium(
        stencil,
        order=2,
        c_s_sq=sp.Rational(1, 3),
        compressible=compressibility)
    equilibrium = method.get_equilibrium()
    equilibrium = equilibrium.new_without_subexpressions(
        subexpressions_to_keep=sp.symbols("rho u_0 u_1 u_2"))

    diff = sp.Matrix(reference_equilibrium) - sp.Matrix(
        [eq.rhs for eq in equilibrium.main_assignments])
    diff = sp.simplify(diff)
    assert sum(diff).is_zero
Esempio n. 2
0
def test_weights(stencil_name):
    stencil = LBStencil(stencil_name)
    cumulant_method = create_with_default_polynomial_cumulants(stencil, [1])
    moment_method = create_srt(stencil,
                               1,
                               compressible=True,
                               maxwellian_moments=True)
    assert cumulant_method.weights == moment_method.weights
Esempio n. 3
0
def test_simplifications_srt_d2q9_compressible():
    omega = sp.symbols('omega')
    method = create_srt(LBStencil(Stencil.D2Q9),
                        omega,
                        compressible=True,
                        equilibrium_order=2,
                        moment_transform_class=None)
    check_method(method, [53, 58, 1], [53, 42, 1])
Esempio n. 4
0
def create_lb_method(lbm_config=None, **params):
    """Creates a LB method, defined by moments/cumulants for collision space, equilibrium and relaxation rates."""
    lbm_config, _, _ = update_with_default_parameters(params, lbm_config=lbm_config)

    relaxation_rates = lbm_config.relaxation_rates
    dim = lbm_config.stencil.D

    if isinstance(lbm_config.force, Field):
        lbm_config.force = tuple(lbm_config.force(i) for i in range(dim))

    common_params = {
        'compressible': lbm_config.compressible,
        'equilibrium_order': lbm_config.equilibrium_order,
        'force_model': lbm_config.force_model,
        'maxwellian_moments': lbm_config.maxwellian_moments,
        'c_s_sq': lbm_config.c_s_sq,
        'moment_transform_class': lbm_config.moment_transform_class,
        'central_moment_transform_class': lbm_config.central_moment_transform_class,
    }

    cumulant_params = {
        'equilibrium_order': lbm_config.equilibrium_order,
        'force_model': lbm_config.force_model,
        'c_s_sq': lbm_config.c_s_sq,
        'galilean_correction': lbm_config.galilean_correction,
        'central_moment_transform_class': lbm_config.central_moment_transform_class,
        'cumulant_transform_class': lbm_config.cumulant_transform_class,
    }

    if lbm_config.method == Method.SRT:
        assert len(relaxation_rates) >= 1, "Not enough relaxation rates"
        method = create_srt(lbm_config.stencil, relaxation_rates[0], **common_params)
    elif lbm_config.method == Method.TRT:
        assert len(relaxation_rates) >= 2, "Not enough relaxation rates"
        method = create_trt(lbm_config.stencil, relaxation_rates[0], relaxation_rates[1], **common_params)
    elif lbm_config.method == Method.MRT:
        method = create_mrt_orthogonal(lbm_config.stencil, relaxation_rates, weighted=lbm_config.weighted,
                                       nested_moments=lbm_config.nested_moments, **common_params)
    elif lbm_config.method == Method.CENTRAL_MOMENT:
        method = create_central_moment(lbm_config.stencil, relaxation_rates,
                                       nested_moments=lbm_config.nested_moments, **common_params)
    elif lbm_config.method == Method.MRT_RAW:
        method = create_mrt_raw(lbm_config.stencil, relaxation_rates, **common_params)
    elif lbm_config.method in [Method.TRT_KBC_N1, Method.TRT_KBC_N2, Method.TRT_KBC_N3, Method.TRT_KBC_N4]:
        if lbm_config.stencil.D == 2 and lbm_config.stencil.Q == 9:
            dim = 2
        elif lbm_config.stencil.D == 3 and lbm_config.stencil.Q == 27:
            dim = 3
        else:
            raise NotImplementedError("KBC type TRT methods can only be constructed for D2Q9 and D3Q27 stencils")
        method_nr = lbm_config.method.name[-1]
        method = create_trt_kbc(dim, relaxation_rates[0], relaxation_rates[1], 'KBC-N' + method_nr, **common_params)
    elif lbm_config.method == Method.ENTROPIC_SRT:
        method = create_srt_entropic(lbm_config.stencil, relaxation_rates[0], lbm_config.force_model,
                                     lbm_config.compressible)
    elif lbm_config.method == Method.CUMULANT:
        if lbm_config.nested_moments is not None:
            method = create_with_polynomial_cumulants(
                lbm_config.stencil, relaxation_rates, lbm_config.nested_moments, **cumulant_params)
        else:
            method = create_with_default_polynomial_cumulants(lbm_config.stencil, relaxation_rates, **cumulant_params)
    elif lbm_config.method == Method.MONOMIAL_CUMULANT:
        method = create_with_monomial_cumulants(lbm_config.stencil, relaxation_rates, **cumulant_params)
    else:
        raise ValueError("Failed to create LB method. Please use lbmpy.enums.Method for the creation")

    # >>Entropic methods can only be created for methods with two relaxation rates One free relaxation rate
    # determining the viscosity and one to be determined by the entropy condition<<
    # Thus we fix the conserved quantities to one of the relaxation rates because zero would be recognised as
    # a third relaxation rate here.
    if lbm_config.entropic:
        method.set_conserved_moments_relaxation_rate(relaxation_rates[0])

    return method