diff --git a/lbmpy/creationfunctions.py b/lbmpy/creationfunctions.py index c207cada6018ec2b8bd497ff61a6a66e63637dab..558282733c85a6070944277f427f4e304e7ea063 100644 --- a/lbmpy/creationfunctions.py +++ b/lbmpy/creationfunctions.py @@ -233,6 +233,7 @@ class LBMConfig: Adds the Cassons model according to https://doi.org/10.1007/s10955-005-8415-x The parameters are set with the ``CassonsParameters`` dataclass. """ + fluctuating: dict = False """ Enables fluctuating lattice Boltzmann by randomizing collision process. @@ -244,6 +245,11 @@ class LBMConfig: Temperature for fluctuating lattice Boltzmann methods. """ + rr_parameters: Tuple = None + """ + Parameters for the hybrid recursive collision operator sigma and velocity field + """ + output: dict = field(default_factory=dict) """ A dictionary mapping macroscopic quantites e.g. the strings 'density' and 'velocity' to pystencils @@ -728,7 +734,12 @@ def create_lb_method(lbm_config=None, **params): 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.RR: - method = create_rr(lbm_config.stencil, relaxation_rates, **common_params) + sigma = sp.Integer(1) + velocity_field = None + if lbm_config.rr_parameters: + sigma = lbm_config.rr_parameters[0] + velocity_field = lbm_config.rr_parameters[1] + method = create_rr(lbm_config.stencil, relaxation_rates, sigma, velocity_field, **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) diff --git a/lbmpy/methods/creationfunctions.py b/lbmpy/methods/creationfunctions.py index 76b0c0a43b328010939c0ea150db756668bbf249..eecbffa9e6b12dda087b5b3abda74ced90c24072 100644 --- a/lbmpy/methods/creationfunctions.py +++ b/lbmpy/methods/creationfunctions.py @@ -250,13 +250,15 @@ def create_srt(stencil, relaxation_rate, continuous_equilibrium=True, **kwargs): return create_with_discrete_maxwellian_equilibrium(stencil, rr_dict, **kwargs) -def create_rr(stencil, relaxation_rates, **kwargs): +def create_rr(stencil, relaxation_rates, sigma=sp.Integer(1), velocity_field=None, **kwargs): r"""Creates a recursive regularised collision model Args: stencil: instance of :class:`lbmpy.stencils.LBStencil` relaxation_rates: relaxation rate (inverse of the relaxation time) usually called :math:`\omega` in LBM literature + sigma: switch between rr and hrr + velocity_field: velocity field to calculate the finite difference Returns: :class:`lbmpy.methods.momentbased.MomentBasedLbMethod` instance @@ -291,7 +293,8 @@ def create_rr(stencil, relaxation_rates, **kwargs): order=equilibrium_order, c_s_sq=c_s_sq) - return RecursiveRegularisedLbMethod(stencil, equilibrium, rr_dict, cqc, force_model, zero_centered) + return RecursiveRegularisedLbMethod(stencil, equilibrium, rr_dict, cqc, force_model, zero_centered, + sigma, velocity_field) def create_trt(stencil, relaxation_rate_even_moments, relaxation_rate_odd_moments, diff --git a/lbmpy/methods/momentbased/recursiveregularisedmethod.py b/lbmpy/methods/momentbased/recursiveregularisedmethod.py index 866de3614001d235353a8bb11ccb1ff0bfadc387..b48715b0ca8c4c0aea6f9b914d7fe5186c6cd1c1 100644 --- a/lbmpy/methods/momentbased/recursiveregularisedmethod.py +++ b/lbmpy/methods/momentbased/recursiveregularisedmethod.py @@ -53,7 +53,8 @@ class RecursiveRegularisedLbMethod(AbstractLbMethod): """ def __init__(self, stencil, equilibrium, relaxation_dict, - conserved_quantity_computation=None, force_model=None, zero_centered=False): + conserved_quantity_computation=None, force_model=None, zero_centered=False, sigma=sp.Integer(1), + velocity_field=None): assert isinstance(conserved_quantity_computation, AbstractConservedQuantityComputation) super(RecursiveRegularisedLbMethod, self).__init__(stencil) @@ -63,6 +64,8 @@ class RecursiveRegularisedLbMethod(AbstractLbMethod): self._force_model = force_model self._zero_centered = zero_centered self._weights = None + self._sigma = sigma + self._velocity_field = velocity_field @property def force_model(self): @@ -192,7 +195,8 @@ class RecursiveRegularisedLbMethod(AbstractLbMethod): additional_subexpressions=rr_sub_expressions, include_force_terms=True, conserved_quantity_equations=conserved_quantity_equations, - pre_simplification=pre_simplification) + pre_simplification=pre_simplification, + sigma=self._sigma) return ac def set_zeroth_moment_relaxation_rate(self, relaxation_rate): @@ -326,7 +330,8 @@ class RecursiveRegularisedLbMethod(AbstractLbMethod): additional_subexpressions: Iterable[Assignment] = None, include_force_terms: bool = True, conserved_quantity_equations: AssignmentCollection = None, - pre_simplification: bool = False) -> LbmCollisionRule: + pre_simplification: bool = False, + sigma=sp.Integer(1)) -> LbmCollisionRule: if additional_subexpressions is None: additional_subexpressions = list() @@ -351,6 +356,8 @@ class RecursiveRegularisedLbMethod(AbstractLbMethod): cs4 = c_s_sq * c_s_sq u = sp.symbols("u_:3") + taup = rho * c_s_sq / omega1 + RR = [sp.Symbol(f"M_{index.name[1:]}") for index in Ordering] RReq = [sp.Symbol(f"eq_{index.name[1:]}") for index in Ordering] # RMeq = [sp.Symbol(f"RMeq_{index.name[1:]}") for index in Ordering] @@ -405,6 +412,27 @@ class RecursiveRegularisedLbMethod(AbstractLbMethod): M202 = Ordering.M202 M022 = Ordering.M022 + gradient = [] + sr = [] + + if self._velocity_field: + gradient = [Assignment(sp.Symbol("du_11"), self._velocity_field[1, 0, 0](0) - self._velocity_field[-1, 0, 0](0)), + Assignment(sp.Symbol("du_12"), self._velocity_field[0, 1, 0](0) - self._velocity_field[0, -1, 0](0)), + Assignment(sp.Symbol("du_13"), self._velocity_field[0, 0, 1](0) - self._velocity_field[0, 0, -1](0)), + Assignment(sp.Symbol("du_21"), self._velocity_field[1, 0, 0](1) - self._velocity_field[-1, 0, 0](1)), + Assignment(sp.Symbol("du_22"), self._velocity_field[0, 1, 0](1) - self._velocity_field[0, -1, 0](1)), + Assignment(sp.Symbol("du_23"), self._velocity_field[0, 0, 1](1) - self._velocity_field[0, 0, -1](1)), + Assignment(sp.Symbol("du_31"), self._velocity_field[1, 0, 0](2) - self._velocity_field[-1, 0, 0](2)), + Assignment(sp.Symbol("du_32"), self._velocity_field[0, 1, 0](2) - self._velocity_field[0, -1, 0](2)), + Assignment(sp.Symbol("du_33"), self._velocity_field[0, 0, 1](2) - self._velocity_field[0, 0, -1](2))] + + sr = [Assignment(sp.Symbol("SR1"), 2.0 * sp.Symbol("du_11")), + Assignment(sp.Symbol("SR2"), 2.0 * sp.Symbol("du_22")), + Assignment(sp.Symbol("SR3"), 2.0 * sp.Symbol("du_33")), + Assignment(sp.Symbol("SR4"), sp.Symbol("du_12") + sp.Symbol("du_21")), + Assignment(sp.Symbol("SR5"), sp.Symbol("du_13") + sp.Symbol("du_31")), + Assignment(sp.Symbol("SR6"), sp.Symbol("du_23") + sp.Symbol("du_32"))] + moments = [Assignment(X_M1, f[FM00] + f[FMM0] + f[FMP0] + f[FM0M] + f[FM0P]), Assignment(X_P1, f[FP00] + f[FPP0] + f[FPM0] + f[FP0P] + f[FP0M]), Assignment(X_0, @@ -449,12 +477,12 @@ class RecursiveRegularisedLbMethod(AbstractLbMethod): Assignment(RReq[M022], RReq[M020] * RReq[M002])] neq = [ - Assignment(RRneq[M200], RR[M200] - RReq[M200]), - Assignment(RRneq[M020], RR[M020] - RReq[M020]), - Assignment(RRneq[M002], RR[M002] - RReq[M002]), - Assignment(RRneq[M110], RR[M110] - RReq[M110]), - Assignment(RRneq[M101], RR[M101] - RReq[M101]), - Assignment(RRneq[M011], RR[M011] - RReq[M011]), + Assignment(RRneq[M200], (RR[M200] - RReq[M200]) * sigma + (sp.Integer(1) - sigma) * (-taup * sp.Symbol("SR1"))), + Assignment(RRneq[M020], (RR[M020] - RReq[M020]) * sigma + (sp.Integer(1) - sigma) * (-taup * sp.Symbol("SR2"))), + Assignment(RRneq[M002], (RR[M002] - RReq[M002]) * sigma + (sp.Integer(1) - sigma) * (-taup * sp.Symbol("SR3"))), + Assignment(RRneq[M110], (RR[M110] - RReq[M110]) * sigma + (sp.Integer(1) - sigma) * (-taup * sp.Symbol("SR4"))), + Assignment(RRneq[M101], (RR[M101] - RReq[M101]) * sigma + (sp.Integer(1) - sigma) * (-taup * sp.Symbol("SR5"))), + Assignment(RRneq[M011], (RR[M011] - RReq[M011]) * sigma + (sp.Integer(1) - sigma) * (-taup * sp.Symbol("SR6"))), Assignment(RRneq[M210], u[1] * RRneq[M200] + 2.0 * u[0] * RRneq[M110]), Assignment(RRneq[M201], u[2] * RRneq[M200] + 2.0 * u[0] * RRneq[M101]), @@ -572,7 +600,7 @@ class RecursiveRegularisedLbMethod(AbstractLbMethod): Assignment(d[F0MM], sp.Rational(1, 2) * rho * (- RMcoll[M021] - RMcoll[M012]) + tmp6), ] - subexpressions = list(additional_subexpressions) + cqe.all_assignments + moments + eq_moments + neq + col + subexpressions = list(additional_subexpressions) + gradient + sr + cqe.all_assignments + moments + eq_moments + neq + col ac = AssignmentCollection(subexpressions=subexpressions, main_assignments=main) ac = ac.new_without_unused_subexpressions()