From 4dcd5ffdc67a755ef90e26f8f022bd25dcb6b2f3 Mon Sep 17 00:00:00 2001
From: markus <markus.holzer@fau.de>
Date: Wed, 10 Jun 2020 18:22:42 +0200
Subject: [PATCH] removed deprecated mrt3 method

---
 lbmpy/creationfunctions.py         |  6 +---
 lbmpy/methods/__init__.py          |  4 +--
 lbmpy/methods/creationfunctions.py | 57 +-----------------------------
 lbmpy/methods/momentbased.py       | 15 +++++---
 4 files changed, 15 insertions(+), 67 deletions(-)

diff --git a/lbmpy/creationfunctions.py b/lbmpy/creationfunctions.py
index 3c361bc2..3e668e68 100644
--- a/lbmpy/creationfunctions.py
+++ b/lbmpy/creationfunctions.py
@@ -26,7 +26,6 @@ General:
       the same rate. Literature values of this list can be obtained through
       :func:`lbmpy.methods.creationfunctions.mrt_orthogonal_modes_literature`.
       See also :func:`lbmpy.methods.create_mrt_orthogonal`
-    - ``mrt3``: deprecated
     - ``mrt_raw``: non-orthogonal MRT where all relaxation rates can be specified independently i.e. there are as many
       relaxation rates as stencil entries. Look at the generated method in Jupyter to see which moment<->relaxation rate
       mapping (:func:`lbmpy.methods.create_mrt_raw`)
@@ -182,8 +181,7 @@ from lbmpy.fieldaccess import (
     EsoTwistEvenTimeStepAccessor, EsoTwistOddTimeStepAccessor, PdfFieldAccessor,
     PeriodicTwoFieldsAccessor, StreamPullTwoFieldsAccessor, StreamPushTwoFieldsAccessor)
 from lbmpy.fluctuatinglb import add_fluctuations_to_collision_rule
-from lbmpy.methods import (
-    create_mrt3, create_mrt_orthogonal, create_mrt_raw, create_srt, create_trt, create_trt_kbc)
+from lbmpy.methods import (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
 from lbmpy.methods.entropic import add_entropy_condition, add_iterative_entropy_condition
@@ -434,8 +432,6 @@ def create_lb_method(**params):
                                        nested_moments=nested_moments, **common_params)
     elif method_name.lower() == 'mrt_raw':
         method = create_mrt_raw(stencil_entries, relaxation_rates, **common_params)
-    elif method_name.lower() == 'mrt3':
-        method = create_mrt3(stencil_entries, relaxation_rates, **common_params)
     elif method_name.lower().startswith('trt-kbc-n'):
         if have_same_entries(stencil_entries, get_stencil("D2Q9")):
             dim = 2
diff --git a/lbmpy/methods/__init__.py b/lbmpy/methods/__init__.py
index e14d6fb2..a3a16f15 100644
--- a/lbmpy/methods/__init__.py
+++ b/lbmpy/methods/__init__.py
@@ -1,5 +1,5 @@
 from lbmpy.methods.creationfunctions import (
-    create_mrt3, create_mrt_orthogonal, create_mrt_raw, create_srt, create_trt, create_trt_kbc,
+    create_mrt_orthogonal, create_mrt_raw, create_srt, create_trt, create_trt_kbc,
     create_trt_with_magic_number, create_with_continuous_maxwellian_eq_moments,
     create_with_discrete_maxwellian_eq_moments, mrt_orthogonal_modes_literature)
 from lbmpy.methods.momentbased import (
@@ -10,6 +10,6 @@ from .conservedquantitycomputation import DensityVelocityComputation
 __all__ = ['RelaxationInfo', 'AbstractLbMethod',
            'AbstractConservedQuantityComputation', 'DensityVelocityComputation', 'MomentBasedLbMethod',
            'create_srt', 'create_trt', 'create_trt_with_magic_number', 'create_trt_kbc',
-           'create_mrt_orthogonal', 'create_mrt_raw', 'create_mrt3',
+           'create_mrt_orthogonal', 'create_mrt_raw',
            'create_with_continuous_maxwellian_eq_moments', 'create_with_discrete_maxwellian_eq_moments',
            'mrt_orthogonal_modes_literature']
diff --git a/lbmpy/methods/creationfunctions.py b/lbmpy/methods/creationfunctions.py
index 3ccc08e5..a6c4a02f 100644
--- a/lbmpy/methods/creationfunctions.py
+++ b/lbmpy/methods/creationfunctions.py
@@ -17,7 +17,7 @@ from lbmpy.methods.cumulantbased import CumulantBasedLbMethod
 from lbmpy.methods.momentbased import MomentBasedLbMethod
 from lbmpy.moments import (
     MOMENT_SYMBOLS, discrete_moment, exponents_to_polynomial_representations,
-    get_default_moment_set_for_stencil, get_order, gram_schmidt, is_even, moments_of_order,
+    get_default_moment_set_for_stencil, gram_schmidt, is_even, moments_of_order,
     moments_up_to_component_order, sort_moments_into_groups_of_same_order, is_bulk_moment, is_shear_moment)
 from lbmpy.relaxationrates import relaxation_rate_from_magic_number
 from lbmpy.stencils import get_stencil
@@ -235,61 +235,6 @@ def create_mrt_raw(stencil, relaxation_rates, maxwellian_moments=False, **kwargs
         return create_with_discrete_maxwellian_eq_moments(stencil, rr_dict, **kwargs)
 
 
-def create_mrt3(stencil, relaxation_rates, maxwellian_moments=False, **kwargs):
-    """Creates a MRT with three relaxation times.
-
-    The first rate controls viscosity, the second the bulk viscosity and the last is used to relax higher order moments.
-    """
-    warn("create_mrt3 is deprecated. It uses non-orthogonal moments, use create_mrt instead", DeprecationWarning)
-
-    def product(iterable):
-        return reduce(operator.mul, iterable, 1)
-
-    if isinstance(stencil, str):
-        stencil = get_stencil(stencil)
-
-    dim = len(stencil[0])
-    the_moment = MOMENT_SYMBOLS[:dim]
-
-    shear_tensor_off_diagonal = [product(t) for t in itertools.combinations(the_moment, 2)]
-    shear_tensor_diagonal = [m_i * m_i for m_i in the_moment]
-    shear_tensor_trace = sum(shear_tensor_diagonal)
-    shear_tensor_trace_free_diagonal = [dim * d - shear_tensor_trace for d in shear_tensor_diagonal]
-
-    rest = [default_moment for default_moment in get_default_moment_set_for_stencil(stencil) 
-            if get_order(default_moment) != 2]
-
-    d = shear_tensor_off_diagonal + shear_tensor_trace_free_diagonal[:-1]
-    t = [shear_tensor_trace]
-    q = rest
-
-    if 'magic_number' in kwargs:
-        magic_number = kwargs['magic_number']
-    else:
-        magic_number = sp.Rational(3, 16)
-
-    if len(relaxation_rates) == 1:
-        relaxation_rates = [relaxation_rates[0],
-                            relaxation_rate_from_magic_number(relaxation_rates[0], magic_number=magic_number),
-                            1]
-    elif len(relaxation_rates) == 2:
-        relaxation_rates = [relaxation_rates[0],
-                            relaxation_rate_from_magic_number(relaxation_rates[0], magic_number=magic_number),
-                            relaxation_rates[1]]
-
-    relaxation_rates = [relaxation_rates[0]] * len(d) + \
-                       [relaxation_rates[1]] * len(t) + \
-                       [relaxation_rates[2]] * len(q)
-
-    all_moments = d + t + q
-    moment_to_rr = OrderedDict((m, rr) for m, rr in zip(all_moments, relaxation_rates))
-
-    if maxwellian_moments:
-        return create_with_continuous_maxwellian_eq_moments(stencil, moment_to_rr, **kwargs)
-    else:
-        return create_with_discrete_maxwellian_eq_moments(stencil, moment_to_rr, **kwargs)
-
-
 def create_trt_kbc(dim, shear_relaxation_rate, higher_order_relaxation_rate, method_name='KBC-N4',
                    maxwellian_moments=False, **kwargs):
     """
diff --git a/lbmpy/methods/momentbased.py b/lbmpy/methods/momentbased.py
index fc07538e..3a6bb217 100644
--- a/lbmpy/methods/momentbased.py
+++ b/lbmpy/methods/momentbased.py
@@ -89,7 +89,7 @@ class MomentBasedLbMethod(AbstractLbMethod):
         return sp.Matrix([eq.rhs for eq in equilibrium.main_assignments])
 
     def get_collision_rule(self, conserved_quantity_equations=None, keep_rrs_symbolic=True):
-        d = sp.diag(*self.relaxation_rates)
+        d = self.relaxation_matrix
         relaxation_rate_sub_expressions, d = self._generate_relaxation_matrix(d, keep_rrs_symbolic)
         ac = self._collision_rule_with_relaxation_matrix(d, relaxation_rate_sub_expressions,
                                                          True, conserved_quantity_equations)
@@ -119,19 +119,26 @@ class MomentBasedLbMethod(AbstractLbMethod):
     @property
     def collision_matrix(self):
         pdfs_to_moments = self.moment_matrix
-        relaxation_matrix = sp.diag(*self.relaxation_rates)
-        return pdfs_to_moments.inv() * relaxation_matrix * pdfs_to_moments
+        d = self.relaxation_matrix
+        return pdfs_to_moments.inv() * d * pdfs_to_moments
 
     @property
     def inverse_collision_matrix(self):
         pdfs_to_moments = self.moment_matrix
-        inverse_relaxation_matrix = sp.diag(*[1 / e for e in self.relaxation_rates])
+        inverse_relaxation_matrix = self.relaxation_matrix.inv()
         return pdfs_to_moments.inv() * inverse_relaxation_matrix * pdfs_to_moments
 
     @property
     def moment_matrix(self):
         return moment_matrix(self.moments, self.stencil)
 
+    @property
+    def relaxation_matrix(self):
+        d = sp.zeros(len(self.relaxation_rates))
+        for i in range(0, len(self.relaxation_rates)):
+            d[i, i] = self.relaxation_rates[i]
+        return d
+
     @property
     def is_orthogonal(self):
         return (self.moment_matrix * self.moment_matrix.T).is_diagonal()
-- 
GitLab