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
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
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])
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