From 300c9a6d336ad987ddd6ceacf5996d7bb862188e Mon Sep 17 00:00:00 2001 From: David Robert Verelst <dave@dtu.dk> Date: Tue, 4 Dec 2018 14:01:20 +0100 Subject: [PATCH] add proper support for micro, meander turb for pbs_in_turb and zipchunks --- docs/howto-make-dlcs.md | 67 ++++-- wetb/prepost/Simulations.py | 204 +++++++++++------- wetb/prepost/dlcdefs.py | 26 ++- wetb/prepost/dlctemplate.py | 27 ++- wetb/prepost/simchunks.py | 73 +++++-- .../data/demo_dlc/ref/demo_dlc_remote.zip | Bin 9512 -> 9712 bytes .../demo_dlc/ref/htc/DLCs/dlc01_demos.xlsx | Bin 7368 -> 7910 bytes .../dlc01_demos/dlc01_steady_wsp11_s101.htc | 2 +- .../dlc01_demos/dlc01_steady_wsp8_noturb.htc | 8 +- .../dlc01_demos/dlc01_steady_wsp9_noturb.htc | 8 +- .../dlc01_demos/dlc01_steady_wsp10_s100.p | 2 +- .../dlc01_demos/dlc01_steady_wsp11_s101.p | 20 +- .../dlc01_demos/dlc01_steady_wsp8_noturb.p | 3 +- .../dlc01_demos/dlc01_steady_wsp9_noturb.p | 3 +- .../pbs_in_turb/{ => turb}/turb_s100_10ms.p | 0 .../pbs_in_turb/{ => turb}/turb_s101_11ms.p | 0 .../turb_meander/meander_s101_11ms.p | 55 +++++ .../pbs_in_turb/turb_micro/micro_s101_11ms.p | 55 +++++ .../data/demo_dlc/ref/prepost/remote_tags.txt | 122 ++++++++++- .../ref/zip-chunks-gorm/remote_chnk_00000.p | 29 ++- .../ref/zip-chunks-gorm/remote_chnk_00000.zip | Bin 203562 -> 205023 bytes .../ref/zip-chunks-jess/remote_chnk_00000.p | 45 +++- .../ref/zip-chunks-jess/remote_chnk_00000.zip | Bin 203562 -> 205023 bytes .../demo_dlc/source/htc/DLCs/dlc01_demos.xlsx | Bin 6726 -> 7731 bytes wetb/prepost/tests/test_Simulations.py | 3 +- 25 files changed, 609 insertions(+), 143 deletions(-) rename wetb/prepost/tests/data/demo_dlc/ref/pbs_in_turb/{ => turb}/turb_s100_10ms.p (100%) rename wetb/prepost/tests/data/demo_dlc/ref/pbs_in_turb/{ => turb}/turb_s101_11ms.p (100%) create mode 100644 wetb/prepost/tests/data/demo_dlc/ref/pbs_in_turb/turb_meander/meander_s101_11ms.p create mode 100644 wetb/prepost/tests/data/demo_dlc/ref/pbs_in_turb/turb_micro/micro_s101_11ms.p diff --git a/docs/howto-make-dlcs.md b/docs/howto-make-dlcs.md index 144eed6e..87c418a7 100644 --- a/docs/howto-make-dlcs.md +++ b/docs/howto-make-dlcs.md @@ -41,7 +41,7 @@ result and log files with lower case file names, regardless of the user input. Hence, in order to avoid possible ambiguities at all times, make sure that there are no upper case symbols defined in the value of the following tags (as defined in the Excel spreadsheets): ```[Case folder]```, ```[Case id.]```, and -```[Turb base name]```. +```[turb_base_name]```. The system will always force the values of the tags to be lower case anyway, and when working on Windows, this might cause some confusing and unexpected behavior. @@ -406,12 +406,12 @@ Required, and used for the PBS output and post-processing Optional * ```[turb_db_dir] = '../turb/'``` -* ```[wake_dir] = False``` -* ```[wake_db_dir] = False``` -* ```[wake_base_name] = 'turb_'``` +* ```[micro_dir] = False``` +* ```[micro_db_dir] = False``` +* ```[micro_base_name] = 'turb_'``` * ```[meander_dir] = False``` -* ```[meand_db_dir] = False``` -* ```[meand_base_name] = 'turb_'``` +* ```[meander_db_dir] = False``` +* ```[meander_base_name] = 'turb_'``` * ```[mooring_dir] = False```, all files and sub-folders copied to node * ```[hydro_dir] = False```, all files and sub-folders copied to node @@ -464,19 +464,48 @@ turbulence boxes using the 64-bit version of the stand alone Mann turbulence box generator. The appropriate input parameters are taken from the following tags: -* ```[tu_model]``` -* ```[Turb base name]``` -* ```[MannAlfaEpsilon]``` -* ```[MannL]``` -* ```[MannGamma]``` -* ```[seed]``` -* ```[turb_nr_u]``` : number of grid points in the u direction -* ```[turb_nr_v]``` : number of grid points in the v direction -* ```[turb_nr_w]``` : number of grid points in the w direction -* ```[turb_dx]``` : grid spacing in meters in the u direction -* ```[turb_dy]``` : grid spacing in meters in the v direction -* ```[turb_dz]``` : grid spacing in meters in the w direction -* ```[high_freq_comp]``` +* Atmospheric turbulence: + * ```[tu_model] = 1``` + * ```[turb_base_name]``` + * ```[MannAlfaEpsilon]``` + * ```[MannL]``` + * ```[MannGamma]``` + * ```[seed]``` + * ```[turb_nr_u]``` : number of grid points in the u direction + * ```[turb_nr_v]``` : number of grid points in the v direction + * ```[turb_nr_w]``` : number of grid points in the w direction + * ```[turb_dx]``` : grid spacing in meters in the u direction + * ```[turb_dy]``` : grid spacing in meters in the v direction + * ```[turb_dz]``` : grid spacing in meters in the w direction + * ```[high_freq_comp]``` + +* Micro turbulence for DWM: + * ```[micro_base_name]``` + * ```[MannAlfaEpsilon_micro]``` + * ```[MannL_micro]``` + * ```[MannGamma_micro]``` + * ```[seed_micro]``` + * ```[turb_nr_u_micro]``` : number of grid points in the u direction + * ```[turb_nr_v_micro]``` : number of grid points in the v direction + * ```[turb_nr_w_micro]``` : number of grid points in the w direction + * ```[turb_dx_micro]``` : grid spacing in meters in the u direction + * ```[turb_dy_micro]``` : grid spacing in meters in the v direction + * ```[turb_dz_micro]``` : grid spacing in meters in the w direction + * ```[high_freq_comp_micro]``` + +* Meander turbulence for DWM + * ```[meander_base_name]``` + * ```[MannAlfaEpsilon_meander]``` + * ```[MannL_meander]``` + * ```[MannGamma_meander]``` + * ```[seed_meander]``` + * ```[turb_nr_u_meander]``` : number of grid points in the u direction + * ```[turb_nr_v_meander]``` : number of grid points in the v direction + * ```[turb_nr_w_meander]``` : number of grid points in the w direction + * ```[turb_dx_meander]``` : grid spacing in meters in the u direction + * ```[turb_dy_meander]``` : grid spacing in meters in the v direction + * ```[turb_dz_meander]``` : grid spacing in meters in the w direction + * ```[high_freq_comp_meander]``` ### Tags required for hydro file generation diff --git a/wetb/prepost/Simulations.py b/wetb/prepost/Simulations.py index 24f7accc..eac23b85 100755 --- a/wetb/prepost/Simulations.py +++ b/wetb/prepost/Simulations.py @@ -58,9 +58,9 @@ from wetb.prepost.GenerateHydro import hydro_input from wetb.utils.envelope import compute_envelope from os.path import join as os_path_join -def join_path(*args): - return os_path_join(*args).replace("\\","/") -os.path.join = join_path +#def join_path(*args): +# return os_path_join(*args).replace("\\","/") +#os.path.join = join_path @@ -470,7 +470,7 @@ def run_local(cases, silent=False, check_log=True): # create the required directories dirkeys = ['[data_dir]', '[htc_dir]', '[res_dir]', '[log_dir]', '[eigenfreq_dir]', '[animation_dir]', '[turb_dir]', - '[wake_dir]', '[meander_dir]', '[opt_dir]', '[control_dir]', + '[micro_dir]', '[meander_dir]', '[opt_dir]', '[control_dir]', '[mooring_dir]', '[hydro_dir]', '[externalforce]'] for dirkey in dirkeys: if tags[dirkey]: @@ -1181,24 +1181,22 @@ class HtcMaster(object): self.tags['[iter_dir]'] = 'iter/' self.tags['[log_dir]'] = 'logfiles/' self.tags['[turb_dir]'] = 'turb/' - self.tags['[wake_dir]'] = None - self.tags['[meand_dir]'] = None + self.tags['[micro_dir]'] = None + self.tags['[meander_dir]'] = None self.tags['[turb_db_dir]'] = None - self.tags['[wake_db_dir]'] = None - self.tags['[meand_db_dir]'] = None + self.tags['[micro_db_dir]'] = None + self.tags['[meander_db_dir]'] = None self.tags['[control_dir]'] = 'control/' self.tags['[externalforce]'] = 'externalforce/' self.tags['[animation_dir]'] = 'animation/' self.tags['[eigenfreq_dir]'] = 'eigenfreq/' - self.tags['[wake_dir]'] = 'wake/' - self.tags['[meander_dir]'] = 'meander/' self.tags['[htc_dir]'] = 'htc/' self.tags['[mooring_dir]'] = 'mooring/' self.tags['[hydro_dir]'] = 'htc_hydro/' self.tags['[pbs_out_dir]'] = 'pbs_out/' self.tags['[turb_base_name]'] = None - self.tags['[wake_base_name]'] = None - self.tags['[meand_base_name]'] = None + self.tags['[micro_base_name]'] = None + self.tags['[meander_base_name]'] = None self.tags['[zip_root_files]'] = [] self.tags['[fname_source]'] = [] @@ -1215,8 +1213,8 @@ class HtcMaster(object): # self.queue = Queue.Queue() self.output_dirs = ['[res_dir]', '[log_dir]', '[turb_dir]', - '[case_id]', '[wake_dir]', '[animation_dir]', - '[meand_dir]', '[eigenfreq_dir]'] + '[case_id]', '[micro_dir]', '[animation_dir]', + '[meander_dir]', '[eigenfreq_dir]'] def create_run_dir(self): """ @@ -1225,13 +1223,15 @@ class HtcMaster(object): dirkeys = ['[data_dir]', '[htc_dir]', '[res_dir]', '[log_dir]', '[eigenfreq_dir]', '[animation_dir]', '[turb_dir]', - '[wake_dir]', '[meander_dir]', '[opt_dir]', '[control_dir]', + '[micro_dir]', '[meander_dir]', '[opt_dir]', '[control_dir]', '[mooring_dir]', '[hydro_dir]', '[externalforce]'] # create all the necessary directories for dirkey in dirkeys: if isinstance(self.tags[dirkey], str): path = os.path.join(self.tags['[run_dir]'], self.tags[dirkey]) + if self.tags[dirkey].lower() == 'none': + continue if not os.path.exists(path): os.makedirs(path) @@ -1356,7 +1356,7 @@ class HtcMaster(object): htcmaster_dir = self.tags['[master_htc_dir]'] data_dir = self.tags['[data_dir]'] turb_dir = self.tags['[turb_dir]'] - wake_dir = self.tags['[wake_dir]'] + wake_dir = self.tags['[micro_dir]'] meander_dir = self.tags['[meander_dir]'] mooring_dir = self.tags['[mooring_dir]'] hydro_dir = self.tags['[hydro_dir]'] @@ -1383,7 +1383,7 @@ class HtcMaster(object): # the master file src = os.path.join(htcmaster_dir, htcmaster) - dst = os.path.join('htc', '_master', htcmaster) + dst = os.path.join('htc', '_master', os.path.basename(htcmaster)) zf.write(src, dst, zipfile.ZIP_DEFLATED) # manually add all that resides in control, mooring and hydro @@ -1934,9 +1934,9 @@ class PBS(object): self.animation_dir = tag_dict['[animation_dir]'] self.TurbDirName = tag_dict['[turb_dir]'] self.TurbDb = tag_dict['[turb_db_dir]'] - self.wakeDb = tag_dict['[wake_db_dir]'] - self.meandDb = tag_dict['[meand_db_dir]'] - self.WakeDirName = tag_dict['[wake_dir]'] + self.wakeDb = tag_dict['[micro_db_dir]'] + self.meandDb = tag_dict['[meander_db_dir]'] + self.WakeDirName = tag_dict['[micro_dir]'] self.MeanderDirName = tag_dict['[meander_dir]'] self.ModelZipFile = tag_dict['[model_zip]'] self.htc_dir = tag_dict['[htc_dir]'] @@ -1944,8 +1944,8 @@ class PBS(object): self.mooring_dir = tag_dict['[mooring_dir]'] self.model_path = tag_dict['[run_dir]'] self.turb_base_name = tag_dict['[turb_base_name]'] - self.wake_base_name = tag_dict['[wake_base_name]'] - self.meand_base_name = tag_dict['[meand_base_name]'] + self.wake_base_name = tag_dict['[micro_base_name]'] + self.meand_base_name = tag_dict['[meander_base_name]'] self.pbs_queue_command = tag_dict['[pbs_queue_command]'] self.walltime = tag_dict['[walltime]'] self.dyn_walltime = tag_dict['[auto_walltime]'] @@ -2059,12 +2059,17 @@ class PBS(object): self.pbs += " mkdir -p " + self.htc_dir + '\n' self.pbs += " mkdir -p " + self.results_dir + '\n' self.pbs += " mkdir -p " + self.logs_dir + '\n' - if self.TurbDirName is not None or self.TurbDirName != 'None': + if self.TurbDirName is not None or self.TurbDirName.lower()!='none': self.pbs += " mkdir -p " + self.TurbDirName + '\n' + if self.WakeDirName and self.WakeDirName != self.TurbDirName: - self.pbs += " mkdir -p " + self.WakeDirName + '\n' + if str(self.WakeDirName).lower() != 'none': + self.pbs += " mkdir -p " + self.WakeDirName + '\n' + if self.MeanderDirName and self.MeanderDirName != self.TurbDirName: - self.pbs += " mkdir -p " + self.MeanderDirName + '\n' + if str(self.MeanderDirName).lower() != 'none': + self.pbs += " mkdir -p " + self.MeanderDirName + '\n' + if self.hydro_dir: self.pbs += " mkdir -p " + self.hydro_dir + '\n' # create the eigen analysis dir just in case that is necessary @@ -2200,7 +2205,7 @@ class PBS(object): fname_pbs_out=fname_pbs_out, winenumactl=self.winenumactl) self.pbs += ' echo "execute HAWC2, do not fork and wait"\n' - self.pbs += " %s \n" % execstr + self.pbs += " %s\n" % execstr # param = (self.winenumactl, hawc2_exe, self.htc_dir+case, # self.wine_appendix) @@ -5155,6 +5160,63 @@ class MannTurb64(prepost.PBSScript): self.silent = silent self.pbs_in_dir = 'pbs_in_turb/' + def create_turb(self, base_name, out_base, turb_dir, turb_db_dir, param): + """ + + Parameters + ---------- + + base_name + + out_base + + turb_dir + + turb_db_dir + + param : dictionary + Should contain the following keys: [MannAlfaEpsilon], [MannL] + [MannGamma], [seed], [turb_nr_u], [turb_nr_u], [turb_nr_w], + [turb_dx], [turb_dy], [turb_dz], [high_freq_comp] + """ + + self.path_pbs_e = os.path.join(out_base, turb_dir, base_name + '.err') + self.path_pbs_o = os.path.join(out_base, turb_dir, base_name + '.out') + self.path_pbs_i = os.path.join(self.pbs_in_dir, turb_dir, base_name + '.p') + + # apply winefix + self.prelude = self.winefix + # browse to scratch dir + self.prelude += 'cd {}\n'.format(self.scratchdir) + + self.coda = '# COPY BACK FROM SCRATCH AND RENAME, remove _ at end\n' + # copy back to turb dir at the end + if turb_db_dir is not None: + dst = os.path.join('$PBS_O_WORKDIR', turb_db_dir, base_name) + else: + dst = os.path.join('$PBS_O_WORKDIR', turb_dir, base_name) + # FIXME: Mann64 turb exe creator adds an underscore to output + for comp in list('uvw'): + src = '{}_{}.bin'.format(base_name, comp) + dst2 = '{}{}.bin'.format(dst, comp) + self.coda += 'cp {} {}\n'.format(src, dst2) + + # alfaeps, L, gamma, seed, nr_u, nr_v, nr_w, du, dv, dw high_freq_comp + rpl = (float(param['[MannAlfaEpsilon]']), + float(param['[MannL]']), + float(param['[MannGamma]']), + int(float(param['[seed]'])), + int(float(param['[turb_nr_u]'])), + int(float(param['[turb_nr_v]'])), + int(float(param['[turb_nr_w]'])), + float(param['[turb_dx]']), + float(param['[turb_dy]']), + float(param['[turb_dz]']), + int(float(param['[high_freq_comp]']))) + params = '%1.6f %1.6f %1.6f %i %i %i %i %1.4f %1.4f %1.4f %i' % rpl + self.execution = '%s %s %s' % (self.exe, base_name, params) + self.create(check_dirs=True) + def gen_pbs(self, cases): """ Parameters @@ -5169,57 +5231,51 @@ class MannTurb64(prepost.PBSScript): self.pbsworkdir = os.path.join(case0['[run_dir]'], '') if not self.silent: print('\nStart creating PBS files for turbulence with Mann64...') - for cname, case in cases.items(): - # only relevant for cases with turbulence - if '[tu_model]' in case and int(case['[tu_model]']) == 0: - continue - if '[turb_base_name]' not in case: - continue + mann_turb = ['[MannAlfaEpsilon]', '[MannL]', '[MannGamma]', + '[turb_nr_u]', '[turb_nr_v]', '[turb_nr_w]', '[seed]', + '[turb_dx]', '[turb_dy]', '[turb_dz]', + '[high_freq_comp]'] + mann_micro = {k:k.replace(']', '_micro]') for k in mann_turb} + mann_meander = {k:k.replace(']', '_meander]') for k in mann_turb} + + for cname, case in cases.items(): - base_name = case['[turb_base_name]'] - # pbs_in/out dir can contain subdirs, only take the inner directory + # pbs_in/out dir can contain subdirs, only take the base directory out_base = misc.path_split_dirs(case['[pbs_out_dir]'])[0] - turb = case['[turb_dir]'] - - self.path_pbs_e = os.path.join(out_base, turb, base_name + '.err') - self.path_pbs_o = os.path.join(out_base, turb, base_name + '.out') - self.path_pbs_i = os.path.join(self.pbs_in_dir, base_name + '.p') - - # apply winefix - self.prelude = self.winefix - # browse to scratch dir - self.prelude += 'cd {}\n'.format(self.scratchdir) - - self.coda = '# COPY BACK FROM SCRATCH AND RENAME, remove _ at end\n' - # copy back to turb dir at the end - if case['[turb_db_dir]'] is not None: - dst = os.path.join('$PBS_O_WORKDIR', case['[turb_db_dir]'], - base_name) - else: - dst = os.path.join('$PBS_O_WORKDIR', case['[turb_dir]'], - base_name) - # FIXME: Mann64 turb exe creator adds an underscore to output - for comp in list('uvw'): - src = '{}_{}.bin'.format(base_name, comp) - dst2 = '{}{}.bin'.format(dst, comp) - self.coda += 'cp {} {}\n'.format(src, dst2) - - # alfaeps, L, gamma, seed, nr_u, nr_v, nr_w, du, dv, dw high_freq_comp - rpl = (float(case['[MannAlfaEpsilon]']), - float(case['[MannL]']), - float(case['[MannGamma]']), - int(case['[seed]']), - int(case['[turb_nr_u]']), - int(case['[turb_nr_v]']), - int(case['[turb_nr_w]']), - float(case['[turb_dx]']), - float(case['[turb_dy]']), - float(case['[turb_dz]']), - int(case['[high_freq_comp]'])) - params = '%1.6f %1.6f %1.6f %i %i %i %i %1.4f %1.4f %1.4f %i' % rpl - self.execution = '%s %s %s' % (self.exe, base_name, params) - self.create(check_dirs=True) + + # NORMAL ATMOSPHERIC TURBULENCE + # only relevant for cases with turbulence + req = '[tu_model]' in case and '[turb_base_name]' in case + if req and int(case['[tu_model]'])==1: + base = case['[turb_base_name]'] + # pbs_in/out dir can contain subdirs, only take the base directory + turb_dir = case['[turb_dir]'] + turb_db_dir = case['[turb_db_dir]'] + # more fail safe switches in case user did not change defaults + if turb_dir and base and base.lower()!='none' and base!='': + self.create_turb(base, out_base, turb_dir, turb_db_dir, + {key:case[key] for key in mann_turb}) + + # MICRO TURBULENCE + if ('[micro_dir]' in case) and ('[micro_base_name]' in case): + base = case['[micro_base_name]'] + turb_dir = case['[micro_dir]'] + turb_db_dir = case['[micro_db_dir]'] + # more fail safe switches in case user did not change defaults + if turb_dir and base and base.lower()!='none' and base!='': + p = {key:case[mann_micro[key]] for key in mann_turb} + self.create_turb(base, out_base, turb_dir, turb_db_dir, p) + + # MEANDER TURBULENCE + if ('[meander_dir]' in case) and ('[meander_base_name]' in case): + base = case['[meander_base_name]'] + turb_dir = case['[meander_dir]'] + turb_db_dir = case['[meander_db_dir]'] + # more fail safe switches in case user did not change defaults + if turb_dir and base and base.lower()!='none' and base!='': + p = {key:case[mann_meander[key]] for key in mann_turb} + self.create_turb(base, out_base, turb_dir, turb_db_dir, p) def eigenbody(cases, debug=False): diff --git a/wetb/prepost/dlcdefs.py b/wetb/prepost/dlcdefs.py index 69ef0a15..1f4e754d 100644 --- a/wetb/prepost/dlcdefs.py +++ b/wetb/prepost/dlcdefs.py @@ -296,7 +296,7 @@ def tags_defaults(master): master.tags['[iter_dir]'] = 'iter/' master.tags['[turb_dir]'] = 'turb/' master.tags['[turb_db_dir]'] = '../turb/' - master.tags['[wake_dir]'] = False + master.tags['[micro_dir]'] = False master.tags['[hydro_dir]'] = False master.tags['[mooring_dir]'] = False master.tags['[externalforce]'] = False @@ -416,7 +416,7 @@ def excel_stabcon(proot, fext='xlsx', pignore=None, pinclude=None, sheet=0, tags_dict[str(key)] = str(value) else: tags_dict[str(key)] = value - # convert ; and empty to False/True + # convert ; and empty to False/True, "none" to None if isinstance(tags_dict[str(key)], str): if tags_dict[str(key)] == ';': tags_dict[str(key)] = False @@ -424,6 +424,8 @@ def excel_stabcon(proot, fext='xlsx', pignore=None, pinclude=None, sheet=0, tags_dict[str(key)] = True elif tags_dict[str(key)].lower() == 'nan': tags_dict[str(key)] = True + elif tags_dict[str(key)].lower() == 'none': + tags_dict[str(key)] = None # FIXME: this horrible mess requires a nice and clearly defined # tag spec/naming convention, and with special tag prefix @@ -443,6 +445,14 @@ def excel_stabcon(proot, fext='xlsx', pignore=None, pinclude=None, sheet=0, else: raise KeyError('[seed] should be used as tag for turb. seed') + # for backwards compatibility + if '[wake_dir]' in tags_dict and not '[micro_dir]': + tags_dict['[micro_dir]'] = tags_dict['[wake_dir]'] + if '[wake_db_dir]' in tags_dict and not '[micro_db_dir]': + tags_dict['[micro_db_dir]'] = tags_dict['[wake_db_dir]'] + if '[wake_base_name]' in tags_dict and not '[micro_base_name]': + tags_dict['[micro_base_name]'] = tags_dict['[wake_base_name]'] + tags_dict['[Case folder]'] = tags_dict['[Case folder]'].lower() tags_dict['[Case id.]'] = tags_dict['[Case id.]'].lower() dlc_case = tags_dict['[Case folder]'] @@ -460,11 +470,17 @@ def excel_stabcon(proot, fext='xlsx', pignore=None, pinclude=None, sheet=0, tags_dict['[time_stop]'] = tags_dict['[time stop]'] else: tags_dict['[time stop]'] = tags_dict['[time_stop]'] - try: - tags_dict['[turb_base_name]'] = tags_dict['[Turb base name]'] - except KeyError: + + if '[Turb base name]' in tags_dict: + if not '[turb_base_name]' in tags_dict: + tags_dict['[turb_base_name]'] = tags_dict['[Turb base name]'] + elif not '[turb_base_name]' in tags_dict: tags_dict['[turb_base_name]'] = None tags_dict['[Turb base name]'] = None + # for backwards compatibility: user has only defined [Turb base name] + elif not '[Turb base name]' in tags_dict: + tags_dict['[Turb base name]'] = tags_dict['[turb_base_name]'] + tags_dict['[DLC]'] = tags_dict['[Case id.]'].split('_')[0][3:] if '[pbs_out_dir]' not in tags_dict: tags_dict['[pbs_out_dir]'] = 'pbs_out/%s/' % dlc_case diff --git a/wetb/prepost/dlctemplate.py b/wetb/prepost/dlctemplate.py index c1c58cb6..56cb207f 100644 --- a/wetb/prepost/dlctemplate.py +++ b/wetb/prepost/dlctemplate.py @@ -277,10 +277,24 @@ def launch_dlcs_excel(sim_id, silent=False, verbose=False, pbs_turb=False, iter_dict['[empty]'] = [False] if postpro_node or postpro_node_zipchunks: +# pyenv = 'py36-wetb' pyenv = 'wetb_py3' else: pyenv = None + # if linux: + # pyenv = 'wetb_py3' + # pyenv_cmd = 'source /home/python/miniconda3/bin/activate' + # exesingle = "{hawc2_exe:} {fname_htc:}" + # exechunks = "({winenumactl:} {hawc2_exe:} {fname_htc:}) " + # exechunks += "2>&1 | tee {fname_pbs_out:}" + # else: + # pyenv = '' + # pyenv_cmd = 'source /home/ozgo/bin/activate_hawc2cfd.sh' + # exesingle = "time {hawc2_exe:} {fname_htc:}" + # exechunks = "(time numactl --physcpubind=$CPU_NR {hawc2_exe:} {fname_htc:}) " + # exechunks += "2>&1 | tee {fname_pbs_out:}" + # see if a htc/DLCs dir exists # Load all DLC definitions and make some assumptions on tags that are not # defined @@ -507,8 +521,19 @@ def postpro_node_merge(tqdm=False, zipchunks=False, m=[3,4,6,8,9,10,12]): # a line for the header mdf.txt2txt(fcsv, path_pattern, tarmode='r:xz', header=None, header_fjoined=lf._header(), recursive=True) + + # FIXME: this is due to bug in log file analysis. What is going on here?? + # fix that some cases do not have enough columns + with open(fcsv.replace('.csv', '2.csv'), 'w') as f1: + with open(fcsv) as f2: + for line in f2.readlines(): + if len(line.split(';'))==96: + line = line.replace(';0.00000000000;nan;-0.0000;', + '0.00000000000;nan;-0.0000;') + f1.write(line) + # convert from CSV to DataFrame - df = lf.csv2df(fcsv) + df = lf.csv2df(fcsv.replace('.csv', '2.csv')) df.to_hdf(fcsv.replace('.csv', '.h5'), 'table') # ------------------------------------------------------------------------- path_pattern = os.path.join(P_RUN, 'res', '*', '*.csv') diff --git a/wetb/prepost/simchunks.py b/wetb/prepost/simchunks.py index 45acab2f..47c27d5f 100644 --- a/wetb/prepost/simchunks.py +++ b/wetb/prepost/simchunks.py @@ -68,11 +68,12 @@ def create_chunks_htc_pbs(cases, sort_by_values=['[Windspeed]'], ppn=20, i0=0, fname_model = os.path.join(run_dir, model_zip) with zipfile.ZipFile(fname_model, 'r') as zf_model: for n in zf_model.namelist(): + # FIXME: might be duplicates when creating dirs from dirtags zf.writestr(n, zf_model.open(n).read()) # create all necessary directories in the zip file dirtags = ['[htc_dir]', '[res_dir]','[log_dir]','[animation_dir]', - '[pbs_in_dir]', '[eigenfreq_dir]','[turb_dir]','[wake_dir]', + '[pbs_in_dir]', '[eigenfreq_dir]','[turb_dir]','[micro_dir]', '[meander_dir]','[hydro_dir]', '[mooring_dir]', '[pbs_in_dir]', '[pbs_out_dir]'] dirnames = [] @@ -82,6 +83,7 @@ def create_chunks_htc_pbs(cases, sort_by_values=['[Windspeed]'], ppn=20, i0=0, dirnames.append(dirname) for dirname in set(dirnames): if dirname != 0: + # FIXME: might have duplicates from the base model zip file zf.write('.', os.path.join(dirname, '.')) # and the post-processing data @@ -274,7 +276,7 @@ def create_chunks_htc_pbs(cases, sort_by_values=['[Windspeed]'], ppn=20, i0=0, pbs += "echo 'current working directory:'\n" pbs += 'pwd\n' pbs += 'echo "create turb_db directories"\n' - turb_db_tags = ['[turb_db_dir]', '[meand_db_dir]', '[wake_db_dir]'] + turb_db_tags = ['[turb_db_dir]', '[meander_db_dir]', '[micro_db_dir]'] turb_db_dirs = [] for tag in turb_db_tags: for dirname in set(df[tag].unique().tolist()): @@ -283,7 +285,7 @@ def create_chunks_htc_pbs(cases, sort_by_values=['[Windspeed]'], ppn=20, i0=0, turb_db_dirs.append(dirname) turb_db_dirs = set(turb_db_dirs) # create all turb dirs - for dirname in turb_db_dirs: + for dirname in sorted(turb_db_dirs): pbs += 'mkdir -p %s\n' % os.path.join(dirname, '') # ===================================================================== @@ -294,25 +296,36 @@ def create_chunks_htc_pbs(cases, sort_by_values=['[Windspeed]'], ppn=20, i0=0, pbs += 'cd $PBS_O_WORKDIR\n' pbs += "echo 'current working directory:'\n" pbs += 'pwd\n' - base_name_tags = ['[turb_base_name]', '[meand_base_name]', - '[wake_base_name]'] + base_name_tags = ['[turb_base_name]', '[meander_base_name]', + '[micro_base_name]'] for db, base_name in zip(turb_db_tags, base_name_tags): turb_db_dirs = df[db] + df[base_name] # When set to None, the DataFrame will have text as None # FIXME: CI runner has and old pandas version (v0.14.1) try: - turb_db_src = turb_db_dirs[turb_db_dirs.str.find('None')==-1] + p1 = turb_db_dirs.str.find('None')==-1 + p2 = turb_db_dirs.str.find('none')==-1 + p3 = turb_db_dirs.str.find('false')==-1 + p4 = turb_db_dirs.str.find('False')==-1 +# p4 = turb_db_dirs.str.find('0')==-1 + turb_db_src = turb_db_dirs[p1 & p2 & p3 & p4] except AttributeError: # and findall returns list with the search str occuring as # many times as found in the str... # sel should be True if str does NOT occur in turb_db_dirs # meaning if findall returns empty list - findall = turb_db_dirs.str.findall('None').tolist() - sel = [True if len(k)==0 else False for k in findall] + sel = [True]*len(turb_db_dirs) + for val in ['false', 'none', 'None', 'False']: + findall = turb_db_dirs.str.findall(val).tolist() + # len==0 if nothing has been found + sel_ = [True if len(k)==0 else False for k in findall] + # merge with other search results, none of the elements + # should occur + sel = [True if k and kk else False for k, kk in zip(sel, sel_)] turb_db_src = turb_db_dirs[sel] pbs += '\n' pbs += '# copy to scratch db directory for %s, %s\n' % (db, base_name) - for k in turb_db_src.unique(): + for k in sorted(turb_db_src.unique()): dst = os.path.dirname(os.path.join(pbase, sim_id, k)) pbs += 'cp %s* %s\n' % (k, os.path.join(dst, '.')) @@ -323,14 +336,14 @@ def create_chunks_htc_pbs(cases, sort_by_values=['[Windspeed]'], ppn=20, i0=0, pbs += "echo 'current working directory:'\n" pbs += 'pwd\n' pbs += 'echo "create turb directories in CPU dirs"\n' - turb_dir_tags = ['[turb_dir]', '[meand_dir]', '[wake_dir]'] + turb_dir_tags = ['[turb_dir]', '[meander_dir]', '[micro_dir]'] turb_dirs = [] for tag in turb_dir_tags: for dirname in set(df[tag].unique().tolist()): dirname_s = str(dirname).replace('.', '').replace('/', '') if dirname_s.lower() not in ['false', 'none', '0']: turb_dirs.append(dirname) - turb_dirs = set(turb_dirs) + turb_dirs = sorted(set(turb_dirs)) for k in list(range(ppn)): for dirname in turb_dirs: pbs += 'mkdir -p %s\n' % os.path.join(str(k), dirname, '') @@ -504,7 +517,24 @@ def create_chunks_htc_pbs(cases, sort_by_values=['[Windspeed]'], ppn=20, i0=0, if not os.path.exists(fpath): os.makedirs(fpath) - df_iter = chunker(df, nr_procs_series*ppn) + # remove all cases that start with test_ and move them into a separate + # chunk + # FIXME: CI runner has and old pandas version (v0.14.1) + try: + sel_notest = df['[Case folder]'].str.find('test_')<0 + sel_test = ~sel_notest + except AttributeError: + # and findall returns list with the search str occuring as + # many times as found in the str... + findall = df['[Case folder]'].str.findall('test_').tolist() + # len==0 if nothing has been found + sel_notest = [True if len(k)==0 else False for k in findall] + sel_test = [not k for k in sel_notest] + df_dlc = df[sel_notest] + df_test = df[sel_test] + + # DLC CHUNKS + df_dlc_iter = chunker(df_dlc, nr_procs_series*ppn) sim_id = df['[sim_id]'].iloc[0] run_dir = df['[run_dir]'].iloc[0] model_zip = df['[model_zip]'].iloc[0] @@ -512,19 +542,34 @@ def create_chunks_htc_pbs(cases, sort_by_values=['[Windspeed]'], ppn=20, i0=0, nodes = 1 df_ind = pd.DataFrame(columns=['chnk_nr'], dtype=np.int32) df_ind.index.name = '[case_id]' - for ii, dfi in enumerate(df_iter): + for ii, dfi in enumerate(df_dlc_iter): fname, ind = make_zip_chunks(dfi, i0+ii, sim_id, run_dir, model_zip) make_pbs_chunks(dfi, i0+ii, sim_id, run_dir, model_zip, wine_arch=wine_arch, wine_prefix=wine_prefix, compress=compress) df_ind = df_ind.append(ind) print(fname) - fname = os.path.join(post_dir, 'case_id-chunk-index') df_ind['chnk_nr'] = df_ind['chnk_nr'].astype(np.int32) df_ind.to_hdf(fname+'.h5', 'table', compression=9, complib='zlib') df_ind.to_csv(fname+'.csv') + # TEST CHUNKS + df_test_iter = chunker(df_test, nr_procs_series*ppn) + df_ind = pd.DataFrame(columns=['chnk_nr'], dtype=np.int32) + df_ind.index.name = '[case_id]' + for ii, dfi in enumerate(df_test_iter): + fname, ind = make_zip_chunks(dfi, 90000+ii, sim_id, run_dir, model_zip) + make_pbs_chunks(dfi, 90000+ii, sim_id, run_dir, model_zip, + wine_arch=wine_arch, wine_prefix=wine_prefix, + compress=compress) + df_ind = df_ind.append(ind) + print(fname) + fname = os.path.join(post_dir, 'case_id-chunk-test-index') + df_ind['chnk_nr'] = df_ind['chnk_nr'].astype(np.int32) + df_ind.to_hdf(fname+'.h5', 'table', compression=9, complib='zlib') + df_ind.to_csv(fname+'.csv') + def regroup_tarfiles(cc): """Re-group all chunks again per [Case folder] compressed file. First all diff --git a/wetb/prepost/tests/data/demo_dlc/ref/demo_dlc_remote.zip b/wetb/prepost/tests/data/demo_dlc/ref/demo_dlc_remote.zip index 3c02a1d7a11acaeff10fdae72416c4856fcbc4bc..45726903558776c88e95bdc40e69a9fa7c125369 100644 GIT binary patch delta 459 zcmZ4C^}(Ajz?+#xgaHK10@8dZ@+oLSSYRP2!3v~P5=#>G(G-WvMqw)E1}ZKoElP^d z%}g%JN7I6ADlc4NYGPhWY7v^!iB)PWGXgq1H!hJ^0y8EbSMq@{#FahSAQn$fQ#ODx z&nrt!-li;!;Of?6cOAqL0t{~*bKp*Zx|NYhgc%VU=&nU*oC?<ncRLoXVo(Ek;0A## zJuq2TMH=D}8x<+WR}(jCOs-eqfr#|0NHOs$PhPE}4dLHXk>ZF|h6MlQdrD$r0p6@Y TA2Kj-0-*sD1H&qyBm)BgxZ_y? delta 316 zcmez1y~2wxz?+#xgn@y9gTZ)5o5w^x1x*MGC<F(rKvqg(NuoZQ;&53usJ3%zEIaz9 zd2IY4uf(FTv(00&w6YJ&*V0yx$=S-DP(_n>DI36;ACz?wOsUDXD#9@CDHSQ}9H4y} zCCU2nxrxOksYO6*8JR?wA+7{j6RzL1=z$^wgJ3@cgDTvW3=D4@r%jeuHBkV$K>3`3 zkSI`27>H$&)GTS-sWe$rSza62P>@TJHAtao;GDcyRh5sOft_IwBLhR2GDs2tPYp)| diff --git a/wetb/prepost/tests/data/demo_dlc/ref/htc/DLCs/dlc01_demos.xlsx b/wetb/prepost/tests/data/demo_dlc/ref/htc/DLCs/dlc01_demos.xlsx index 6b4bb2d9fe4f7b5b2e347ecb8da55e2cd3695669..7bfe0aa04b9a638480e5c6de023b196c3e048a0a 100755 GIT binary patch delta 6418 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 delta 5864 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 Bh>`#R diff --git a/wetb/prepost/tests/data/demo_dlc/ref/htc/dlc01_demos/dlc01_steady_wsp11_s101.htc b/wetb/prepost/tests/data/demo_dlc/ref/htc/dlc01_demos/dlc01_steady_wsp11_s101.htc index 1e903119..ab217855 100644 --- a/wetb/prepost/tests/data/demo_dlc/ref/htc/dlc01_demos/dlc01_steady_wsp11_s101.htc +++ b/wetb/prepost/tests/data/demo_dlc/ref/htc/dlc01_demos/dlc01_steady_wsp11_s101.htc @@ -382,7 +382,7 @@ begin wind ; filename_u ./turb/turb_s101_11msu.bin ; filename_v ./turb/turb_s101_11msv.bin ; filename_w ./turb/turb_s101_11msw.bin ; - box_dim_u 512 0.85938 ; + box_dim_u 512 0.859375 ; box_dim_v 32 7.5; box_dim_w 32 7.5; std_scaling 1.0 0.7 0.5 ; diff --git a/wetb/prepost/tests/data/demo_dlc/ref/htc/dlc01_demos/dlc01_steady_wsp8_noturb.htc b/wetb/prepost/tests/data/demo_dlc/ref/htc/dlc01_demos/dlc01_steady_wsp8_noturb.htc index 930ccc95..a9f9db89 100644 --- a/wetb/prepost/tests/data/demo_dlc/ref/htc/dlc01_demos/dlc01_steady_wsp8_noturb.htc +++ b/wetb/prepost/tests/data/demo_dlc/ref/htc/dlc01_demos/dlc01_steady_wsp8_noturb.htc @@ -379,10 +379,10 @@ begin wind ; ; begin mann ; create_turb_parameters 29.4 1.0 3.9 0 1.0 ; L, alfaeps, gamma, seed, highfrq compensation - filename_u ./turb/noneu.bin ; - filename_v ./turb/nonev.bin ; - filename_w ./turb/nonew.bin ; - box_dim_u 512 0.03906 ; + filename_u ./turb/Noneu.bin ; + filename_v ./turb/Nonev.bin ; + filename_w ./turb/Nonew.bin ; + box_dim_u 512 0.0390625 ; box_dim_v 32 7.5; box_dim_w 32 7.5; std_scaling 1.0 0.7 0.5 ; diff --git a/wetb/prepost/tests/data/demo_dlc/ref/htc/dlc01_demos/dlc01_steady_wsp9_noturb.htc b/wetb/prepost/tests/data/demo_dlc/ref/htc/dlc01_demos/dlc01_steady_wsp9_noturb.htc index cab1eb20..a25168ae 100644 --- a/wetb/prepost/tests/data/demo_dlc/ref/htc/dlc01_demos/dlc01_steady_wsp9_noturb.htc +++ b/wetb/prepost/tests/data/demo_dlc/ref/htc/dlc01_demos/dlc01_steady_wsp9_noturb.htc @@ -379,10 +379,10 @@ begin wind ; ; begin mann ; create_turb_parameters 29.4 1.0 3.9 0 1.0 ; L, alfaeps, gamma, seed, highfrq compensation - filename_u ./turb/noneu.bin ; - filename_v ./turb/nonev.bin ; - filename_w ./turb/nonew.bin ; - box_dim_u 512 0.04395 ; + filename_u ./turb/Noneu.bin ; + filename_v ./turb/Nonev.bin ; + filename_w ./turb/Nonew.bin ; + box_dim_u 512 0.0439453 ; box_dim_v 32 7.5; box_dim_w 32 7.5; std_scaling 1.0 0.7 0.5 ; diff --git a/wetb/prepost/tests/data/demo_dlc/ref/pbs_in/dlc01_demos/dlc01_steady_wsp10_s100.p b/wetb/prepost/tests/data/demo_dlc/ref/pbs_in/dlc01_demos/dlc01_steady_wsp10_s100.p index a2f204a8..34da4913 100644 --- a/wetb/prepost/tests/data/demo_dlc/ref/pbs_in/dlc01_demos/dlc01_steady_wsp10_s100.p +++ b/wetb/prepost/tests/data/demo_dlc/ref/pbs_in/dlc01_demos/dlc01_steady_wsp10_s100.p @@ -68,7 +68,7 @@ if [ -z ${LAUNCH_PBS_MODE+x} ] ; then # find+xargs mode: 1 PBS job, multiple cases else echo "execute HAWC2, do not fork and wait" - (time WINEARCH=win32 WINEPREFIX=~/.wine32 numactl --physcpubind=$CPU_NR wine hawc2-latest ./htc/dlc01_demos/dlc01_steady_wsp10_s100.htc) 2>&1 | tee pbs_out/dlc01_demos/dlc01_steady_wsp10_s100.err.out + (time WINEARCH=win32 WINEPREFIX=~/.wine32 numactl --physcpubind=$CPU_NR wine hawc2-latest ./htc/dlc01_demos/dlc01_steady_wsp10_s100.htc) 2>&1 | tee pbs_out/dlc01_demos/dlc01_steady_wsp10_s100.err.out fi # ------------------------------------------------------------------------------ diff --git a/wetb/prepost/tests/data/demo_dlc/ref/pbs_in/dlc01_demos/dlc01_steady_wsp11_s101.p b/wetb/prepost/tests/data/demo_dlc/ref/pbs_in/dlc01_demos/dlc01_steady_wsp11_s101.p index 33f02992..058929a0 100644 --- a/wetb/prepost/tests/data/demo_dlc/ref/pbs_in/dlc01_demos/dlc01_steady_wsp11_s101.p +++ b/wetb/prepost/tests/data/demo_dlc/ref/pbs_in/dlc01_demos/dlc01_steady_wsp11_s101.p @@ -38,8 +38,12 @@ if [ -z ${LAUNCH_PBS_MODE+x} ] ; then mkdir -p res/dlc01_demos/ mkdir -p logfiles/dlc01_demos/ mkdir -p turb/ + mkdir -p turb_micro/ + mkdir -p turb_meander/ cp -R $PBS_O_WORKDIR/htc/dlc01_demos/dlc01_steady_wsp11_s101.htc ./htc/dlc01_demos/ cp -R $PBS_O_WORKDIR/../turb/turb_s101_11ms*.bin turb/ + cp -R $PBS_O_WORKDIR/turb_micro/micro_s101_11ms*.bin turb_micro/ + cp -R $PBS_O_WORKDIR/turb_meander/meander_s101_11ms*.bin turb_meander/ _HOSTNAME_=`hostname` if [[ ${_HOSTNAME_:0:1} == "j" ]] ; then WINEARCH=win32 WINEPREFIX=~/.wine32 winefix @@ -68,7 +72,7 @@ if [ -z ${LAUNCH_PBS_MODE+x} ] ; then # find+xargs mode: 1 PBS job, multiple cases else echo "execute HAWC2, do not fork and wait" - (time WINEARCH=win32 WINEPREFIX=~/.wine32 numactl --physcpubind=$CPU_NR wine hawc2-latest ./htc/dlc01_demos/dlc01_steady_wsp11_s101.htc) 2>&1 | tee pbs_out/dlc01_demos/dlc01_steady_wsp11_s101.err.out + (time WINEARCH=win32 WINEPREFIX=~/.wine32 numactl --physcpubind=$CPU_NR wine hawc2-latest ./htc/dlc01_demos/dlc01_steady_wsp11_s101.htc) 2>&1 | tee pbs_out/dlc01_demos/dlc01_steady_wsp11_s101.err.out fi # ------------------------------------------------------------------------------ @@ -87,6 +91,8 @@ if [ -z ${LAUNCH_PBS_MODE+x} ] ; then mkdir -p $PBS_O_WORKDIR/logfiles/dlc01_demos/ mkdir -p $PBS_O_WORKDIR/animation/ mkdir -p $PBS_O_WORKDIR/../turb/ + mkdir -p $PBS_O_WORKDIR/turb_micro/ + mkdir -p $PBS_O_WORKDIR/turb_meander/ cp -R res/dlc01_demos/. $PBS_O_WORKDIR/res/dlc01_demos/. cp -R logfiles/dlc01_demos/. $PBS_O_WORKDIR/logfiles/dlc01_demos/. cp -R animation/. $PBS_O_WORKDIR/animation/. @@ -96,6 +102,12 @@ if [ -z ${LAUNCH_PBS_MODE+x} ] ; then cd turb/ for i in `ls *.bin`; do if [ -e $PBS_O_WORKDIR/../turb/$i ]; then echo "$i exists no copyback"; else echo "$i copyback"; cp $i $PBS_O_WORKDIR/../turb/; fi; done cd /scratch/$USER/$PBS_JOBID/1/ + cd turb_micro/ + for i in `ls *.bin`; do if [ -e $PBS_O_WORKDIR/turb_micro/$i ]; then echo "$i exists no copyback"; else echo "$i copyback"; cp $i $PBS_O_WORKDIR/turb_micro/; fi; done + cd /scratch/$USER/$PBS_JOBID/1/ + cd turb_meander/ + for i in `ls *.bin`; do if [ -e $PBS_O_WORKDIR/turb_meander/$i ]; then echo "$i exists no copyback"; else echo "$i copyback"; cp $i $PBS_O_WORKDIR/turb_meander/; fi; done + cd /scratch/$USER/$PBS_JOBID/1/ echo "END COPY BACK TURB" echo "" @@ -120,6 +132,12 @@ else cd turb/ for i in `ls *.bin`; do if [ -e $PBS_O_WORKDIR/../turb/$i ]; then echo "$i exists no copyback"; else echo "$i copyback"; cp $i $PBS_O_WORKDIR/../turb/; fi; done cd /scratch/$USER/$PBS_JOBID/$CPU_NR/ + cd turb_micro/ + for i in `ls *.bin`; do if [ -e ../remote/turb_micro/$i ]; then echo "$i exists no copyback"; else echo "$i copyback"; cp $i ../remote/turb_micro/; fi; done + cd /scratch/$USER/$PBS_JOBID/$CPU_NR/ + cd turb_meander/ + for i in `ls *.bin`; do if [ -e ../remote/turb_meander/$i ]; then echo "$i exists no copyback"; else echo "$i copyback"; cp $i ../remote/turb_meander/; fi; done + cd /scratch/$USER/$PBS_JOBID/$CPU_NR/ echo "END COPY BACK TURB" echo "" diff --git a/wetb/prepost/tests/data/demo_dlc/ref/pbs_in/dlc01_demos/dlc01_steady_wsp8_noturb.p b/wetb/prepost/tests/data/demo_dlc/ref/pbs_in/dlc01_demos/dlc01_steady_wsp8_noturb.p index 90946233..1e9d652e 100644 --- a/wetb/prepost/tests/data/demo_dlc/ref/pbs_in/dlc01_demos/dlc01_steady_wsp8_noturb.p +++ b/wetb/prepost/tests/data/demo_dlc/ref/pbs_in/dlc01_demos/dlc01_steady_wsp8_noturb.p @@ -39,7 +39,6 @@ if [ -z ${LAUNCH_PBS_MODE+x} ] ; then mkdir -p logfiles/dlc01_demos/ mkdir -p turb/ cp -R $PBS_O_WORKDIR/htc/dlc01_demos/dlc01_steady_wsp8_noturb.htc ./htc/dlc01_demos/ - cp -R $PBS_O_WORKDIR/../turb/none*.bin turb/ _HOSTNAME_=`hostname` if [[ ${_HOSTNAME_:0:1} == "j" ]] ; then WINEARCH=win32 WINEPREFIX=~/.wine32 winefix @@ -68,7 +67,7 @@ if [ -z ${LAUNCH_PBS_MODE+x} ] ; then # find+xargs mode: 1 PBS job, multiple cases else echo "execute HAWC2, do not fork and wait" - (time WINEARCH=win32 WINEPREFIX=~/.wine32 numactl --physcpubind=$CPU_NR wine hawc2-latest ./htc/dlc01_demos/dlc01_steady_wsp8_noturb.htc) 2>&1 | tee pbs_out/dlc01_demos/dlc01_steady_wsp8_noturb.err.out + (time WINEARCH=win32 WINEPREFIX=~/.wine32 numactl --physcpubind=$CPU_NR wine hawc2-latest ./htc/dlc01_demos/dlc01_steady_wsp8_noturb.htc) 2>&1 | tee pbs_out/dlc01_demos/dlc01_steady_wsp8_noturb.err.out fi # ------------------------------------------------------------------------------ diff --git a/wetb/prepost/tests/data/demo_dlc/ref/pbs_in/dlc01_demos/dlc01_steady_wsp9_noturb.p b/wetb/prepost/tests/data/demo_dlc/ref/pbs_in/dlc01_demos/dlc01_steady_wsp9_noturb.p index c4a0ee11..91b4f5bc 100644 --- a/wetb/prepost/tests/data/demo_dlc/ref/pbs_in/dlc01_demos/dlc01_steady_wsp9_noturb.p +++ b/wetb/prepost/tests/data/demo_dlc/ref/pbs_in/dlc01_demos/dlc01_steady_wsp9_noturb.p @@ -39,7 +39,6 @@ if [ -z ${LAUNCH_PBS_MODE+x} ] ; then mkdir -p logfiles/dlc01_demos/ mkdir -p turb/ cp -R $PBS_O_WORKDIR/htc/dlc01_demos/dlc01_steady_wsp9_noturb.htc ./htc/dlc01_demos/ - cp -R $PBS_O_WORKDIR/../turb/none*.bin turb/ _HOSTNAME_=`hostname` if [[ ${_HOSTNAME_:0:1} == "j" ]] ; then WINEARCH=win32 WINEPREFIX=~/.wine32 winefix @@ -68,7 +67,7 @@ if [ -z ${LAUNCH_PBS_MODE+x} ] ; then # find+xargs mode: 1 PBS job, multiple cases else echo "execute HAWC2, do not fork and wait" - (time WINEARCH=win32 WINEPREFIX=~/.wine32 numactl --physcpubind=$CPU_NR wine hawc2-latest ./htc/dlc01_demos/dlc01_steady_wsp9_noturb.htc) 2>&1 | tee pbs_out/dlc01_demos/dlc01_steady_wsp9_noturb.err.out + (time WINEARCH=win32 WINEPREFIX=~/.wine32 numactl --physcpubind=$CPU_NR wine hawc2-latest ./htc/dlc01_demos/dlc01_steady_wsp9_noturb.htc) 2>&1 | tee pbs_out/dlc01_demos/dlc01_steady_wsp9_noturb.err.out fi # ------------------------------------------------------------------------------ diff --git a/wetb/prepost/tests/data/demo_dlc/ref/pbs_in_turb/turb_s100_10ms.p b/wetb/prepost/tests/data/demo_dlc/ref/pbs_in_turb/turb/turb_s100_10ms.p similarity index 100% rename from wetb/prepost/tests/data/demo_dlc/ref/pbs_in_turb/turb_s100_10ms.p rename to wetb/prepost/tests/data/demo_dlc/ref/pbs_in_turb/turb/turb_s100_10ms.p diff --git a/wetb/prepost/tests/data/demo_dlc/ref/pbs_in_turb/turb_s101_11ms.p b/wetb/prepost/tests/data/demo_dlc/ref/pbs_in_turb/turb/turb_s101_11ms.p similarity index 100% rename from wetb/prepost/tests/data/demo_dlc/ref/pbs_in_turb/turb_s101_11ms.p rename to wetb/prepost/tests/data/demo_dlc/ref/pbs_in_turb/turb/turb_s101_11ms.p diff --git a/wetb/prepost/tests/data/demo_dlc/ref/pbs_in_turb/turb_meander/meander_s101_11ms.p b/wetb/prepost/tests/data/demo_dlc/ref/pbs_in_turb/turb_meander/meander_s101_11ms.p new file mode 100644 index 00000000..90db7996 --- /dev/null +++ b/wetb/prepost/tests/data/demo_dlc/ref/pbs_in_turb/turb_meander/meander_s101_11ms.p @@ -0,0 +1,55 @@ + +### Standard Output +#PBS -N no_name_job +#PBS -o ./pbs_out/turb_meander/meander_s101_11ms.out +### Standard Error +#PBS -e ./pbs_out/turb_meander/meander_s101_11ms.err +#PBS -W umask=0003 +### Maximum wallclock time format HOURS:MINUTES:SECONDS +#PBS -l walltime=00:59:59 +#PBS -lnodes=1:ppn=1 +### Queue name +#PBS -q workq + +### #PBS -a [start_time] +### #PBS -W depend=afterany:[job_id] + +### Browse to current working dir +echo "" +cd $PBS_O_WORKDIR +echo "current working dir:" +pwd +echo "" + +### =========================================================================== +echo "------------------------------------------------------------------------" +echo "PRELUDE" +echo "------------------------------------------------------------------------" + +winefix +cd /scratch/$USER/$PBS_JOBID/ + + +echo "" +echo "------------------------------------------------------------------------" +echo "EXECUTION" +echo "------------------------------------------------------------------------" + +time WINEARCH=win64 WINEPREFIX=~/.wine wine mann_turb_x64.exe meander_s101_11ms 11.000000 12.000000 13.000000 101 9 9 50 0.9990 0.9990 1.3300 1 +### wait for jobs to finish +wait + +echo "" +echo "------------------------------------------------------------------------" +echo "CODA" +echo "------------------------------------------------------------------------" + +# COPY BACK FROM SCRATCH AND RENAME, remove _ at end +cp meander_s101_11ms_u.bin $PBS_O_WORKDIR/turb_meander/meander_s101_11msu.bin +cp meander_s101_11ms_v.bin $PBS_O_WORKDIR/turb_meander/meander_s101_11msv.bin +cp meander_s101_11ms_w.bin $PBS_O_WORKDIR/turb_meander/meander_s101_11msw.bin + + +echo "" +### =========================================================================== +exit diff --git a/wetb/prepost/tests/data/demo_dlc/ref/pbs_in_turb/turb_micro/micro_s101_11ms.p b/wetb/prepost/tests/data/demo_dlc/ref/pbs_in_turb/turb_micro/micro_s101_11ms.p new file mode 100644 index 00000000..e4cd256d --- /dev/null +++ b/wetb/prepost/tests/data/demo_dlc/ref/pbs_in_turb/turb_micro/micro_s101_11ms.p @@ -0,0 +1,55 @@ + +### Standard Output +#PBS -N no_name_job +#PBS -o ./pbs_out/turb_micro/micro_s101_11ms.out +### Standard Error +#PBS -e ./pbs_out/turb_micro/micro_s101_11ms.err +#PBS -W umask=0003 +### Maximum wallclock time format HOURS:MINUTES:SECONDS +#PBS -l walltime=00:59:59 +#PBS -lnodes=1:ppn=1 +### Queue name +#PBS -q workq + +### #PBS -a [start_time] +### #PBS -W depend=afterany:[job_id] + +### Browse to current working dir +echo "" +cd $PBS_O_WORKDIR +echo "current working dir:" +pwd +echo "" + +### =========================================================================== +echo "------------------------------------------------------------------------" +echo "PRELUDE" +echo "------------------------------------------------------------------------" + +winefix +cd /scratch/$USER/$PBS_JOBID/ + + +echo "" +echo "------------------------------------------------------------------------" +echo "EXECUTION" +echo "------------------------------------------------------------------------" + +time WINEARCH=win64 WINEPREFIX=~/.wine wine mann_turb_x64.exe micro_s101_11ms 21.000000 22.000000 23.000000 101 19 19 60 10.9990 10.9990 11.3300 1 +### wait for jobs to finish +wait + +echo "" +echo "------------------------------------------------------------------------" +echo "CODA" +echo "------------------------------------------------------------------------" + +# COPY BACK FROM SCRATCH AND RENAME, remove _ at end +cp micro_s101_11ms_u.bin $PBS_O_WORKDIR/turb_micro/micro_s101_11msu.bin +cp micro_s101_11ms_v.bin $PBS_O_WORKDIR/turb_micro/micro_s101_11msv.bin +cp micro_s101_11ms_w.bin $PBS_O_WORKDIR/turb_micro/micro_s101_11msw.bin + + +echo "" +### =========================================================================== +exit diff --git a/wetb/prepost/tests/data/demo_dlc/ref/prepost/remote_tags.txt b/wetb/prepost/tests/data/demo_dlc/ref/prepost/remote_tags.txt index 2ff04e02..b8bdb8f8 100644 --- a/wetb/prepost/tests/data/demo_dlc/ref/prepost/remote_tags.txt +++ b/wetb/prepost/tests/data/demo_dlc/ref/prepost/remote_tags.txt @@ -25,6 +25,12 @@ [G_t0] : True [Grid loss time] : 5000 [Induction] : 1 + [MannAlfaEpsilon_meander] : True + [MannAlfaEpsilon_micro] : True + [MannGamma_meander] : True + [MannGamma_micro] : True + [MannL_meander] : True + [MannL_micro] : True [Pitch 1 DLC22b] : 0 [Pitvel 1] : 3 [Pitvel 2] : 4 @@ -34,7 +40,7 @@ [TI] : 0.232 [Time pitch runaway] : 5000 [Time stuck DLC22b] : -1 - [Turb base name] : none + [Turb base name] : None [Windspeed] : 8 [case_id] : dlc01_steady_wsp8_noturb [data_dir] : data/ @@ -42,15 +48,23 @@ [duration] : 20.0 [gust] : False [gust_type] : True + [high_freq_comp_meander] : True + [high_freq_comp_micro] : True [htc_dir] : htc/dlc01_demos/ [init_wr] : 0.5 [iter_dir] : iter/dlc01_demos/ [log_dir] : logfiles/dlc01_demos/ + [meander_base_name] : None + [meander_dir] : None + [micro_base_name] : None + [micro_dir] : None [out_format] : hawc_binary [pbs_in_dir] : pbs_in/dlc01_demos/ [pbs_out_dir] : pbs_out/dlc01_demos/ [res_dir] : res/dlc01_demos/ [seed] : 0 + [seed_meander] : True + [seed_micro] : True [shear_exp] : 0 [staircase] : False [t flap on] : -1 @@ -59,8 +73,21 @@ [time_stop] : 40 [tu_model] : 0 [tu_seed] : 0 - [turb_base_name] : none - [turb_dx] : 0.03906 + [turb_base_name] : None + [turb_dir] : turb/ + [turb_dx] : 0.0390625 + [turb_dx_meander] : True + [turb_dx_micro] : True + [turb_dy_meander] : True + [turb_dy_micro] : True + [turb_dz_meander] : True + [turb_dz_micro] : True + [turb_nr_u_meander] : True + [turb_nr_u_micro] : True + [turb_nr_v_meander] : True + [turb_nr_v_micro] : True + [turb_nr_w_meander] : True + [turb_nr_w_micro] : True [wdir] : 0 [windramp] : False [wsp factor] : 1.0 @@ -83,6 +110,12 @@ [G_t0] : True [Grid loss time] : 5000 [Induction] : 1 + [MannAlfaEpsilon_meander] : True + [MannAlfaEpsilon_micro] : True + [MannGamma_meander] : True + [MannGamma_micro] : True + [MannL_meander] : True + [MannL_micro] : True [Pitch 1 DLC22b] : 0 [Pitvel 1] : 3 [Pitvel 2] : 4 @@ -92,7 +125,7 @@ [TI] : 0.2196 [Time pitch runaway] : 5000 [Time stuck DLC22b] : -1 - [Turb base name] : none + [Turb base name] : None [Windspeed] : 9 [case_id] : dlc01_steady_wsp9_noturb [data_dir] : data/ @@ -100,15 +133,23 @@ [duration] : 20.0 [gust] : False [gust_type] : True + [high_freq_comp_meander] : True + [high_freq_comp_micro] : True [htc_dir] : htc/dlc01_demos/ [init_wr] : 0.5 [iter_dir] : iter/dlc01_demos/ [log_dir] : logfiles/dlc01_demos/ + [meander_base_name] : None + [meander_dir] : None + [micro_base_name] : None + [micro_dir] : None [out_format] : hawc_binary [pbs_in_dir] : pbs_in/dlc01_demos/ [pbs_out_dir] : pbs_out/dlc01_demos/ [res_dir] : res/dlc01_demos/ [seed] : 0 + [seed_meander] : True + [seed_micro] : True [shear_exp] : 0 [staircase] : False [t flap on] : -1 @@ -117,8 +158,21 @@ [time_stop] : 40 [tu_model] : 0 [tu_seed] : 0 - [turb_base_name] : none - [turb_dx] : 0.04395 + [turb_base_name] : None + [turb_dir] : turb/ + [turb_dx] : 0.0439453 + [turb_dx_meander] : True + [turb_dx_micro] : True + [turb_dy_meander] : True + [turb_dy_micro] : True + [turb_dz_meander] : True + [turb_dz_micro] : True + [turb_nr_u_meander] : True + [turb_nr_u_micro] : True + [turb_nr_v_meander] : True + [turb_nr_v_micro] : True + [turb_nr_w_meander] : True + [turb_nr_w_micro] : True [wdir] : 0 [windramp] : False [wsp factor] : 0.8889 @@ -141,6 +195,12 @@ [G_t0] : True [Grid loss time] : 5000 [Induction] : 1 + [MannAlfaEpsilon_meander] : True + [MannAlfaEpsilon_micro] : True + [MannGamma_meander] : True + [MannGamma_micro] : True + [MannL_meander] : True + [MannL_micro] : True [Pitch 1 DLC22b] : 0 [Pitvel 1] : 3 [Pitvel 2] : 4 @@ -158,15 +218,23 @@ [duration] : 20.0 [gust] : False [gust_type] : True + [high_freq_comp_meander] : True + [high_freq_comp_micro] : True [htc_dir] : htc/dlc01_demos/ [init_wr] : 0.5 [iter_dir] : iter/dlc01_demos/ [log_dir] : logfiles/dlc01_demos/ + [meander_base_name] : None + [meander_dir] : None + [micro_base_name] : None + [micro_dir] : None [out_format] : hawc_binary [pbs_in_dir] : pbs_in/dlc01_demos/ [pbs_out_dir] : pbs_out/dlc01_demos/ [res_dir] : res/dlc01_demos/ [seed] : 100 + [seed_meander] : True + [seed_micro] : True [shear_exp] : 0 [staircase] : False [t flap on] : -1 @@ -176,7 +244,20 @@ [tu_model] : 1 [tu_seed] : 100 [turb_base_name] : turb_s100_10ms + [turb_dir] : turb/ [turb_dx] : 0.78125 + [turb_dx_meander] : True + [turb_dx_micro] : True + [turb_dy_meander] : True + [turb_dy_micro] : True + [turb_dz_meander] : True + [turb_dz_micro] : True + [turb_nr_u_meander] : True + [turb_nr_u_micro] : True + [turb_nr_v_meander] : True + [turb_nr_v_micro] : True + [turb_nr_w_meander] : True + [turb_nr_w_micro] : True [wdir] : 0 [windramp] : False [wsp factor] : 0.8 @@ -199,6 +280,12 @@ [G_t0] : True [Grid loss time] : 5000 [Induction] : 1 + [MannAlfaEpsilon_meander] : 11.0 + [MannAlfaEpsilon_micro] : 21.0 + [MannGamma_meander] : 13.0 + [MannGamma_micro] : 23.0 + [MannL_meander] : 12.0 + [MannL_micro] : 22.0 [Pitch 1 DLC22b] : 0 [Pitvel 1] : 3 [Pitvel 2] : 4 @@ -216,15 +303,23 @@ [duration] : 20.0 [gust] : False [gust_type] : True + [high_freq_comp_meander] : 1.0 + [high_freq_comp_micro] : True [htc_dir] : htc/dlc01_demos/ [init_wr] : 0.5 [iter_dir] : iter/dlc01_demos/ [log_dir] : logfiles/dlc01_demos/ + [meander_base_name] : meander_s101_11ms + [meander_dir] : turb_meander/ + [micro_base_name] : micro_s101_11ms + [micro_dir] : turb_micro/ [out_format] : hawc_binary [pbs_in_dir] : pbs_in/dlc01_demos/ [pbs_out_dir] : pbs_out/dlc01_demos/ [res_dir] : res/dlc01_demos/ [seed] : 100 + [seed_meander] : 101.0 + [seed_micro] : 101.0 [shear_exp] : 0 [staircase] : False [t flap on] : -1 @@ -234,7 +329,20 @@ [tu_model] : 1 [tu_seed] : 100 [turb_base_name] : turb_s101_11ms - [turb_dx] : 0.85938 + [turb_dir] : turb/ + [turb_dx] : 0.859375 + [turb_dx_meander] : 0.999 + [turb_dx_micro] : 10.999 + [turb_dy_meander] : 0.999 + [turb_dy_micro] : 10.999 + [turb_dz_meander] : 1.33 + [turb_dz_micro] : 11.33 + [turb_nr_u_meander] : 9.0 + [turb_nr_u_micro] : 19.0 + [turb_nr_v_meander] : 9.0 + [turb_nr_v_micro] : 19.0 + [turb_nr_w_meander] : 50.0 + [turb_nr_w_micro] : 60.0 [wdir] : 0 [windramp] : False [wsp factor] : 0.7273 diff --git a/wetb/prepost/tests/data/demo_dlc/ref/zip-chunks-gorm/remote_chnk_00000.p b/wetb/prepost/tests/data/demo_dlc/ref/zip-chunks-gorm/remote_chnk_00000.p index 7683139f..1e59d48f 100644 --- a/wetb/prepost/tests/data/demo_dlc/ref/zip-chunks-gorm/remote_chnk_00000.p +++ b/wetb/prepost/tests/data/demo_dlc/ref/zip-chunks-gorm/remote_chnk_00000.p @@ -81,13 +81,12 @@ echo 'current working directory:' pwd # copy to scratch db directory for [turb_db_dir], [turb_base_name] -cp ../turb/none* /scratch/$USER/$PBS_JOBID/remote/../turb/. cp ../turb/turb_s100_10ms* /scratch/$USER/$PBS_JOBID/remote/../turb/. cp ../turb/turb_s101_11ms* /scratch/$USER/$PBS_JOBID/remote/../turb/. -# copy to scratch db directory for [meand_db_dir], [meand_base_name] +# copy to scratch db directory for [meander_db_dir], [meander_base_name] -# copy to scratch db directory for [wake_db_dir], [wake_base_name] +# copy to scratch db directory for [micro_db_dir], [micro_base_name] echo "----------------------------------------------------------------------" cd /scratch/$USER/$PBS_JOBID/ @@ -95,17 +94,41 @@ echo 'current working directory:' pwd echo "create turb directories in CPU dirs" mkdir -p 0/turb/ +mkdir -p 0/turb_meander/ +mkdir -p 0/turb_micro/ mkdir -p 1/turb/ +mkdir -p 1/turb_meander/ +mkdir -p 1/turb_micro/ mkdir -p 2/turb/ +mkdir -p 2/turb_meander/ +mkdir -p 2/turb_micro/ mkdir -p 3/turb/ +mkdir -p 3/turb_meander/ +mkdir -p 3/turb_micro/ mkdir -p 4/turb/ +mkdir -p 4/turb_meander/ +mkdir -p 4/turb_micro/ mkdir -p 5/turb/ +mkdir -p 5/turb_meander/ +mkdir -p 5/turb_micro/ mkdir -p 6/turb/ +mkdir -p 6/turb_meander/ +mkdir -p 6/turb_micro/ mkdir -p 7/turb/ +mkdir -p 7/turb_meander/ +mkdir -p 7/turb_micro/ mkdir -p 8/turb/ +mkdir -p 8/turb_meander/ +mkdir -p 8/turb_micro/ mkdir -p 9/turb/ +mkdir -p 9/turb_meander/ +mkdir -p 9/turb_micro/ mkdir -p 10/turb/ +mkdir -p 10/turb_meander/ +mkdir -p 10/turb_micro/ mkdir -p 11/turb/ +mkdir -p 11/turb_meander/ +mkdir -p 11/turb_micro/ echo "----------------------------------------------------------------------" cd /scratch/$USER/$PBS_JOBID/remote/ diff --git a/wetb/prepost/tests/data/demo_dlc/ref/zip-chunks-gorm/remote_chnk_00000.zip b/wetb/prepost/tests/data/demo_dlc/ref/zip-chunks-gorm/remote_chnk_00000.zip index 286bbcb3df1c3701910dbc45b42117a01559344a..b2c89af8c5e72e4214fbbd03741389525650e5ac 100644 GIT binary patch delta 2273 zcmaJ?ZERCj7(Vx$wi|1^59qfayRenTZEaV#A+rHol!S>aLv)x((v7udQ`*(G8jUe9 zG{zr`>s^`WhY=7KVnm!~!Rtpf&V*z?2ATfZ21#)wXcW){A;hS}^U<~UT({lj^xX5_ z=Xu`uJ@@RnAAN4QJY}(V?L-C}pqCVXQ?b@;B-1Xo&i@$69O+H>21I1HyjPDj6J+|O z<o<AMpf5Qn;sr@-0T}I#N1{m)s=Qi<i1cSCcaP9HduL=Po403n7&di1w<~)qQ_pWs zDYg72r34Upq;$(ZipW>arWK1~Qrnfhl#=mrsqZuXfL>#jdYQ@vrEV?VjQ)wYf9@Fu zfR09h6E5VRY#qJSDs^V7rfZFzgYoFgc<L$1mhGIjkl?e^b@0K~$v|71Ve;#lE4!J9 z<^7|NM~DC&Tx0|ObOEkWFWxU*Sw*VG)Y9D6(%QTvH`7RIrE2IcsoYC9P<`UG^wluS zG1~Ts`U=sfqk$E=0m~s+qPA~_&u@Yc6>1_PEdIqYSnjQ&Jsv(1?|OY50Cf1qrqIUh zp|Miccn+qF>aiSr46*f}=iwzuow@`6C}pf)k9V9ASiGgX^DxP1bw&=h(iE3#yK@sn zeq!t!)PQF{kxc5X>u{!wL&_<{zU}Y1pbLPY>+H9v!`K*mAu^DZeF<4}{>o%o7v`r8 zhi^hR_UE9?dc%*J&>rm0L3_Q1%#Lt46>JKIgTYv;-oJk!t`TP%O&p&;!!bTD&*9J1 z_i}It;yb#y1}(51dK%*KtI$<eOpcFVh4)&t;;Q^3JS$oIBH9uv=U|JLwe=VHjCQS5 zpr(ofCEq(G3DTI-gosLrA;bTZd2N1wAQ_DfrlSE(v4r2T{1c+nfX`op=H;sJI`nG! z3aQ>o&z2MytrE1Mf^Fdm8)`PtbAf$M<idAt$f;Qd?Z|nMKGpjIUsr;E+YgZ2Vo$`6 z1bu->&46E&I7V)@Z)znf-eX7WLf;W|f4VOaj`gO}%=g4Rdjp40RE+>YhnFW|zlWsX z@CSC(BGWEvE;Owr{~dsi`vlO|OxBdC#`_$|QmsdN1mrN@=0FcH$HP5N<SCiU0FaEP z@Q@R^d3ce8B_sZ)5I9N#(5GaF6gSQ|Q5lDk4fj0Rqwrl2y4SlXbz**1f*b8`<SB)Z zMR6x6kyRyqj9+u2YM$tTgQUNx;MsX-$L~0ig@@13uz55)n{lzK4(iit-`9=yEu*Wv zuhpsjgqlc36N9O=FaJR-)=amX*}s!mD);}TZUGn{%8t^n!Ncn*Of+~cYD=|*Uv#1M z%pCD;7ph={-_7qj(nOYyh9aKGUOSy9{B#?defm=?x_ps1KJ?*c$P-a>$EVz=lASEU z+lzRTXy6<UdXSfTyWgMCClcIU-~|^bFT~UfwoVRiqk#JBI#b7_i&Ffh2U%I$MUU6x eZvupWn1{8@NnNxaqlpUML;m)a01$H{vic8wRbQ$A delta 1326 zcmZ`&T}V_x6uvWOS55pYH*3A>T`{wCbyr05CrY6p*d!Gy3Nh9aGI9mo5+rCXs29P# zd!dsLK}7XniEBzXL`b1RqwJv`Dxo0yRSdO<dMIdS?(XJav&^0|bI<pkGc(_LKOWb2 zKQ6w;1tyEc$3h@QjnCT3Otn~t{>;ptaC_a3WszEoY6FgVp2N-H&)ObtHJ9HdY_ETx z>1BiB(!Q$shGPvB7|thuuHkr8#c)Q{&`yQwFm{sFErxS8kQ2`<D&AASy`fu@8ix7; z2_+^^tEWj@C{2s<o@r}zc(ivDTZjh-50WfXQJJ%3$UZ3_vT$69<JEX0!|`cnC&Bd} zs9nFTkoU#^C)qlbHyKrk&MXq6f4M{wviXtpUw6nzw<xBlb3pH4gdO_BQhK$7l(Ky0 zLbUCq(R$N$nvgA`j?`tI?@yMbe%<$&-ZEowk*15B`t%~L0}Lv#PH&r{Zwaws@EJX% zpZZ99V+1xialt3B$gsIaC7o|*`)U?ZWZ4Hgy#~vk{gpq0tb(APG)Mo$u1<4c{>2dy zfGi;IN;#{)g1}}oPCcc?IA((w9E*ZF{o5kl3;Z)*n)L6n@M>u~H3nO)5X)}~&sm{J zIQOjJ6warx)13-(#cB2kC%wlV$6DO&-ljIDDncy~QDF69$Auf~dnAd^?2rVx@sTT< znQX&Y8R7)3RR)>P^k_%@3SMKI3V-gbDdz@uV2RIE4hsz*DMg<Q+l8nwDIHSjML*ip zA=B8YWjm%}KhsCm6KcU}#%Fx!mm!sW#t9h|h3h#?$Sv;-V<bs)RTk_@1IrTB4xCF{ z1GO;>k~pdfccp=$b)03nGOntU<n}bTxV_D-o@KYg)8iB`eN4rfbdYWQ#F54b2|Ubx zvujq>1_A~4l^49SBmM!j3_PC!<>GcnGeCyjcZe1YWa9h)iALvLV#;4h7U=|*Jul3} z?9Hy<JE*`45!EY@D5{P01bd+TW$~kru*wG6yem>fXru*Jg$}<qLb>$ufdUEQ=_6ui q@%ClZcd^n26`B0DB7$EPbXx*UB#@s{<1$Ba_$K!AGVi(t*y=B`wSE); diff --git a/wetb/prepost/tests/data/demo_dlc/ref/zip-chunks-jess/remote_chnk_00000.p b/wetb/prepost/tests/data/demo_dlc/ref/zip-chunks-jess/remote_chnk_00000.p index 330c9076..9625f4dd 100644 --- a/wetb/prepost/tests/data/demo_dlc/ref/zip-chunks-jess/remote_chnk_00000.p +++ b/wetb/prepost/tests/data/demo_dlc/ref/zip-chunks-jess/remote_chnk_00000.p @@ -97,13 +97,12 @@ echo 'current working directory:' pwd # copy to scratch db directory for [turb_db_dir], [turb_base_name] -cp ../turb/none* /scratch/$USER/$PBS_JOBID/remote/../turb/. cp ../turb/turb_s100_10ms* /scratch/$USER/$PBS_JOBID/remote/../turb/. cp ../turb/turb_s101_11ms* /scratch/$USER/$PBS_JOBID/remote/../turb/. -# copy to scratch db directory for [meand_db_dir], [meand_base_name] +# copy to scratch db directory for [meander_db_dir], [meander_base_name] -# copy to scratch db directory for [wake_db_dir], [wake_base_name] +# copy to scratch db directory for [micro_db_dir], [micro_base_name] echo "----------------------------------------------------------------------" cd /scratch/$USER/$PBS_JOBID/ @@ -111,25 +110,65 @@ echo 'current working directory:' pwd echo "create turb directories in CPU dirs" mkdir -p 0/turb/ +mkdir -p 0/turb_meander/ +mkdir -p 0/turb_micro/ mkdir -p 1/turb/ +mkdir -p 1/turb_meander/ +mkdir -p 1/turb_micro/ mkdir -p 2/turb/ +mkdir -p 2/turb_meander/ +mkdir -p 2/turb_micro/ mkdir -p 3/turb/ +mkdir -p 3/turb_meander/ +mkdir -p 3/turb_micro/ mkdir -p 4/turb/ +mkdir -p 4/turb_meander/ +mkdir -p 4/turb_micro/ mkdir -p 5/turb/ +mkdir -p 5/turb_meander/ +mkdir -p 5/turb_micro/ mkdir -p 6/turb/ +mkdir -p 6/turb_meander/ +mkdir -p 6/turb_micro/ mkdir -p 7/turb/ +mkdir -p 7/turb_meander/ +mkdir -p 7/turb_micro/ mkdir -p 8/turb/ +mkdir -p 8/turb_meander/ +mkdir -p 8/turb_micro/ mkdir -p 9/turb/ +mkdir -p 9/turb_meander/ +mkdir -p 9/turb_micro/ mkdir -p 10/turb/ +mkdir -p 10/turb_meander/ +mkdir -p 10/turb_micro/ mkdir -p 11/turb/ +mkdir -p 11/turb_meander/ +mkdir -p 11/turb_micro/ mkdir -p 12/turb/ +mkdir -p 12/turb_meander/ +mkdir -p 12/turb_micro/ mkdir -p 13/turb/ +mkdir -p 13/turb_meander/ +mkdir -p 13/turb_micro/ mkdir -p 14/turb/ +mkdir -p 14/turb_meander/ +mkdir -p 14/turb_micro/ mkdir -p 15/turb/ +mkdir -p 15/turb_meander/ +mkdir -p 15/turb_micro/ mkdir -p 16/turb/ +mkdir -p 16/turb_meander/ +mkdir -p 16/turb_micro/ mkdir -p 17/turb/ +mkdir -p 17/turb_meander/ +mkdir -p 17/turb_micro/ mkdir -p 18/turb/ +mkdir -p 18/turb_meander/ +mkdir -p 18/turb_micro/ mkdir -p 19/turb/ +mkdir -p 19/turb_meander/ +mkdir -p 19/turb_micro/ echo "----------------------------------------------------------------------" cd /scratch/$USER/$PBS_JOBID/remote/ diff --git a/wetb/prepost/tests/data/demo_dlc/ref/zip-chunks-jess/remote_chnk_00000.zip b/wetb/prepost/tests/data/demo_dlc/ref/zip-chunks-jess/remote_chnk_00000.zip index 286bbcb3df1c3701910dbc45b42117a01559344a..b2c89af8c5e72e4214fbbd03741389525650e5ac 100644 GIT binary patch delta 2273 zcmaJ?ZERCj7(Vx$wi|1^59qfayRenTZEaV#A+rHol!S>aLv)x((v7udQ`*(G8jUe9 zG{zr`>s^`WhY=7KVnm!~!Rtpf&V*z?2ATfZ21#)wXcW){A;hS}^U<~UT({lj^xX5_ z=Xu`uJ@@RnAAN4QJY}(V?L-C}pqCVXQ?b@;B-1Xo&i@$69O+H>21I1HyjPDj6J+|O z<o<AMpf5Qn;sr@-0T}I#N1{m)s=Qi<i1cSCcaP9HduL=Po403n7&di1w<~)qQ_pWs zDYg72r34Upq;$(ZipW>arWK1~Qrnfhl#=mrsqZuXfL>#jdYQ@vrEV?VjQ)wYf9@Fu zfR09h6E5VRY#qJSDs^V7rfZFzgYoFgc<L$1mhGIjkl?e^b@0K~$v|71Ve;#lE4!J9 z<^7|NM~DC&Tx0|ObOEkWFWxU*Sw*VG)Y9D6(%QTvH`7RIrE2IcsoYC9P<`UG^wluS zG1~Ts`U=sfqk$E=0m~s+qPA~_&u@Yc6>1_PEdIqYSnjQ&Jsv(1?|OY50Cf1qrqIUh zp|Miccn+qF>aiSr46*f}=iwzuow@`6C}pf)k9V9ASiGgX^DxP1bw&=h(iE3#yK@sn zeq!t!)PQF{kxc5X>u{!wL&_<{zU}Y1pbLPY>+H9v!`K*mAu^DZeF<4}{>o%o7v`r8 zhi^hR_UE9?dc%*J&>rm0L3_Q1%#Lt46>JKIgTYv;-oJk!t`TP%O&p&;!!bTD&*9J1 z_i}It;yb#y1}(51dK%*KtI$<eOpcFVh4)&t;;Q^3JS$oIBH9uv=U|JLwe=VHjCQS5 zpr(ofCEq(G3DTI-gosLrA;bTZd2N1wAQ_DfrlSE(v4r2T{1c+nfX`op=H;sJI`nG! z3aQ>o&z2MytrE1Mf^Fdm8)`PtbAf$M<idAt$f;Qd?Z|nMKGpjIUsr;E+YgZ2Vo$`6 z1bu->&46E&I7V)@Z)znf-eX7WLf;W|f4VOaj`gO}%=g4Rdjp40RE+>YhnFW|zlWsX z@CSC(BGWEvE;Owr{~dsi`vlO|OxBdC#`_$|QmsdN1mrN@=0FcH$HP5N<SCiU0FaEP z@Q@R^d3ce8B_sZ)5I9N#(5GaF6gSQ|Q5lDk4fj0Rqwrl2y4SlXbz**1f*b8`<SB)Z zMR6x6kyRyqj9+u2YM$tTgQUNx;MsX-$L~0ig@@13uz55)n{lzK4(iit-`9=yEu*Wv zuhpsjgqlc36N9O=FaJR-)=amX*}s!mD);}TZUGn{%8t^n!Ncn*Of+~cYD=|*Uv#1M z%pCD;7ph={-_7qj(nOYyh9aKGUOSy9{B#?defm=?x_ps1KJ?*c$P-a>$EVz=lASEU z+lzRTXy6<UdXSfTyWgMCClcIU-~|^bFT~UfwoVRiqk#JBI#b7_i&Ffh2U%I$MUU6x eZvupWn1{8@NnNxaqlpUML;m)a01$H{vic8wRbQ$A delta 1326 zcmZ`&T}V_x6uvWOS55pYH*3A>T`{wCbyr05CrY6p*d!Gy3Nh9aGI9mo5+rCXs29P# zd!dsLK}7XniEBzXL`b1RqwJv`Dxo0yRSdO<dMIdS?(XJav&^0|bI<pkGc(_LKOWb2 zKQ6w;1tyEc$3h@QjnCT3Otn~t{>;ptaC_a3WszEoY6FgVp2N-H&)ObtHJ9HdY_ETx z>1BiB(!Q$shGPvB7|thuuHkr8#c)Q{&`yQwFm{sFErxS8kQ2`<D&AASy`fu@8ix7; z2_+^^tEWj@C{2s<o@r}zc(ivDTZjh-50WfXQJJ%3$UZ3_vT$69<JEX0!|`cnC&Bd} zs9nFTkoU#^C)qlbHyKrk&MXq6f4M{wviXtpUw6nzw<xBlb3pH4gdO_BQhK$7l(Ky0 zLbUCq(R$N$nvgA`j?`tI?@yMbe%<$&-ZEowk*15B`t%~L0}Lv#PH&r{Zwaws@EJX% zpZZ99V+1xialt3B$gsIaC7o|*`)U?ZWZ4Hgy#~vk{gpq0tb(APG)Mo$u1<4c{>2dy zfGi;IN;#{)g1}}oPCcc?IA((w9E*ZF{o5kl3;Z)*n)L6n@M>u~H3nO)5X)}~&sm{J zIQOjJ6warx)13-(#cB2kC%wlV$6DO&-ljIDDncy~QDF69$Auf~dnAd^?2rVx@sTT< znQX&Y8R7)3RR)>P^k_%@3SMKI3V-gbDdz@uV2RIE4hsz*DMg<Q+l8nwDIHSjML*ip zA=B8YWjm%}KhsCm6KcU}#%Fx!mm!sW#t9h|h3h#?$Sv;-V<bs)RTk_@1IrTB4xCF{ z1GO;>k~pdfccp=$b)03nGOntU<n}bTxV_D-o@KYg)8iB`eN4rfbdYWQ#F54b2|Ubx zvujq>1_A~4l^49SBmM!j3_PC!<>GcnGeCyjcZe1YWa9h)iALvLV#;4h7U=|*Jul3} z?9Hy<JE*`45!EY@D5{P01bd+TW$~kru*wG6yem>fXru*Jg$}<qLb>$ufdUEQ=_6ui q@%ClZcd^n26`B0DB7$EPbXx*UB#@s{<1$Ba_$K!AGVi(t*y=B`wSE); diff --git a/wetb/prepost/tests/data/demo_dlc/source/htc/DLCs/dlc01_demos.xlsx b/wetb/prepost/tests/data/demo_dlc/source/htc/DLCs/dlc01_demos.xlsx index e2b99c94f3fa9b74fcbc6d0602a4849b7713c369..cd350b43a56ac2c01f006899c06bc2515a09c465 100755 GIT binary patch delta 6212 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 X^XF=i{D+PhC4!0)g87B&xAcDifw)0Y delta 5206 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 diff --git a/wetb/prepost/tests/test_Simulations.py b/wetb/prepost/tests/test_Simulations.py index 4f18d65c..baa5f317 100644 --- a/wetb/prepost/tests/test_Simulations.py +++ b/wetb/prepost/tests/test_Simulations.py @@ -98,12 +98,11 @@ class TestGenerateInputs(Template): print() raise - # we can not git check-in empty dirs so we can not compare the complete # directory structure withouth manually creating the empty dirs here for subdir in ['control', 'data', 'htc', 'pbs_in', 'pbs_in_turb', 'htc/_master', 'htc/dlc01_demos', 'pbs_in/dlc01_demos', - 'zip-chunks-gorm', 'zip-chunks-jess']: + 'zip-chunks-jess', 'zip-chunks-gorm']: remote = os.path.join(p_root, tmpl.PROJECT, 'remote', subdir) ref = os.path.join(p_root, tmpl.PROJECT, 'ref', subdir) # the zipfiles are taken care of separately -- GitLab