From 8e88e9d71b6d4f676a15d7bfe3f059f4619622c8 Mon Sep 17 00:00:00 2001
From: David Robert Verelst <dave@dtu.dk>
Date: Thu, 15 Jun 2017 19:28:53 +0200
Subject: [PATCH 1/2] prepost: major update for the hydro file name generation

---
 wetb/prepost/GenerateDLCs.py  | 61 +++++++++++++++++++++++++++--------
 wetb/prepost/GenerateHydro.py | 28 ++++++++--------
 wetb/prepost/Simulations.py   | 20 +-----------
 wetb/prepost/dlcdefs.py       | 60 +++++++++++++++++++++++++++++++---
 wetb/prepost/dlctemplate.py   | 14 ++++----
 5 files changed, 124 insertions(+), 59 deletions(-)

diff --git a/wetb/prepost/GenerateDLCs.py b/wetb/prepost/GenerateDLCs.py
index 5cb2fe9b..d387826e 100644
--- a/wetb/prepost/GenerateDLCs.py
+++ b/wetb/prepost/GenerateDLCs.py
@@ -72,15 +72,41 @@ class GeneralDLC(object):
                     pass
             if tag == '[seed]':
                 cases_len.append(int(v[0]))
+            elif tag == '[wave_seed]':
+                cases_len.append(int(v[0]))
             else:
                 cases_len.append(len(v))
         cases_index = multi_for(list(map(range, cases_len)))
 
+#        for irow, row in enumerate(cases_index):
+#            counter = floor(irow/len(variables['[wsp]']))+1
+#            for icol, col in enumerate(row):
+#                if variables_order[icol] == '[seed]':
+#                    value = '%4.4i' % (1000*counter + row[variables_order.index('[wsp]')]+1)
+#                elif variables_order[icol] == '[wave_seed]':  #shfe: wave_seed
+#                    value = '%4.4i' % (1000*counter + row[variables_order.index('[wsp]')]+1)
+#                else:
+#                    value = variables[variables_order[icol]][col]
+#                    if not isinstance(value, float) and not isinstance(value, int):
+#                        value = str(value)
+#                dlc[variables_order[icol]].append(value)
         for irow, row in enumerate(cases_index):
-            counter = floor(irow/len(variables['[wsp]']))+1
             for icol, col in enumerate(row):
                 if variables_order[icol] == '[seed]':
-                    value = '%4.4i' % (1000*counter + row[variables_order.index('[wsp]')]+1)
+#                    value = '%4.4i' % (1000*counter + row[variables_order.index('[wsp]')]+1)
+                    value = '%4.4i' % ( 1000*(row[variables_order.index('[wsp]')]+1) + \
+                                        row[variables_order.index('[seed]')]+1)
+
+                elif variables_order[icol] == '[wave_seed]':  #shfe: wave_seed
+                    value = '%4.4i' % ( 100*(row[variables_order.index('[wsp]')]+1) + \
+                                        row[variables_order.index('[wave_seed]')]+1)
+
+#                    value = '%4.4i' % (irow+1)
+#                    value = '%4.4i' % (10000*(row[variables_order.index('[wave_dir]')]+1) + \
+#                                        1000*(row[variables_order.index('[Hs]')]+1) + \
+#                                        10*(row[variables_order.index('[Tp]')]+1) +\
+#                                        row[variables_order.index('[seed]')]+1)
+
                 else:
                     value = variables[variables_order[icol]][col]
                     if not isinstance(value, float) and not isinstance(value, int):
@@ -125,6 +151,14 @@ class GeneralDLC(object):
 
         keys_list = self.sort_formulas(formulas)
 
+        # specify the precision of the tag as used in the formulas
+        # this does NOT affect the precision of the tag itself, only when used
+        # in a formula based tag.
+        formats = {'[wsp]':'%2.2i', '[gridgustdelay]':'%2.2i',
+                   '[wdir]':'%3.3i', '[G_phi0]':'%3.3i',
+                   '[sign]':'%s',
+                   '[Hs]':'%05.02f', '[Tp]':'%05.02f'}
+
         for fkey in keys_list:
             flist = []
             for i in range(len(dlc['[wsp]'])):
@@ -132,22 +166,22 @@ class GeneralDLC(object):
                 for key in dlc.keys():
                     if key in formula:
                         if formula[0] == '"':
-                            if key == '[wsp]' or key == '[gridgustdelay]':
-                                fmt = '%2.2i'
-                                formula = formula.replace(key, fmt%int(dlc[key][i]))
-                            elif key == '[wdir]' or key == '[G_phi0]':
-                                fmt = '%3.3i'
-                                formula = formula.replace(key, fmt%int(dlc[key][i]))
-                            elif key == '[sign]':
-                                fmt = '%s'
-                                formula = formula.replace(key, fmt%dlc[key][i])
-                            else:
+                            try:
+                                fmt = formats[key]
+                            except KeyError:
                                 fmt = '%4.4i'
-                                formula = formula.replace(key, fmt % int(dlc[key][i]))
+                            try:
+                                value = float(dlc[key][i])
+                            except ValueError:
+                                # this is for string tags
+                                value = dlc[key][i]
+                                fmt = '%s'
+                            formula = formula.replace(key, fmt % value)
                         elif key in formula:
                             formula = formula.replace(key, '%s' % dlc[key][i])
                 formula = formula.replace(',', '.')
                 formula = formula.replace(';', ',')
+                formula = formula.replace('\n', ' ')
                 flist.append(eval(formula))
 
             dlc[fkey] = flist
@@ -275,4 +309,3 @@ if __name__ == '__main__':
     opt = parser.parse_args()
     DLB = GenerateDLCCases()
     DLB.execute(filename=opt.filename, folder=opt.folder)
-
diff --git a/wetb/prepost/GenerateHydro.py b/wetb/prepost/GenerateHydro.py
index f2cfadfa..c544a559 100755
--- a/wetb/prepost/GenerateHydro.py
+++ b/wetb/prepost/GenerateHydro.py
@@ -6,19 +6,17 @@ Created on Fri Apr 15 18:34:15 2016
 
 Description: This script is used for writing the hydro input files for HAWC2
 (the wave type det_airy is not included)
-
 """
 
 import os
 
-
 class hydro_input(object):
 
     """ Basic class aiming for write the hydrodynamics input file"""
 
-    def __init__(self, wavetype, wdepth, spectrum, Hs, Tp, seed,
-                 gamma = 3.3, stretching = 1, wn = None, coef = 200,
-                 spreading = None):
+    def __init__(self, wavetype, wdepth, spectrum, Hs, Tp, seed, gamma=3.3,
+                 stretching=1, wn=None, coef=200, spreading=None,
+                 embed_sf=None, embed_sf_t0=None):
 
         self.wdepth = wdepth
         if self.wdepth < 0:
@@ -27,7 +25,7 @@ class hydro_input(object):
         # Regular Airy Wave Input
         if wavetype == 'reg_airy':
             self.waveno = 0
-            self.argument = 'begin %s ;\n\t\tstretching %d;\n\t\twave %d %d;\n\tend;' \
+            self.argument = 'begin %s ;\n\t\tstretching %d;\n\t\twave %.2f %.2f;\n\tend;' \
                             %(wavetype,stretching,Hs,Tp)
 
         # Iregular Airy Wave Input
@@ -37,32 +35,33 @@ class hydro_input(object):
             if spectrum == 'jonswap':
                 spectrumno = 1
                 self.argument = 'begin %s ;\n\t\tstretching %d;\n\t\tspectrum %d;'\
-                                '\n\t\tjonswap %.1f %.1f %.1f;\n\t\tcoef %d %d;' \
+                                '\n\t\tjonswap %.2f %.2f %.1f;\n\t\tcoef %d %d;' \
                                 %(wavetype,stretching,spectrumno,Hs,Tp,gamma,coef,seed)
 
             # Pierson Moscowitz spectrum
             elif spectrum == 'pm':
                 spectrumno = 2
                 self.argument = 'begin %s ;\n\t\tstretching %d;\n\t\tspectrum %d;'\
-                                '\n\t\tpm %.1f %.1f ;\n\t\tcoef %d %d;' \
+                                '\n\t\tpm %.2f %.2f ;\n\t\tcoef %d %d;' \
                                 %(wavetype,stretching,spectrumno,Hs,
                                   Tp,coef,seed)
 
             # check the spreading function
             if spreading is not None:
                 self.argument += '\n\t\tspreading 1 %d;'%(spreading)
-            self.argument += '\n\tend;';
+            # check the embeded stream function
+            if embed_sf is not None:
+                self.argument += '\n\t\tembed_sf %.2f %d;'%(embed_sf, embed_sf_t0)
+            self.argument += '\n\tend;'
 
         # Stream Wave Input
         if wavetype == 'strf':
             self.waveno = 3
-            self.argument = 'begin %s ;\n\t\twave %d %d;\n\tend;' \
+            self.argument = 'begin %s ;\n\t\twave %.2f %.2f 0.0;\n\tend;' \
                             %(wavetype,Hs,Tp)
 
     def execute(self, filename, folder):
-        cwd = os.getcwd()
-        folder_path = os.path.join(cwd,folder)
-        file_path = os.path.join(folder_path,filename)
+        file_path = os.path.join(folder, filename)
         # check if the hydro input file exists
         if os.path.exists(file_path):
             pass
@@ -70,13 +69,14 @@ class hydro_input(object):
             FILE = open(file_path,'w+')
             line1 = 'begin wkin_input ;'
             line2 = 'wavetype %d ;' %self.waveno
-            line3 = 'wdepth %d ;' %self.wdepth
+            line3 = 'wdepth %.1f ;' %self.wdepth
             line4 = 'end ;'
             file_contents = '%s\n\t%s\n\t%s\n\t%s\n%s\n;\nexit;' \
                             %(line1,line2,line3,self.argument,line4)
             FILE.write(file_contents)
             FILE.close()
 
+
 if __name__ == '__main__':
     hs = 3
     Tp = 11
diff --git a/wetb/prepost/Simulations.py b/wetb/prepost/Simulations.py
index 70a7edce..7a56d0af 100755
--- a/wetb/prepost/Simulations.py
+++ b/wetb/prepost/Simulations.py
@@ -738,30 +738,12 @@ def prepare_launch(iter_dict, opt_tags, master, variable_tag_func,
             if verbose:
                 print('created cases for: %s.htc\n' % master.tags['[case_id]'])
 
-            # shfe: flag to generate hydro input file
-            if master.tags['[hydro_dir]'] is not False:
-                if '[hydro input name]' not in master.tags:
-                    continue
-                hydro_filename = master.tags['[hydro input name]']
-                print('creating hydro input file for: %s.inp\n' % hydro_filename)
-                wavetype = master.tags['[wave_type]']
-                wavespectrum = master.tags['[wave_spectrum]']
-                hydro_folder = master.tags['[hydro_dir]']
-                wdepth = float(master.tags['[wdepth]'])
-                hs = float(master.tags['[hs]'])
-                tp = float(master.tags['[tp]'])
-                wave_seed = int(float(master.tags['[wave_seed]']))
-                hydro_inputfile = hydro_input(wavetype=wavetype, Hs=hs, Tp=tp,
-                                              wdepth = wdepth, seed=wave_seed,
-                                              spectrum=wavespectrum,
-                                              spreading=None)
-                hydro_inputfile.execute(filename=hydro_filename + '.inp',
-                                        folder=hydro_folder)
 #    print(master.queue.get())
 
     # only copy data and create zip after all htc files have been created.
     # Note that createcase could also creat other input files
     # create the execution folder structure and copy all data to it
+    # FIXME: this approach only considers the tags as set in the last case!
     if update_model_data:
         master.copy_model_data()
         # create the zip file
diff --git a/wetb/prepost/dlcdefs.py b/wetb/prepost/dlcdefs.py
index e1a8b99b..dc841db8 100644
--- a/wetb/prepost/dlcdefs.py
+++ b/wetb/prepost/dlcdefs.py
@@ -20,6 +20,8 @@ from glob import glob
 import pandas as pd
 
 from wetb.prepost import misc
+from wetb.prepost.GenerateHydro import hydro_input
+
 
 def casedict2xlsx():
     """
@@ -129,7 +131,7 @@ def variable_tag_func(master, case_id_short=False):
     return master
 
 
-def vartags_dlcs(master):
+def vartag_dlcs(master):
 
     mt = master.tags
 
@@ -157,6 +159,53 @@ def vartags_dlcs(master):
     return master
 
 
+def vartag_excel_stabcon(master):
+    """Variable tag function type that generates a hydro input file for the
+    wave kinematics dll if [hydro input name] is defined properly.
+    """
+
+    mt = master.tags
+    if '[hydro input name]' not in mt or not mt['[hydro input name]']:
+        return master
+
+    print('creating hydro input file for: %s.inp\n' % mt['[hydro input name]'])
+    mt['[wdepth]'] = float(mt['[wdepth]'])
+    mt['[Hs]'] = float(mt['[Hs]'])
+    mt['[Tp]'] = float(mt['[Tp]'])
+
+    if '[wave_gamma]' not in mt or not mt['[wave_gamma]']:
+        mt['[wave_gamma]'] = 3.3
+
+    if '[wave_coef]' not in mt or not mt['[wave_coef]']:
+        mt['[wave_coef]'] = 200
+
+    if '[stretching]' not in mt or not mt['[stretching]']:
+        mt['[stretching]'] = 1
+
+    if mt['[wave_seed]'] is not False:
+        mt['[wave_seed]'] = int(mt['[wave_seed]'])
+    else:
+        mt['[wave_seed]'] = int(mt['[seed]'])
+
+    try:
+        embed_sf = float(master.tags['[embed_sf]'])
+        embed_sf_t0 = int(master.tags['[t0]']) + 20
+    except KeyError:
+        embed_sf = None
+        embed_sf_t0 = None
+
+    hio = hydro_input(wavetype=mt['[wave_type]'], Hs=mt['[Hs]'], Tp=mt['[Tp]'],
+                      gamma=mt['[wave_gamma]'], wdepth=mt['[wdepth]'],
+                      spectrum=mt['[wave_spectrum]'], seed=mt['[wave_seed]'],
+                      stretching=mt['[stretching]'], coef=mt['[wave_coef]'],
+                      embed_sf=embed_sf, embed_sf_t0=embed_sf_t0, spreading=None)
+
+    hio.execute(filename=mt['[hydro input name]'] + '.inp',
+                folder=mt['[hydro_dir]'])
+
+    return master
+
+
 def tags_dlcs(master):
     """
     Initiate tags that are defined in the DLC spreadsheets
@@ -327,11 +376,12 @@ def excel_stabcon(proot, fext='xlsx', pignore=None, pinclude=None, sheet=0,
 
     if not silent:
         print('found %i Excel file(s), ' % len(dict_dfs), end='')
-    k = 0
-    for df in dict_dfs:
-        k += len(df)
+
     if not silent:
-        print('in which a total of %s cases are defined.' % k)
+        k = 0
+        for df in dict_dfs:
+            k += len(df)
+        print('in which a total of %i cases are defined.' % k)
 
     opt_tags = []
 
diff --git a/wetb/prepost/dlctemplate.py b/wetb/prepost/dlctemplate.py
index dd3715e9..a989bd8d 100644
--- a/wetb/prepost/dlctemplate.py
+++ b/wetb/prepost/dlctemplate.py
@@ -275,6 +275,8 @@ def launch_dlcs_excel(sim_id, silent=False, verbose=False, pbs_turb=False,
 
     # see if a htc/DLCs dir exists
     dlcs_dir = os.path.join(P_SOURCE, 'htc', 'DLCs')
+    # Load all DLC definitions and make some assumptions on tags that are not
+    # defined
     if os.path.exists(dlcs_dir):
         opt_tags = dlcdefs.excel_stabcon(dlcs_dir, silent=silent)
     else:
@@ -311,13 +313,11 @@ def launch_dlcs_excel(sim_id, silent=False, verbose=False, pbs_turb=False,
 
     # all tags set in master_tags will be overwritten by the values set in
     # variable_tag_func(), iter_dict and opt_tags
-    # values set in iter_dict have precedence over opt_tags
-    # variable_tag_func() has precedense over iter_dict, which has precedence
-    # over opt_tags. So opt_tags comes last
-    # variable_tag func is not required because everything is already done
-    # in dlcdefs.excel_stabcon
-    no_variable_tag_func = None
-    cases = sim.prepare_launch(iter_dict, opt_tags, master, no_variable_tag_func,
+    # values set in iter_dict have precedence over opt_tags vartag_func()
+    # has precedense over iter_dict, which has precedence over opt_tags.
+    # dlcdefs.vartag_excel_stabcon adds support for creating hydro files
+    vartag_func = dlcdefs.vartag_excel_stabcon
+    cases = sim.prepare_launch(iter_dict, opt_tags, master, vartag_func,
                                write_htc=write_htc, runmethod=runmethod,
                                copyback_turb=True, update_cases=False, msg='',
                                ignore_non_unique=False, run_only_new=False,
-- 
GitLab


From c33e04299294596efaaab57f5cb84f521381fc5c Mon Sep 17 00:00:00 2001
From: David Robert Verelst <dave@dtu.dk>
Date: Thu, 15 Jun 2017 19:53:11 +0200
Subject: [PATCH 2/2] prepost.GenerateDLCs: restore original seed number
 counter so you never have any seed number occurring more than

---
 wetb/prepost/GenerateDLCs.py | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/wetb/prepost/GenerateDLCs.py b/wetb/prepost/GenerateDLCs.py
index d387826e..fa997d98 100644
--- a/wetb/prepost/GenerateDLCs.py
+++ b/wetb/prepost/GenerateDLCs.py
@@ -91,13 +91,11 @@ class GeneralDLC(object):
 #                        value = str(value)
 #                dlc[variables_order[icol]].append(value)
         for irow, row in enumerate(cases_index):
+            counter = floor(irow/len(variables['[wsp]']))+1
             for icol, col in enumerate(row):
                 if variables_order[icol] == '[seed]':
-#                    value = '%4.4i' % (1000*counter + row[variables_order.index('[wsp]')]+1)
-                    value = '%4.4i' % ( 1000*(row[variables_order.index('[wsp]')]+1) + \
-                                        row[variables_order.index('[seed]')]+1)
-
-                elif variables_order[icol] == '[wave_seed]':  #shfe: wave_seed
+                    value = '%4.4i' % (1000*counter + row[variables_order.index('[wsp]')]+1)
+                elif variables_order[icol] == '[wave_seed]':
                     value = '%4.4i' % ( 100*(row[variables_order.index('[wsp]')]+1) + \
                                         row[variables_order.index('[wave_seed]')]+1)
 
-- 
GitLab