From f887837dd305151920a8e4be6c7b871fcafd99af Mon Sep 17 00:00:00 2001
From: Michael Kuron <m.kuron@gmx.de>
Date: Mon, 25 May 2020 15:38:02 +0200
Subject: [PATCH] Fluctuating MRT: introduce separate relaxation rates

for bulk modes, shear modes, even ghost modes, odd ghost modes
---
 tests/lbm/codegen/FluctuatingMRT.cpp |  2 +-
 tests/lbm/codegen/FluctuatingMRT.py  | 37 +++++++++++++++++++++++++---
 2 files changed, 34 insertions(+), 5 deletions(-)

diff --git a/tests/lbm/codegen/FluctuatingMRT.cpp b/tests/lbm/codegen/FluctuatingMRT.cpp
index 27021afaa..46ceaea05 100644
--- a/tests/lbm/codegen/FluctuatingMRT.cpp
+++ b/tests/lbm/codegen/FluctuatingMRT.cpp
@@ -70,7 +70,7 @@ int main( int argc, char ** argv )
    // create fields
    BlockDataID forceFieldId = field::addToStorage<VectorField_T>( blocks, "Force", real_t( 0.0 ));
 
-   LatticeModel_T latticeModel = LatticeModel_T( forceFieldId, omega, seed, temperature, uint_t(0) );
+   LatticeModel_T latticeModel = LatticeModel_T( forceFieldId, omega, 0, omega, omega, seed, temperature, uint_t(0) );
    BlockDataID pdfFieldId = lbm::addPdfFieldToStorage( blocks, "pdf field", latticeModel, initialVelocity, real_t(1) );
    BlockDataID flagFieldId = field::addFlagFieldToStorage< FlagField_T >( blocks, "flag field" );
 
diff --git a/tests/lbm/codegen/FluctuatingMRT.py b/tests/lbm/codegen/FluctuatingMRT.py
index 350899570..47ae58c98 100644
--- a/tests/lbm/codegen/FluctuatingMRT.py
+++ b/tests/lbm/codegen/FluctuatingMRT.py
@@ -1,6 +1,8 @@
 import sympy as sp
 import pystencils as ps
-from lbmpy.creationfunctions import create_lb_collision_rule
+from lbmpy.creationfunctions import create_lb_collision_rule, create_mrt_orthogonal, force_model_from_string
+from lbmpy.moments import is_bulk_moment, is_shear_moment, get_order
+from lbmpy.stencils import get_stencil
 from pystencils_walberla import CodeGeneration
 from lbmpy_walberla import generate_lattice_model
 
@@ -9,13 +11,40 @@ with CodeGeneration() as ctx:
     temperature = sp.symbols("temperature")
     force_field, vel_field = ps.fields("force(3), velocity(3): [3D]", layout='fzyx')
 
+    def rr_getter(moments):
+        is_shear = [is_shear_moment(m, 3) for m in moments]
+        is_bulk = [is_bulk_moment(m, 3) for m in moments]
+        order = [get_order(m) for m in moments]
+        assert min(order) == max(order)
+        order = order[0]
+
+        if order < 2:
+            return 0
+        elif any(is_bulk):
+            assert all(is_bulk)
+            return sp.Symbol("omega_bulk")
+        elif any(is_shear):
+            assert all(is_shear)
+            return sp.Symbol("omega_shear")
+        elif order % 2 == 0:
+            assert order > 2
+            return sp.Symbol("omega_even")
+        else:
+            return sp.Symbol("omega_odd")
+
+    method = create_mrt_orthogonal(
+        stencil=get_stencil('D3Q19'),
+        compressible=True,
+        weighted=True,
+        relaxation_rate_getter=rr_getter,
+        force_model=force_model_from_string('guo', force_field.center_vector)
+    )
     collision_rule = create_lb_collision_rule(
-        stencil='D3Q19', compressible=True, fluctuating={
+        method,
+        fluctuating={
             'temperature' : temperature,
             'block_offsets' : 'walberla',
         },
-        method='mrt', relaxation_rates=[omega_shear]*19,
-        force_model='guo', force=force_field.center_vector,
         optimization={'cse_global': True}
     )
 
-- 
GitLab