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