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