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