From c9b0d0c64e92831a280136b4882b171037385965 Mon Sep 17 00:00:00 2001
From: Chloe Mimeau <Chloe.Mimeau@imag.fr>
Date: Wed, 27 Nov 2013 14:22:19 +0000
Subject: [PATCH] Fixed bug in Simulation class and poisson_fft

---
 Examples/TaylorGreen3D.py                    | 59 ++++++++++----------
 Examples/dataTG.py                           |  4 +-
 HySoP/hysop/operator/discrete/poisson_fft.py |  3 +-
 HySoP/hysop/problem/simulation.py            | 36 ++++++------
 4 files changed, 48 insertions(+), 54 deletions(-)

diff --git a/Examples/TaylorGreen3D.py b/Examples/TaylorGreen3D.py
index 6a8a3dc31..7cab07e80 100755
--- a/Examples/TaylorGreen3D.py
+++ b/Examples/TaylorGreen3D.py
@@ -25,7 +25,7 @@ from parmepy.operator.monitors.energy_enstrophy import Energy_enstrophy
 from parmepy.problem.simulation import Simulation
 from dataTG import dim, nb, NBGHOSTS, ADVECTION_METHOD, \
     VISCOSITY, OUTPUT_FREQ, FILENAME, PROJ, LCFL, CFL, \
-    TIMESTEP_METHOD, IS_ADAPTATIVE
+    TIMESTEP_METHOD
 
 ## ----------- A 3d problem -----------
 print " ========= Start Navier-Stokes 3D (Taylor Green benchmark) ========="
@@ -123,10 +123,7 @@ distrPoissTimeStep = Redistribute([velo, vorti], poisson, dtAdapt)
 ## Simulation
 simu = Simulation(tinit=0.0,
                   tend=10., timeStep=dt_adapt,
-                  isAdaptative=IS_ADAPTATIVE,
-                  iterMax=1000000,
-                  bridgeOp=distrPoissTimeStep,
-                  computeTimeStepOp=dtAdapt)
+                  iterMax=1000000)
 
 #  Define the problem to solve
 pb = NSProblem(operators=[distrPoiStr_velo, advec,  # Redistribute while advec
@@ -134,7 +131,9 @@ pb = NSProblem(operators=[distrPoiStr_velo, advec,  # Redistribute while advec
                           stretch,
                           distrStrDiff,
                           diffusion,
-                          poisson],
+                          poisson,
+                          distrPoissTimeStep,
+                          dtAdapt],
                simulation=simu, dumpFreq=-1)
 
 ## Setting solver to Problem (only operators for computational tasks)
@@ -157,36 +156,34 @@ vorti.setTopoInit(topofft)
 velo.setTopoInit(topofft)
 pb.addMonitors([energy])
 pb.setUp()
-dtAdapt.discretize()
-dtAdapt.setUp()
-distrPoissTimeStep.setUp()
 
 
 def run():
 # =====Automatic problem launch=====
-#    pb.solve()
+    pb.solve()
 # =====Manually problem launch=====
-    print "\n\n Start solving ..."
-    while not simu.isOver:
-        distrPoiStr_velo.apply(simu)
-        subSimu = Simulation(tinit=simu.time, tend=10., timeStep=simu.timeStep_variable,
-                             isAdaptative=False, iterMax=2, bridgeOp=distrPoissTimeStep,
-                             computeTimeStepOp=dtAdapt)
-        subSimu.timeStep = subSimu.timeStep_variable.data[0]/2.0
-        simu.printState()
-        while not subSimu.isOver:
-            subSimu.printState()
-            advec.apply(subSimu)
-            poisson.apply(subSimu)
-            subSimu.advance()
-        distrAdvStr_vorti.apply(simu)
-        stretch.apply(simu)
-        distrStrDiff.apply(simu)
-        diffusion.apply(simu)
-        poisson.apply(simu)
-        energy.apply(simu)
-
-        simu.advance()
+#    print "\n\n Start solving ..."
+#    while not simu.isOver:
+#        distrPoiStr_velo.apply(simu)
+#        subSimu = Simulation(tinit=simu.time, tend=10., timeStep=simu.timeStep_variable,
+#                             iterMax=2)
+#        subSimu.timeStep = subSimu.timeStep_variable.data[0]/2.0
+#        simu.printState()
+#        while not subSimu.isOver:
+#            subSimu.printState()
+#            advec.apply(subSimu)
+#            poisson.apply(subSimu)
+#            subSimu.advance()
+#        distrAdvStr_vorti.apply(simu)
+#        stretch.apply(simu)
+#        distrStrDiff.apply(simu)
+#        diffusion.apply(simu)
+#        poisson.apply(simu)
+#        distrPoissTimeStep.apply(simu)
+#        dtAdapt.apply(simu)
+#        energy.apply(simu)
+
+#        simu.advance()
 
 ## Solve problem
 from parmepy.mpi import MPI
diff --git a/Examples/dataTG.py b/Examples/dataTG.py
index 9d0475009..d866682ee 100644
--- a/Examples/dataTG.py
+++ b/Examples/dataTG.py
@@ -10,11 +10,9 @@ from parmepy.numerics.remeshing import L6_4 as rmsh
 # problem dimension
 dim = 3
 # resolution
-nb = 257
+nb = 33
 # number of ghosts in usual cartesian topo
 NBGHOSTS = 2
-# is the time step adaptative during the simulation ?
-IS_ADAPTATIVE = True
 # Adaptative timestep method
 # For the "dtAdvecCrit" key, the possible choices are the following:
 # 'vort' : def of dt_advection based on infinite norm of vorticity, 
diff --git a/HySoP/hysop/operator/discrete/poisson_fft.py b/HySoP/hysop/operator/discrete/poisson_fft.py
index f5d66c5e6..4d5350e90 100644
--- a/HySoP/hysop/operator/discrete/poisson_fft.py
+++ b/HySoP/hysop/operator/discrete/poisson_fft.py
@@ -69,7 +69,8 @@ class PoissonFFT(DiscreteOperator):
 
         elif self.case is '3D':
             #=== SOLENOIDAL PROJECTION OF VORTICITY FIELD ===
-            if (self.projection[0] and ite % self.projection[1] == 0):
+            if (self.projection is not None and self.projection[0] \
+                and ite % self.projection[1] == 0):
                 self.vorticity.data[0], self.vorticity.data[1], \
                     self.vorticity.data[2] = \
                     fftw2py.projection_om_3d(self.vorticity.data[0],
diff --git a/HySoP/hysop/problem/simulation.py b/HySoP/hysop/problem/simulation.py
index f92cf00c9..8cddd3fbf 100644
--- a/HySoP/hysop/problem/simulation.py
+++ b/HySoP/hysop/problem/simulation.py
@@ -5,6 +5,7 @@ Description of the simulation parameters (time, iteration ...)
 """
 from parmepy.mpi import main_rank
 from parmepy.numerics.differential_operations import GradV
+from parmepy.variables.variables import Variables
 from parmepy.numerics.finite_differences import FD_C_4
 from parmepy.numerics.integrators.euler import Euler
 from parmepy.numerics.integrators.runge_kutta2 import RK2
@@ -21,8 +22,7 @@ class Simulation(object):
     Setup for simulation parameters.
     """
 
-    def __init__(self, tinit=0.0, tend=1.0, timeStep=None, iterMax=100,
-                 isAdaptative=False, bridgeOp=None, computeTimeStepOp=None):
+    def __init__(self, tinit=0.0, tend=1.0, timeStep=0.01, iterMax=100):
         """
         Creates a Timer.
 
@@ -51,22 +51,25 @@ class Simulation(object):
         self.isOver = False
         ## Iteration counter
         self.currentIteration = 1
-        ## Is the time step adaptative during the simulation ?
-        self.isAdaptative = isAdaptative
         ## Simulation time step variable
-        self.timeStep_variable = timeStep
-        ## Simulation time step value
-        self.timeStep = timeStep.data[0]
+        if (isinstance(timeStep, Variables)):
+            ## Set isAdaptative to True
+            self.isAdaptative = True
+            ## Simulation time step variable
+            self.timeStep_variable = timeStep
+            ## Simulation time step adaptative value
+            self.timeStep = timeStep.data[0]
+            ## Save the initial timestep value
+            self.timeStepInit = timeStep.data[0]
+        else :
+            ## Set isAdaptative to False
+            self.isAdaptative = False
+            ## Simulation time step fixed value
+            self.timeStep = timeStep
+
         ## Maximum number of iterations
         self.iterMax = iterMax
         self._lastStep = False
-        ## Initializations for an adaptative-timestep-based simulation
-        if self.isAdaptative:
-            ## Initialization of the redistribute operator
-            self.bridgeOp = bridgeOp
-            ## Initialization of the operator computing the adaptative dt
-            self.computeTimeStepOp = computeTimeStepOp
-            self.timeStepInit = timeStep.data[0]
 
     def advance(self):
         """
@@ -85,11 +88,6 @@ class Simulation(object):
                 if self.time >= self.end:
                     self._lastStep = True
                 if self.time>= self.timeStepInit:
-                    # Redistribute values between the different topologies
-                    self.bridgeOp.apply(self)
-                    self.bridgeOp.wait()
-                    # Computation of the adaptative time step
-                    self.computeTimeStepOp.apply(self)
                     self.timeStep = self.timeStep_variable.data[0]
             # Simulation with fixed time step
             if self.currentIteration < self.iterMax:
-- 
GitLab