From 282f5239418e7105a82b72291d5e183c8b91d7f9 Mon Sep 17 00:00:00 2001
From: Markus Holzer <markus.holzer@fau.de>
Date: Wed, 10 Feb 2021 09:44:51 +0100
Subject: [PATCH] Fix integration pipeline

---
 .gitignore                                    |  1 +
 ...onserved_quantity_relaxation_invariance.py | 30 ++++++++---
 lbmpy_tests/test_split_optimization.py        | 39 +++++++-------
 lbmpy_tests/test_vectorization.py             | 53 +++++++++----------
 lbmpy_tests/test_version_string.py            |  6 +--
 5 files changed, 73 insertions(+), 56 deletions(-)

diff --git a/.gitignore b/.gitignore
index 14359d22..5c699a12 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,3 +15,4 @@ _local_tmp
 /lbmpy_tests/db
 doc/bibtex.json
 RELEASE-VERSION
+/db
diff --git a/lbmpy_tests/test_conserved_quantity_relaxation_invariance.py b/lbmpy_tests/test_conserved_quantity_relaxation_invariance.py
index 75d52632..3cc8633f 100644
--- a/lbmpy_tests/test_conserved_quantity_relaxation_invariance.py
+++ b/lbmpy_tests/test_conserved_quantity_relaxation_invariance.py
@@ -6,6 +6,7 @@ from copy import copy
 
 import pytest
 import sympy as sp
+import math
 
 from lbmpy.methods.creationfunctions import RelaxationInfo, create_srt, create_trt, create_trt_kbc, \
     create_with_default_polynomial_cumulants
@@ -36,21 +37,38 @@ def __change_relaxation_rate_of_conserved_moments(method, new_relaxation_rate=sp
     return changed_method
 
 
-def check_for_collision_rule_equivalence(collision_rule1, collision_rule2):
+def check_for_collision_rule_equivalence(collision_rule1, collision_rule2, use_numeric_subs=False):
     collision_rule1 = collision_rule1.new_without_subexpressions()
     collision_rule2 = collision_rule2.new_without_subexpressions()
+
+    if use_numeric_subs:
+        free_symbols = collision_rule1.free_symbols
+        free_symbols.update(collision_rule2.free_symbols)
+
+        subs_dict = dict()
+        value = 10.0
+        for symbol in free_symbols:
+            subs_dict.update({symbol: value})
+            value += 1.1
+
+        collision_rule1 = collision_rule1.subs(subs_dict)
+        collision_rule2 = collision_rule2.subs(subs_dict)
+
     for eq1, eq2 in zip(collision_rule1.main_assignments, collision_rule2.main_assignments):
         diff = sp.cancel(sp.expand(eq1.rhs - eq2.rhs))
-        assert diff == 0
+        if use_numeric_subs:
+            assert math.isclose(diff, 0, rel_tol=0.0, abs_tol=1e-12)
+        else:
+            assert diff == 0
 
 
-def check_method_equivalence(m1, m2, do_simplifications):
+def check_method_equivalence(m1, m2, do_simplifications, use_numeric_subs=False):
     cr1 = m1.get_collision_rule()
     cr2 = m2.get_collision_rule()
     if do_simplifications:
         cr1 = create_simplification_strategy(m1)(cr1)
         cr2 = create_simplification_strategy(m2)(cr2)
-    check_for_collision_rule_equivalence(cr1, cr2)
+    check_for_collision_rule_equivalence(cr1, cr2, use_numeric_subs)
 
 
 @pytest.mark.longrun
@@ -60,8 +78,8 @@ def test_cumulant():
         original_method = create_with_default_polynomial_cumulants(stencil, [sp.Symbol("omega")])
         changed_method = __change_relaxation_rate_of_conserved_moments(original_method)
 
-        check_method_equivalence(original_method, changed_method, True)
-        check_method_equivalence(original_method, changed_method, False)
+        check_method_equivalence(original_method, changed_method, True, True)
+        check_method_equivalence(original_method, changed_method, False, True)
 
 
 @pytest.mark.longrun
diff --git a/lbmpy_tests/test_split_optimization.py b/lbmpy_tests/test_split_optimization.py
index dd109380..ffab3b8b 100644
--- a/lbmpy_tests/test_split_optimization.py
+++ b/lbmpy_tests/test_split_optimization.py
@@ -30,27 +30,28 @@ def test_split_number_of_operations():
                 assert op_without_splitting['divs'] == op_with_splitting['divs']
 
 
+@pytest.mark.parametrize('stencil', ['D2Q9', 'D3Q15', 'D3Q19', 'D3Q27'])
+@pytest.mark.parametrize('compressible', [True, False])
+@pytest.mark.parametrize('method', ['srt', 'mrt'])
+@pytest.mark.parametrize('force', [(0, 0, 0), (1e-6, 1e-7, 2e-6)])
 @pytest.mark.longrun
-def test_equivalence():
+def test_equivalence(stencil, compressible, method, force):
     relaxation_rates = [1.8, 1.7, 1.0, 1.0, 1.0, 1.0]
-    for stencil in ['D2Q9', 'D3Q15', 'D3Q19', 'D3Q27']:
-        for compressible in (True, False):
-            for method in ('srt', 'mrt'):
-                for force in ((0, 0, 0), (1e-6, 1e-7, 2e-6)):
-                    clear_cache()
-                    common_params = {'domain_size': (20, 30) if stencil.startswith('D2') else (10, 13, 7),
-                                     'stencil': stencil,
-                                     'method': method,
-                                     'weighted': True,
-                                     'compressible': compressible,
-                                     'force': force,
-                                     'relaxation_rates': relaxation_rates}
-                    print("Running Scenario", common_params)
-                    with_split = create_lid_driven_cavity(optimization={'split': True}, **common_params)
-                    without_split = create_lid_driven_cavity(optimization={'split': False}, **common_params)
-                    with_split.run(100)
-                    without_split.run(100)
-                    np.testing.assert_almost_equal(with_split.velocity_slice(), without_split.velocity_slice())
+    clear_cache()
+    common_params = {'domain_size': (10, 20) if stencil.startswith('D2') else (5, 10, 7),
+                     'stencil': stencil,
+                     'method': method,
+                     'weighted': True,
+                     'compressible': compressible,
+                     'force': force,
+                     'force_model': 'schiller',
+                     'relaxation_rates': relaxation_rates}
+    print("Running Scenario", common_params)
+    with_split = create_lid_driven_cavity(optimization={'split': True}, **common_params)
+    without_split = create_lid_driven_cavity(optimization={'split': False}, **common_params)
+    with_split.run(100)
+    without_split.run(100)
+    np.testing.assert_almost_equal(with_split.velocity_slice(), without_split.velocity_slice())
 
 
 def test_equivalence_short():
diff --git a/lbmpy_tests/test_vectorization.py b/lbmpy_tests/test_vectorization.py
index 0a62d95f..74394552 100644
--- a/lbmpy_tests/test_vectorization.py
+++ b/lbmpy_tests/test_vectorization.py
@@ -23,18 +23,18 @@ def test_lbm_vectorization_short():
     ldc1.run(10)
 
 
+@pytest.mark.parametrize('instruction_set', ['sse', 'avx'])
+@pytest.mark.parametrize('aligned_and_padding', [[False, False], [True, False], [True, True]])
+@pytest.mark.parametrize('nontemporal', [False, True])
+@pytest.mark.parametrize('double_precision', [False, True])
+@pytest.mark.parametrize('fixed_loop_sizes', [False, True])
 @pytest.mark.longrun
-def test_lbm_vectorization():
-    vectorization_options = [{'instruction_set': instruction_set,
-                              'assume_aligned': aa,
-                              'nontemporal': nt,
+def test_lbm_vectorization(instruction_set, aligned_and_padding, nontemporal, double_precision, fixed_loop_sizes):
+    vectorization_options = {'instruction_set': instruction_set,
+                              'assume_aligned': aligned_and_padding[0],
+                              'nontemporal': nontemporal,
                               'assume_inner_stride_one': True,
-                              'assume_sufficient_line_padding': lp,
-                              }
-                             for instruction_set in ('sse', 'avx')
-                             for aa, lp in ([False, False], [True, False], [True, True],)
-                             for nt in (False, True)
-                             ]
+                              'assume_sufficient_line_padding': aligned_and_padding[1]}
     time_steps = 100
     size1 = (64, 32)
     size2 = (666, 34)
@@ -46,25 +46,22 @@ def test_lbm_vectorization():
     ldc2_ref = create_lid_driven_cavity(size2, relaxation_rate=relaxation_rate)
     ldc2_ref.run(time_steps)
 
-    for double_precision in (False, True):
-        for vec_opt in vectorization_options:
-            for fixed_loop_sizes in (True, False):
-                optimization = {'double_precision': double_precision,
-                                'vectorization': vec_opt,
-                                'cse_global': True,
-                                }
-                print("Vectorization test, double precision {}, vectorization {}, fixed loop sizes {}".format(
-                    double_precision, vec_opt, fixed_loop_sizes))
-                ldc1 = create_lid_driven_cavity(size1, relaxation_rate=relaxation_rate, optimization=optimization,
-                                                fixed_loop_sizes=fixed_loop_sizes)
-                ldc1.run(time_steps)
-                np.testing.assert_almost_equal(ldc1_ref.velocity[:, :], ldc1.velocity[:, :])
+    optimization = {'double_precision': double_precision,
+                    'vectorization': vectorization_options,
+                    'cse_global': True,
+                    }
+    print("Vectorization test, double precision {}, vectorization {}, fixed loop sizes {}".format(
+        double_precision, vectorization_options, fixed_loop_sizes))
+    ldc1 = create_lid_driven_cavity(size1, relaxation_rate=relaxation_rate, optimization=optimization,
+                                    fixed_loop_sizes=fixed_loop_sizes)
+    ldc1.run(time_steps)
+    np.testing.assert_almost_equal(ldc1_ref.velocity[:, :], ldc1.velocity[:, :])
 
-                optimization['split'] = True
-                ldc2 = create_lid_driven_cavity(size2, relaxation_rate=relaxation_rate, optimization=optimization,
-                                                fixed_loop_sizes=fixed_loop_sizes)
-                ldc2.run(time_steps)
-                np.testing.assert_almost_equal(ldc2_ref.velocity[:, :], ldc2.velocity[:, :])
+    optimization['split'] = True
+    ldc2 = create_lid_driven_cavity(size2, relaxation_rate=relaxation_rate, optimization=optimization,
+                                    fixed_loop_sizes=fixed_loop_sizes)
+    ldc2.run(time_steps)
+    np.testing.assert_almost_equal(ldc2_ref.velocity[:, :], ldc2.velocity[:, :])
 
 
 if __name__ == '__main__':
diff --git a/lbmpy_tests/test_version_string.py b/lbmpy_tests/test_version_string.py
index b1c0b28f..92320d83 100644
--- a/lbmpy_tests/test_version_string.py
+++ b/lbmpy_tests/test_version_string.py
@@ -1,4 +1,4 @@
-import pystencils as ps
+import lbmpy
 from pathlib import Path
 
 def test_version_string():
@@ -7,6 +7,6 @@ def test_version_string():
     if release_version.exists ():
         with open(release_version, "r") as f:
             version = f.read()
-        assert ps.__version__ == version
+        assert lbmpy.__version__ == version
     else:
-        assert ps.__version__ == "development"
+        assert lbmpy.__version__ == "development"
-- 
GitLab