Skip to content
Snippets Groups Projects
Commit b8784c07 authored by Franck Pérignon's avatar Franck Pérignon
Browse files

Add methods to serialize the problem and restart a simulation from a file

parent c2d1d5fc
No related branches found
No related tags found
No related merge requests found
...@@ -31,7 +31,7 @@ class Problem(object): ...@@ -31,7 +31,7 @@ class Problem(object):
return object.__new__(cls, *args, **kw) return object.__new__(cls, *args, **kw)
@debug @debug
def __init__(self, operators, simulation, monitors=[]): def __init__(self, operators, simulation, monitors=[], name=None):
""" """
Create a transport problem instance. Create a transport problem instance.
...@@ -39,6 +39,7 @@ class Problem(object): ...@@ -39,6 +39,7 @@ class Problem(object):
@param simulation : a parmepy.simulation.Simulation object @param simulation : a parmepy.simulation.Simulation object
to describe simulation parameters. to describe simulation parameters.
@param monitors : list of monitors. @param monitors : list of monitors.
@param name : an id for the problem
""" """
## Problem operators ## Problem operators
self.operators = operators self.operators = operators
...@@ -57,6 +58,16 @@ class Problem(object): ...@@ -57,6 +58,16 @@ class Problem(object):
## A list of variables that must be initialized before ## A list of variables that must be initialized before
## any call to op.apply() ## any call to op.apply()
self.input = [] 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 @debug
def setUp(self): def setUp(self):
...@@ -125,6 +136,8 @@ class Problem(object): ...@@ -125,6 +136,8 @@ class Problem(object):
for op in self.operators: for op in self.operators:
op.apply(self.simulation) op.apply(self.simulation)
self.simulation.advance() self.simulation.advance()
if self.simulation.currentIteration % self.dumpFreq is 0:
self.dump()
@debug @debug
def finalize(self): def finalize(self):
...@@ -158,33 +171,47 @@ class Problem(object): ...@@ -158,33 +171,47 @@ class Problem(object):
return s return s
def dump(self, filename): def dump(self, filename=None):
""" """
Serialize some data of the problem to file Serialize some data of the problem to file
(only data required for a proper restart, namely fields in self.input (only data required for a proper restart, namely fields in self.input
and simulation). and simulation).
@param filename : prefix for output file. Real name = filename_rk_N, @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) if filename is not None:
db = NumPyDB_cPickle(filedump, mode='store') self.filename = filename
self._filedump = filename + '_rk_' + str(main_rank)
db = NumPyDB_cPickle(self._filedump, mode='store')
db.dump(self.simulation, 'simulation') db.dump(self.simulation, 'simulation')
for v in self.input: 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. Load serialized data to restart from a previous state.
self.input variables and simulation are loaded. self.input variables and simulation are loaded.
@param filename : prefix for downloaded file. @param filename : prefix for downloaded file.
Real name = filename_rk_N, N being current process number. 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) if filename is not None:
db = NumPyDB_cPickle(filedump, mode='load') 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 = db.load('simulation')[0]
self.simulation.reset() self.simulation.reset()
for v in self.input: 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__": if __name__ == "__main__":
print __doc__ print __doc__
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment