# HG changeset patch
# User paugier <pierre.augier@ens-lyon.org>
# Date 1538750994 -7200
#      Fri Oct 05 16:49:54 2018 +0200
# Node ID c75e601242de70bd078ada2a05822a5b63f838ba
# Parent  0beb95096e326feba96dd3a69c01d96270e2680b
Option FLUIDSIM_USE_FLUIDPYTHRAN

diff --git a/fluidsim/base/time_stepping/pseudo_spect.py b/fluidsim/base/time_stepping/pseudo_spect.py
--- a/fluidsim/base/time_stepping/pseudo_spect.py
+++ b/fluidsim/base/time_stepping/pseudo_spect.py
@@ -20,9 +20,8 @@
 
 """
 
-from builtins import object
-
 from warnings import warn
+import os
 
 import numpy as np
 
@@ -112,6 +111,19 @@
         if params_ts.type_time_scheme not in ["RK2", "RK4"]:
             raise ValueError("Problem name time_scheme")
 
+        self._state_spect_tmp = np.empty_like(self.sim.state.state_spect)
+
+        if params_ts.type_time_scheme == "RK4":
+            self._state_spect_tmp1 = np.empty_like(self.sim.state.state_spect)
+
+        if os.environ.get("FLUIDSIM_USE_FLUIDPYTHRAN", False):
+            if params_ts.type_time_scheme == "RK2":
+                time_step_RK = self._time_step_RK2_fluidpythran
+            else:
+                time_step_RK = self._time_step_RK4_fluidpythran
+            self._time_step_RK = time_step_RK
+            return
+
         dtype = self.freq_lin.dtype
         if dtype == np.float64:
             str_type = "float"
@@ -142,9 +154,6 @@
 
         exec("self._time_step_RK = self." + name_function, globals(), locals())
 
-        self._state_spect_tmp = np.empty_like(self.sim.state.state_spect)
-        self._state_spect_tmp1 = np.empty_like(self.sim.state.state_spect)
-
     def _compute_freq_complex(self):
         state_spect = self.sim.state.state_spect
         freq_complex = np.empty_like(state_spect)
@@ -261,6 +270,24 @@
             #     float64[][] diss2;
             #     float dt
             # )
+
+            # pythran block (
+            #     complex128[][][] state_spect_n12, state_spect, tendencies_n;
+            #     complex128[][][] diss2;
+            #     float dt
+            # )
+
+            # pythran block (
+            #     complex128[][][] state_spect_n12, state_spect, tendencies_n;
+            #     float64[][][] diss2;
+            #     float dt
+            # )
+
+            # pythran block (
+            #     complex128[][][][] state_spect_n12, state_spect, tendencies_n;
+            #     float64[][][] diss2;
+            #     float dt
+            # )
             state_spect_n12[:] = (state_spect + dt / 2 * tendencies_n) * diss2
 
         tendencies_n12 = compute_tendencies(state_spect_n12, old=tendencies_n)
@@ -273,6 +300,24 @@
             #     float64[][] diss, diss2;
             #     float dt
             # )
+
+            # pythran block (
+            #     complex128[][][] state_spect, tendencies_n12;
+            #     complex128[][][] diss, diss2;
+            #     float dt
+            # )
+
+            # pythran block (
+            #     complex128[][][] state_spect, tendencies_n12;
+            #     float64[][][] diss, diss2;
+            #     float dt
+            # )
+
+            # pythran block (
+            #     complex128[][][][] state_spect, tendencies_n12;
+            #     float64[][][] diss, diss2;
+            #     float dt
+            # )
             state_spect[:] = state_spect * diss + dt * diss2 * tendencies_n12
 
     def _time_step_RK4(self):
@@ -429,6 +474,27 @@
             #     float64[][] diss, diss2;
             #     float dt
             # )
+
+            # pythran block (
+            #     complex128[][][] state_spect, state_spect_tmp,
+            #                      tendencies_0, state_spect_np12_approx1;
+            #     complex128[][][] diss, diss2;
+            #     float dt
+            # )
+
+            # pythran block (
+            #     complex128[][][] state_spect, state_spect_tmp,
+            #                      tendencies_0, state_spect_np12_approx1;
+            #     float64[][][] diss, diss2;
+            #     float dt
+            # )
+
+            # pythran block (
+            #     complex128[][][][] state_spect, state_spect_tmp,
+            #                      tendencies_0, state_spect_np12_approx1;
+            #     float64[][][] diss, diss2;
+            #     float dt
+            # )
             state_spect_tmp[:] = (state_spect + dt / 6 * tendencies_0) * diss
             state_spect_np12_approx1[:] = (
                 state_spect + dt / 2 * tendencies_0
@@ -451,6 +517,27 @@
             #     float64[][] diss2;
             #     float dt
             # )
+
+            # pythran block (
+            #     complex128[][][] state_spect, state_spect_tmp,
+            #                      state_spect_np12_approx2, tendencies_1;
+            #     complex128[][][] diss2;
+            #     float dt
+            # )
+
+            # pythran block (
+            #     complex128[][][] state_spect, state_spect_tmp,
+            #                      state_spect_np12_approx2, tendencies_1;
+            #     float64[][][] diss2;
+            #     float dt
+            # )
+
+            # pythran block (
+            #     complex128[][][][] state_spect, state_spect_tmp,
+            #                      state_spect_np12_approx2, tendencies_1;
+            #     float64[][][] diss2;
+            #     float dt
+            # )
             state_spect_tmp[:] += dt / 3 * diss2 * tendencies_1
             state_spect_np12_approx2[:] = (
                 state_spect * diss2 + dt / 2 * tendencies_1
@@ -473,6 +560,27 @@
             #     float64[][] diss, diss2;
             #     float dt
             # )
+
+            # pythran block (
+            #     complex128[][][] state_spect, state_spect_tmp,
+            #                      state_spect_np1_approx, tendencies_2;
+            #     complex128[][][] diss, diss2;
+            #     float dt
+            # )
+
+            # pythran block (
+            #     complex128[][][] state_spect, state_spect_tmp,
+            #                      state_spect_np1_approx, tendencies_2;
+            #     float64[][][] diss, diss2;
+            #     float dt
+            # )
+
+            # pythran block (
+            #     complex128[][][][] state_spect, state_spect_tmp,
+            #                      state_spect_np1_approx, tendencies_2;
+            #     float64[][][] diss, diss2;
+            #     float dt
+            # )
             state_spect_tmp[:] += dt / 3 * diss2 * tendencies_2
             state_spect_np1_approx[:] = (
                 state_spect * diss + dt * diss2 * tendencies_2
@@ -483,5 +591,16 @@
         )
         del state_spect_np1_approx
 
-        # result using the 4 approximations
-        self.sim.state.state_spect = state_spect_tmp + dt / 6 * tendencies_3
+        if fp.is_pythranized:
+            fp.use_pythranized_block("rk4_step3")
+        else:
+            # result using the 4 approximations
+            # pythran block (
+            #     complex128[][][] state_spect, state_spect_tmp, tendencies_3;
+            #     float dt
+            # )
+            # pythran block (
+            #     complex128[][][][] state_spect, state_spect_tmp, tendencies_3;
+            #     float dt
+            # )
+            state_spect[:] = state_spect_tmp + dt / 6 * tendencies_3
diff --git a/setup.cfg b/setup.cfg
--- a/setup.cfg
+++ b/setup.cfg
@@ -18,3 +18,8 @@
 
 [coverage:xml]
 output = .coverage/coverage.xml
+
+[options]
+setup_requires =
+    fluidpythran
+    numpy
diff --git a/setup.py b/setup.py
--- a/setup.py
+++ b/setup.py
@@ -50,13 +50,10 @@
 
 here = Path(__file__).parent.absolute()
 
-try:
-    from fluidpythran.files_maker import create_pythran_files
-except ImportError:
-    pass
-else:
-    paths = ["fluidsim/base/time_stepping/pseudo_spect.py"]
-    create_pythran_files([here / path for path in paths])
+from fluidpythran.files_maker import create_pythran_files
+
+paths = ["fluidsim/base/time_stepping/pseudo_spect.py"]
+create_pythran_files([here / path for path in paths])
 
 time_start = time()
 config = get_config()