From 202d1a073569d740e9abf188e836dd846c9f5aae Mon Sep 17 00:00:00 2001 From: "Mads M. Pedersen" <mmpe@dtu.dk> Date: Wed, 16 Nov 2016 09:55:19 +0100 Subject: [PATCH] added memory freeing reset function in LogFile and HTCFile --- wetb/hawc2/htc_file.py | 52 ++++++++++++++++++++++++------- wetb/hawc2/log_file.py | 4 ++- wetb/hawc2/simulation.py | 2 ++ wetb/hawc2/tests/test_htc_file.py | 5 +++ wetb/hawc2/tests/test_logfile.py | 11 ++++++- 5 files changed, 61 insertions(+), 13 deletions(-) diff --git a/wetb/hawc2/htc_file.py b/wetb/hawc2/htc_file.py index c769185d..26a04a3c 100644 --- a/wetb/hawc2/htc_file.py +++ b/wetb/hawc2/htc_file.py @@ -38,23 +38,30 @@ class HTCFile(HTCContents, HTCDefaults): level = 0 modelpath = "../" initial_comments = None + _contents = None def __init__(self, filename=None, modelpath="../"): self.modelpath = modelpath - self.contents = OrderedDict() + + + self.filename = filename + + #assert 'simulation' in self.contents, "%s could not be loaded. 'simulation' section missing" % filename + + def _load(self): + self.reset() self.initial_comments = [] self.htc_inputfiles = [] - if filename is None: + self.contents = OrderedDict() + if self.filename is None: self.filename = 'empty.htc' - self.lines = self.empty_htc.split("\n") + lines = self.empty_htc.split("\n") else: - self.filename = filename - self.modelpath = os.path.realpath(os.path.join(os.path.dirname(self.filename), modelpath)) - self.lines = self.readlines(filename) -# with open(filename) as fid: -# self.lines = fid.readlines() - self.lines = [l.strip() for l in self.lines] + self.modelpath = os.path.realpath(os.path.join(os.path.dirname(self.filename), self.modelpath)) + lines = self.readlines(self.filename) + + lines = [l.strip() for l in lines] - lines = copy(self.lines) + #lines = copy(self.lines) while lines: if lines[0].startswith(";"): self.initial_comments.append(lines.pop(0).strip() + "\n") @@ -65,9 +72,23 @@ class HTCFile(HTCContents, HTCDefaults): self._add_contents(line) if line.name_ == "exit": break - #assert 'simulation' in self.contents, "%s could not be loaded. 'simulation' section missing" % filename + def reset(self): + self._contents = None + + + @property + def contents(self): + if self._contents is None: + self._load() + return self._contents + + @contents.setter + def contents(self, value): + self._contents = value + + def readfilelines(self, filename): with open(unix_filename(filename), encoding='cp1252') as fid: lines = list(fid.readlines()) @@ -97,9 +118,11 @@ class HTCFile(HTCContents, HTCDefaults): self.contents[key] = value def __str__(self): + self.contents #load return "".join(self.initial_comments + [c.__str__(1) for c in self]) def save(self, filename=None): + self.contents #load if not loaded if filename is None: filename = self.filename else: @@ -112,6 +135,7 @@ class HTCFile(HTCContents, HTCDefaults): def set_name(self, name, htc_folder="htc", log_folder="log", res_folder="res"): #if os.path.isabs(folder) is False and os.path.relpath(folder).startswith("htc" + os.path.sep): + self.contents #load if not loaded fmt_folder = lambda folder : "./" + os.path.relpath(folder).replace("\\", "/") self.filename = os.path.abspath(os.path.join(self.modelpath, fmt_folder(htc_folder), "%s.htc" % name)).replace("\\", "/") @@ -122,6 +146,7 @@ class HTCFile(HTCContents, HTCDefaults): self.output.filename = os.path.join(fmt_folder(res_folder), "%s" % name).replace("\\", "/") def set_time(self, start=None, stop=None, step=None): + self.contents # load if not loaded if stop is not None: self.simulation.time_stop = stop else: @@ -134,6 +159,7 @@ class HTCFile(HTCContents, HTCDefaults): self.wind.scale_time_start = start def input_files(self): + self.contents # load if not loaded files = self.htc_inputfiles if 'new_htc_structure' in self: for mb in [self.new_htc_structure[mb] for mb in self.new_htc_structure.keys() if mb.startswith('main_body')]: @@ -173,6 +199,7 @@ class HTCFile(HTCContents, HTCDefaults): return [f for f in set(files) if f] def output_files(self): + self.contents # load if not loaded files = [] for k, index in [('simulation/logfile', 0), ('simulation/animation', 0), @@ -204,6 +231,7 @@ class HTCFile(HTCContents, HTCDefaults): return [f for f in files if f] def turbulence_files(self): + self.contents # load if not loaded if 'wind' not in self.contents.keys() or self.wind.turb_format[0] == 0: return [] elif self.wind.turb_format[0] == 1: @@ -214,6 +242,7 @@ class HTCFile(HTCContents, HTCDefaults): def res_file_lst(self): + self.contents # load if not loaded if 'output' not in self: return [] dataformat = self.output.get('data_format', 'hawc_ascii') @@ -227,6 +256,7 @@ class HTCFile(HTCContents, HTCDefaults): def simulate(self, exe, skip_if_up_to_date=False): + self.contents # load if not loaded if skip_if_up_to_date: from os.path import isfile, getmtime, isabs res_file = os.path.join(self.modelpath, self.res_file_lst()[0]) diff --git a/wetb/hawc2/log_file.py b/wetb/hawc2/log_file.py index 3b8dc7f6..cf42b5d2 100644 --- a/wetb/hawc2/log_file.py +++ b/wetb/hawc2/log_file.py @@ -140,9 +140,11 @@ class LogFile(LogInterpreter): @staticmethod - def from_htcfile(htcfile, modelpath): + def from_htcfile(htcfile, modelpath=None): logfilename = htcfile.simulation.logfile[0] if not os.path.isabs(logfilename): + if modelpath is None: + modelpath = htcfile.modelpath logfilename = os.path.join(modelpath, logfilename) return LogFile(logfilename, htcfile.simulation.time_stop[0]) diff --git a/wetb/hawc2/simulation.py b/wetb/hawc2/simulation.py index 01ae9412..5501f146 100755 --- a/wetb/hawc2/simulation.py +++ b/wetb/hawc2/simulation.py @@ -239,6 +239,8 @@ class Simulation(object): self.set_id(self.filename) if self.status != ERROR: self.status = CLEANED + self.logFile.reset() + self.htcFile.reset() diff --git a/wetb/hawc2/tests/test_htc_file.py b/wetb/hawc2/tests/test_htc_file.py index 8f0b94f3..29d21f9a 100644 --- a/wetb/hawc2/tests/test_htc_file.py +++ b/wetb/hawc2/tests/test_htc_file.py @@ -247,6 +247,11 @@ class TestHtcFile(unittest.TestCase): self.assertEqual(str(htcfile)[0], ";") + def test_htc_reset(self): + htcfile = HTCFile(self.testfilepath + "test.htc") + self.assertEqual(htcfile.wind.wsp[0], 10) + + diff --git a/wetb/hawc2/tests/test_logfile.py b/wetb/hawc2/tests/test_logfile.py index 54bbca8f..3625e375 100644 --- a/wetb/hawc2/tests/test_logfile.py +++ b/wetb/hawc2/tests/test_logfile.py @@ -12,7 +12,7 @@ from future import standard_library standard_library.install_aliases() import unittest from wetb.hawc2.log_file import LogFile, \ - INITIALIZATION, SIMULATING, DONE, PENDING + INITIALIZATION, SIMULATING, DONE, PENDING, UNKNOWN import time from wetb.hawc2 import log_file import threading @@ -209,6 +209,15 @@ class TestLogFile(unittest.TestCase): self.assertEqual(logfile.remaining_time_str(), "1:02:05") + def test_reset(self): + htcfile = HTCFile(self.tfp + 'logfiles/model/htc/dlc14_iec61400-1ed3/dlc14_wsp10_wdir000_s0000.htc') + logfile = LogFile.from_htcfile(htcfile, self.tfp + 'logfiles/model/') + self.assertEqual(logfile.status, DONE) + logfile.reset() + self.assertEqual(logfile.status, UNKNOWN) + self.assertEqual(logfile.txt, "") + logfile.update_status() + self.assertEqual(logfile.status, DONE) if __name__ == "__main__": -- GitLab