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