From 659319bddac44d2f5df545121f6b316089431ae8 Mon Sep 17 00:00:00 2001
From: Michael Kuron <mkuron@icp.uni-stuttgart.de>
Date: Thu, 16 Jan 2020 11:52:05 +0100
Subject: [PATCH] Correctly print sp.Abs in generated code

---
 pystencils/backends/cbackend.py | 6 ++++++
 pystencils/cpu/vectorization.py | 4 ++++
 2 files changed, 10 insertions(+)

diff --git a/pystencils/backends/cbackend.py b/pystencils/backends/cbackend.py
index 9efca1f53..cf5843130 100644
--- a/pystencils/backends/cbackend.py
+++ b/pystencils/backends/cbackend.py
@@ -353,6 +353,12 @@ class CustomSympyPrinter(CCodePrinter):
         result = super(CustomSympyPrinter, self)._print_Piecewise(expr)
         return result.replace("\n", "")
 
+    def _print_Abs(self, expr):
+        if expr.is_integer:
+            return 'abs({0})'.format(self._print(expr.args[0]))
+        else:
+            return 'fabs({0})'.format(self._print(expr.args[0]))
+
     def _print_Type(self, node):
         return str(node)
 
diff --git a/pystencils/cpu/vectorization.py b/pystencils/cpu/vectorization.py
index f99c77f2d..12b492cf4 100644
--- a/pystencils/cpu/vectorization.py
+++ b/pystencils/cpu/vectorization.py
@@ -176,6 +176,10 @@ def insert_vector_casts(ast_node):
                                         visit_expr(expr.args[4]))
         elif isinstance(expr, cast_func):
             return expr
+        elif expr.func is sp.Abs:
+            new_arg = visit_expr(expr.args[0])
+            pw = sp.Piecewise((-1 * new_arg, new_arg < 0), (new_arg, True))
+            return visit_expr(pw)
         elif expr.func in handled_functions or isinstance(expr, sp.Rel) or isinstance(expr, BooleanFunction):
             new_args = [visit_expr(a) for a in expr.args]
             arg_types = [get_type_of_expression(a) for a in new_args]
-- 
GitLab