From b8784c0774b81ca25039512b32e6ef60b05f02f5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Franck=20P=C3=A9rignon?= <franck.perignon@imag.fr>
Date: Fri, 24 May 2013 12:45:05 +0000
Subject: [PATCH] Add methods to serialize the problem and restart a simulation
 from a file

---
 HySoP/hysop/problem/problem.py | 47 ++++++++++++++++++++++++++--------
 1 file changed, 37 insertions(+), 10 deletions(-)

diff --git a/HySoP/hysop/problem/problem.py b/HySoP/hysop/problem/problem.py
index 2d7e841ac..a622b07c9 100644
--- a/HySoP/hysop/problem/problem.py
+++ b/HySoP/hysop/problem/problem.py
@@ -31,7 +31,7 @@ class Problem(object):
         return object.__new__(cls, *args, **kw)
 
     @debug
-    def __init__(self, operators, simulation, monitors=[]):
+    def __init__(self, operators, simulation, monitors=[], name=None):
         """
         Create a transport problem instance.
 
@@ -39,6 +39,7 @@ class Problem(object):
         @param simulation : a parmepy.simulation.Simulation object
         to describe simulation parameters.
         @param monitors : list of monitors.
+        @param name : an id for the problem
         """
         ## Problem operators
         self.operators = operators
@@ -57,6 +58,16 @@ class Problem(object):
         ## A list of variables that must be initialized before
         ## any call to op.apply()
         self.input = []
+        ## call to problem.dump frequency during apply. 0 means never.
+        self.dumpFreq = 0
+        ## Id for the problem. Used for dump file name.
+        if name is None:
+            self.name = 'parmesPb'
+        else:
+            self.name = name
+        ## Default file name prefix for dump.
+        self.filename = str(name)
+        self._filedump = self.filename + '_rk_' + str(main_rank)
 
     @debug
     def setUp(self):
@@ -125,6 +136,8 @@ class Problem(object):
                 for op in self.operators:
                     op.apply(self.simulation)
                 self.simulation.advance()
+                if self.simulation.currentIteration % self.dumpFreq is 0:
+                    self.dump()
 
     @debug
     def finalize(self):
@@ -158,33 +171,47 @@ class Problem(object):
 
         return s
 
-    def dump(self, filename):
+    def dump(self, filename=None):
         """
         Serialize some data of the problem to file
         (only data required for a proper restart, namely fields in self.input
         and simulation).
         @param filename : prefix for output file. Real name = filename_rk_N,
-        N being current process number.
+        N being current process number. If None use default value from problem
+        parameters (self.filename)
         """
-        filedump = filename + '_rk_' + str(main_rank)
-        db = NumPyDB_cPickle(filedump, mode='store')
+        if filename is not None:
+            self.filename = filename
+            self._filedump = filename + '_rk_' + str(main_rank)
+        db = NumPyDB_cPickle(self._filedump, mode='store')
         db.dump(self.simulation, 'simulation')
         for v in self.input:
-            v.dump(filename, mode='append')
+            v.dump(self.filename, mode='append')
 
-    def restart(self, filename):
+    def restart(self, filename=None):
         """
         Load serialized data to restart from a previous state.
         self.input variables and simulation are loaded.
         @param  filename : prefix for downloaded file.
         Real name = filename_rk_N, N being current process number.
+        If None use default value from problem
+        parameters (self.filename)
         """
-        filedump = filename + '_rk_' + str(main_rank)
-        db = NumPyDB_cPickle(filedump, mode='load')
+        if filename is not None:
+            self.filename = filename
+            self._filedump = filename + '_rk_' + str(main_rank)
+        db = NumPyDB_cPickle(self._filedump, mode='load')
         self.simulation = db.load('simulation')[0]
         self.simulation.reset()
         for v in self.input:
-            v.load(filename)
+            v.load(self.filename)
+
+    def setDumpFreq(self, freq):
+        """
+        set rate of problem.dump call (every 'rate' iteration)
+        @param rate : the frequency of output
+        """
+        self.dumpFreq = freq
 
 if __name__ == "__main__":
     print __doc__
-- 
GitLab