diff --git a/env/JET.env b/env/JET.env index 8bab0b7ef21..6d9aac16b96 100755 --- a/env/JET.env +++ b/env/JET.env @@ -13,19 +13,20 @@ fi step=$1 -# Theia information -export npe_node_max=24 -export launcher="mpirun -np" - -# Configure MPI environment -export MPI_BUFS_PER_PROC=2048 -export MPI_BUFS_PER_HOST=2048 -export MPI_GROUP_MAX=256 -export MPI_MEMMAP_OFF=1 -export MP_STDOUTMODE="ORDERED" +if [[ "$PARTITION_BATCH" = "xjet" ]]; then + export npe_node_max=24 +elif [[ "$PARTITION_BATCH" = "vjet" ]]; then + export npe_node_max=16 +fi +export launcher="srun --export=ALL" + +# Configure STACK export OMP_STACKSIZE=2048000 export NTHSTACK=1024000000 -#export LD_BIND_NOW=1 + +ulimit -s unlimited +ulimit -a + export job=${PBS_JOBNAME:-$step} export jobid=${job}.${PBS_JOBID:-$$} @@ -34,8 +35,8 @@ if [ $step = "prep" -o $step = "prepbufr" ]; then nth_max=$(($npe_node_max / $npe_node_prep)) export POE="NO" - export BACK=${BACK:-"YES"} - export sys_tp="Cray-CS400" + export BACK=${BACK:-"NO"} + export sys_tp="JET" elif [ $step = "waveinit" -o $step = "waveprep" -o $step = "wavepostsbs" -o $step = "wavepostbndpnt" -o $step = "wavepostbndpntbll" -o $step = "wavepostpnt" ]; then diff --git a/modulefiles/module_base.jet b/modulefiles/module_base.jet index c6c767eedc5..8799c896ed0 100644 --- a/modulefiles/module_base.jet +++ b/modulefiles/module_base.jet @@ -1,32 +1,27 @@ +#%Module###################################################################### ## -## nems prerequisites +## FV3GFS prerequisites ## -proc ModulesHelp {} { - puts stderr "The prerequisites for compiling or running FV3 on Jet. " -} +# Load hpc-stack +module use /lfs4/HFIP/hfv3gfs/nwprod/hpc-stack/libs/modulefiles/stack +module load hpc/1.1.0 -module load newdefaults intel/15.0.3.187 impi/5.1.3.181 szip hdf5 netcdf4/4.2.1.1 +# Load intel compiler and mpi +module load hpc-intel/18.0.5.274 +module load hpc-impi/2018.4.274 -module use /lfs3/projects/hfv3gfs/nwprod/lib/modulefiles -module load bacio/v2.0.2 -module load sp/v2.0.2 -module load ip/v2.0.0 -module load w3nco/v2.0.6 -module load w3emc/v2.2.0 -module load nemsio/v2.2.2 - -#set NCEPLIBS $::env(NCEPLIBS) -#module use $NCEPLIBS/modulefiles -#module load esmf/7.1.0r_impi - -module use /lfs3/projects/hwrf-vd/soft/modulefiles -module load prod_util -module load grib_util +module load wgrib2/2.0.8 module load hpss - -# mpiserial on Jet includes a cfp wrapper -module load mpiserial - +module load nco/4.9.1 +module load cdo/1.9.5 module load gempak/7.4.2 - +module load prod_util/v1.0.18 +module load grib_util/v1.1.1 +module load g2tmpl/1.6.0 +module load crtm/2.3.0 +module load esmflocal/8_0_1 +module load netcdfp/4.7.4 + +# rocoto +module load rocoto diff --git a/modulefiles/workflow_utils.jet b/modulefiles/workflow_utils.jet new file mode 100644 index 00000000000..4e93598ea28 --- /dev/null +++ b/modulefiles/workflow_utils.jet @@ -0,0 +1,32 @@ +#%Module##################################################### +## Workflow Utilities - hera +############################################################# + +# Load cmake +module load cmake/3.16.1 + +# Load hpc-stack +module use /lfs4/HFIP/hfv3gfs/nwprod/hpc-stack/libs/modulefiles/stack +module load hpc/1.1.0 + +# Load intel compiler and mpi +module load hpc-intel/18.0.5.274 +module load hpc-impi/2018.4.274 + +module load jasper/2.0.25 +module load zlib/1.2.11 +module load png/1.6.35 + +module load bacio/2.4.1 +module load w3nco/2.4.1 +module load w3emc/2.7.3 +module load sp/2.3.3 +module load ip/3.3.3 +module load nemsio/2.5.2 +module load nemsiogfs/2.5.3 +module load sigio/2.3.2 +module load g2/3.4.1 +module load bufr/11.4.0 + +module load hdf5/1.10.6 +module load netcdf/4.7.4 diff --git a/sorc/build_fv3.sh b/sorc/build_fv3.sh index 67c28e02ae8..aadc9989bbf 100755 --- a/sorc/build_fv3.sh +++ b/sorc/build_fv3.sh @@ -18,6 +18,7 @@ fi if [ $target = hera ]; then target=hera.intel ; fi if [ $target = orion ]; then target=orion.intel ; fi +if [ $target = jet ]; then target=jet.intel ; fi cd fv3gfs.fd/ FV3=$( pwd -P )/FV3 diff --git a/sorc/build_gfs_util.sh b/sorc/build_gfs_util.sh index 2ea60a59aab..527cff6c47e 100755 --- a/sorc/build_gfs_util.sh +++ b/sorc/build_gfs_util.sh @@ -14,6 +14,12 @@ if [ ! -d "./mkgfsawps.fd" ]; then exit fi +if [ $target = jet ]; then + echo " GFS_UTIL does not support JET " + echo " " + exit +fi + echo "" echo " Building ... Executables for GFS_UTILITIES " echo "" diff --git a/sorc/build_gldas.sh b/sorc/build_gldas.sh index e8162d3f4f6..958aa0c1e1b 100755 --- a/sorc/build_gldas.sh +++ b/sorc/build_gldas.sh @@ -4,6 +4,12 @@ set -eux source ./machine-setup.sh > /dev/null 2>&1 cwd=`pwd` +if [ $target = jet ]; then + echo " GLDAS does not support JET " + echo " " + exit +fi + USE_PREINST_LIBS=${USE_PREINST_LIBS:-"true"} if [ $USE_PREINST_LIBS = true ]; then export MOD_PATH=/scratch3/NCEPDEV/nwprod/lib/modulefiles diff --git a/sorc/build_ww3prepost.sh b/sorc/build_ww3prepost.sh index d2554d038e7..49ebfb8f606 100755 --- a/sorc/build_ww3prepost.sh +++ b/sorc/build_ww3prepost.sh @@ -10,6 +10,13 @@ finalexecdir=$( pwd -P )/../exec set +x source ./machine-setup.sh > /dev/null 2>&1 + +if [ $target = jet ]; then + echo " WW3 does not support JET " + echo " " + exit +fi + source ../modulefiles/modulefile.ww3.$target set -x diff --git a/sorc/link_fv3gfs.sh b/sorc/link_fv3gfs.sh index 7869afb22e3..7b484cca6b6 100755 --- a/sorc/link_fv3gfs.sh +++ b/sorc/link_fv3gfs.sh @@ -8,16 +8,16 @@ machine=${2} if [ $# -lt 2 ]; then echo '***ERROR*** must specify two arguements: (1) RUN_ENVIR, (2) machine' - echo ' Syntax: link_fv3gfs.sh ( nco | emc ) ( cray | dell | hera | orion )' + echo ' Syntax: link_fv3gfs.sh ( nco | emc ) ( cray | dell | hera | orion | jet )' exit 1 fi if [ $RUN_ENVIR != emc -a $RUN_ENVIR != nco ]; then - echo 'Syntax: link_fv3gfs.sh ( nco | emc ) ( cray | dell | hera | orion )' + echo 'Syntax: link_fv3gfs.sh ( nco | emc ) ( cray | dell | hera | orion | jet )' exit 1 fi -if [ $machine != cray -a $machine != dell -a $machine != hera -a $machine != orion ]; then - echo 'Syntax: link_fv3gfs.sh ( nco | emc ) ( cray | dell | hera | orion )' +if [ $machine != cray -a $machine != dell -a $machine != hera -a $machine != orion -a $machine != jet ]; then + echo 'Syntax: link_fv3gfs.sh ( nco | emc ) ( cray | dell | hera | orion | jet )' exit 1 fi @@ -38,6 +38,8 @@ elif [ $machine = "hera" ]; then FIX_DIR="/scratch1/NCEPDEV/global/glopara/fix" elif [ $machine = "orion" ]; then FIX_DIR="/work/noaa/global/glopara/fix" +elif [ $machine = "jet" ]; then + FIX_DIR="/lfs4/HFIP/hfv3gfs/glopara/git/fv3gfs/fix" fi cd ${pwd}/../fix ||exit 8 dirs=`ls $FIX_DIR` diff --git a/ush/rocoto/rocoto.py b/ush/rocoto/rocoto.py index 1996e6f8158..77ea6597090 100755 --- a/ush/rocoto/rocoto.py +++ b/ush/rocoto/rocoto.py @@ -10,8 +10,6 @@ AUTHOR: Rahul.Mahajan rahul.mahajan@noaa.gov - Brian Curtis (2021): Port to python 3.6.3+ - brian.curtis@noaa.gov ''' def create_metatask(task_dict, metatask_dict): @@ -33,17 +31,17 @@ def create_metatask(task_dict, metatask_dict): strings = [] - strings.append(f'\n') + strings.append('\n' % metataskname) strings.append('\n') - strings.append(f'\t{str(varval)}\n') + strings.append('\t%s\n' % (varname, str(varval))) if vardict is not None: for key in vardict.keys(): value = str(vardict[key]) - strings.append(f'\t{value}\n') + strings.append('\t%s\n' % (key, value)) strings.append('\n') tasklines = create_task(task_dict) for tl in tasklines: - strings.append(f'{tl}') if tl == '\n' else strings.append(f'\t{tl}') + strings.append('%s' % tl) if tl == '\n' else strings.append('\t%s' % tl) strings.append('\n') strings.append('\n') @@ -83,35 +81,36 @@ def create_task(task_dict): strings = [] - strings.append(f'\n') + strings.append('\n' % \ + (taskname, cycledef, str_maxtries, str_final)) strings.append('\n') - strings.append(f'\t{command}\n') + strings.append('\t%s\n' % command) strings.append('\n') - strings.append(f'\t{jobname}\n') - strings.append(f'\t{account}\n') - strings.append(f'\t{queue}\n') + strings.append('\t%s\n' % jobname) + strings.append('\t%s\n' % account) + strings.append('\t%s\n' % queue) if partition is not None: - strings.append(f'\t{partition}\n') + strings.append('\t%s\n' % partition) if resources is not None: - strings.append(f'\t{resources}\n') - strings.append(f'\t{walltime}\n') + strings.append('\t%s\n' % resources) + strings.append('\t%s\n' % walltime) if memory is not None: - strings.append(f'\t{memory}\n') + strings.append('\t%s\n' % memory) if native is not None: - strings.append(f'\t{native}\n') + strings.append('\t%s\n' % native) strings.append('\n') - strings.append(f'\t{log}\n') + strings.append('\t%s\n' % log) strings.append('\n') if envar[0] is not None: for e in envar: - strings.append(f'\t{e}\n') + strings.append('\t%s\n' % e) strings.append('\n') if dependency is not None: strings.append('\t\n') for d in dependency: - strings.append(f'\t\t{d}\n') + strings.append('\t\t%s\n' % d) strings.append('\t\n') strings.append('\n') @@ -150,11 +149,11 @@ def add_dependency(dep_dict): else: - msg = f'Unknown dependency type {dep_dict["type"]}' + msg = 'Unknown dependency type %s' % dep_dict['type'] raise KeyError(msg) if dep_condition is not None: - string = f'<{dep_condition}>{string}' + string = '<%s>%s' % (dep_condition, string, dep_condition) return string @@ -173,13 +172,13 @@ def add_task_tag(dep_dict): dep_offset = dep_dict.get('offset', None) if dep_name is None: - msg = f'a {dep_type} name is necessary for {dep_type} dependency' + msg = 'a %s name is necessary for %s dependency' % (dep_type, dep_type) raise KeyError(msg) string = '<' - string += f'{dep_type}dep {dep_type}="{dep_name}"' + string += '%sdep %s="%s"' % (dep_type, dep_type, dep_name) if dep_offset is not None: - string += f' cycle_offset="{dep_offset}"' + string += ' cycle_offset="%s"' % dep_offset string += '/>' return string @@ -198,7 +197,7 @@ def add_data_tag(dep_dict): dep_offset = dep_dict.get('offset', None) if dep_data is None: - msg = f'a data value is necessary for {dep_type} dependency' + msg = 'a data value is necessary for %s dependency' % dep_type raise KeyError(msg) if dep_offset is None: @@ -209,11 +208,11 @@ def add_data_tag(dep_dict): offset_string_b = '' offset_string_e = '' else: - offset_string_b = f'' + offset_string_b = '' % dep_offset offset_string_e = '' string = '' - string += f'{offset_string_b}{dep_data}{offset_string_e}' + string += '%s%s%s' % (offset_string_b, dep_data, offset_string_e) string += '' return string @@ -231,10 +230,10 @@ def add_cycle_tag(dep_dict): dep_offset = dep_dict.get('offset', None) if dep_offset is None: - msg = f'an offset value is necessary for {dep_type} dependency' + msg = 'an offset value is necessary for %s dependency' % dep_type raise KeyError(msg) - string = f'' + string = '' % dep_offset return string @@ -254,17 +253,17 @@ def add_streq_tag(dep_dict): fail = False msg = '' if dep_left is None: - msg += f'a left value is necessary for {dep_type} dependency' + msg += 'a left value is necessary for %s dependency' % dep_type fail = True if dep_right is None: if fail: msg += '\n' - msg += f'a right value is necessary for {dep_type} dependency' + msg += 'a right value is necessary for %s dependency' % dep_type fail = True if fail: raise KeyError(msg) - string = f'<{dep_type}>{dep_left}{dep_right}' + string = '<%s>%s%s' % (dep_type, dep_left, dep_right, dep_type) return string @@ -306,18 +305,18 @@ def create_dependency(dep_condition=None, dep=None): strings = [] if dep_condition is not None: - strings.append(f'<{dep_condition}>') + strings.append('<%s>' % dep_condition) if dep[0] is not None: for d in dep: if dep_condition is None: - strings.append(f'{d}') + strings.append('%s' % d) else: for e in _traverse(d): - strings.append(f'\t{e}') + strings.append('\t%s' % e) if dep_condition is not None: - strings.append(f'') + strings.append('' % dep_condition) return strings @@ -336,8 +335,8 @@ def create_envar(name=None,value=None): string = '' string += '' - string += f'{name}' - string += f'{str(value)}' + string += '%s' % name + string += '%s' % str(value) string += '' return string diff --git a/ush/rocoto/setup_expt_fcstonly.py b/ush/rocoto/setup_expt_fcstonly.py index 94fc27d32cf..11438cb0657 100755 --- a/ush/rocoto/setup_expt_fcstonly.py +++ b/ush/rocoto/setup_expt_fcstonly.py @@ -28,9 +28,9 @@ def makedirs_if_missing(d): def create_EXPDIR(): makedirs_if_missing(expdir) - configs = glob.glob(f'{configdir}/config.*') + configs = glob.glob('%s/config.*' % configdir) if len(configs) == 0: - msg = f'no config files found in {configdir}' + msg = 'no config files found in %s' % configdir raise IOError(msg) for config in configs: shutil.copy(config, expdir) @@ -47,7 +47,7 @@ def create_COMROT(): def edit_baseconfig(): - base_config = f'{expdir}/config.base' + base_config = '%s/config.base' % expdir here = os.path.dirname(__file__) top = os.path.abspath(os.path.join(os.path.abspath(here), '../..')) @@ -55,7 +55,7 @@ def edit_baseconfig(): # make a copy of the default before editing shutil.copy(base_config, base_config + '.default') - print(f'\nSDATE = {idate}\nEDATE = {edate}') + print '\nSDATE = %s\nEDATE = %s' % (idate, edate) with open(base_config + '.default', 'rt') as fi: with open(base_config + '.new', 'wt') as fo: for line in fi: @@ -64,7 +64,7 @@ def edit_baseconfig(): .replace('@SDATE@', idate.strftime('%Y%m%d%H')) \ .replace('@FDATE@', fdate.strftime('%Y%m%d%H')) \ .replace('@EDATE@', edate.strftime('%Y%m%d%H')) \ - .replace('@CASECTL@', f'C{res}') \ + .replace('@CASECTL@', 'C%d' % res) \ .replace('@HOMEgfs@', top) \ .replace('@BASE_GIT@', base_git) \ .replace('@DMPDIR@', dmpdir) \ @@ -83,21 +83,21 @@ def edit_baseconfig(): .replace('@CHGRP_RSTPROD@', chgrp_rstprod) \ .replace('@CHGRP_CMD@', chgrp_cmd) \ .replace('@HPSSARCH@', hpssarch) \ - .replace('@gfs_cyc@', f'{gfs_cyc}') + .replace('@gfs_cyc@', '%d' % gfs_cyc) if expdir is not None: line = line.replace('@EXPDIR@', os.path.dirname(expdir)) if comrot is not None: line = line.replace('@ROTDIR@', os.path.dirname(comrot)) - line = line.replace('@ICSDIR@', os.path.join(os.path.dirname(comrot), 'FV3ICS')) + line = line.replace('@ICSDIR@', os.path.join(os.path.dirname(comrot), 'gfsinit')) fo.write(line) os.unlink(base_config) os.rename(base_config + '.new', base_config) - print('') - print(f'EDITED: {expdir}/config.base as per user input.') - print(f'DEFAULT: {expdir}/config.base.default is for reference only.') - print('Please verify and delete the default file before proceeding.') - print('') + print '' + print 'EDITED: %s/config.base as per user input.' % expdir + print 'DEFAULT: %s/config.base.default is for reference only.' % expdir + print 'Please verify and delete the default file before proceeding.' + print '' return @@ -118,7 +118,7 @@ def edit_baseconfig(): parser.add_argument('--configdir', help='full path to directory containing the config files', type=str, required=False, default=None) parser.add_argument('--gfs_cyc', help='GFS cycles to run', type=int, choices=[0, 1, 2, 4], default=1, required=False) parser.add_argument('--partition', help='partition on machine', type=str, required=False, default=None) - parser.add_argument('--start', help='restart mode: warm or cold', type=str, choices=['warm', 'cold'], required=False) + parser.add_argument('--start', help='restart mode: warm or cold', type=str, choices=['warm', 'cold'], required=False, default='cold') args = parser.parse_args() @@ -139,12 +139,7 @@ def edit_baseconfig(): start = args.start # Set restart setting in config.base - if start is None: - if res == 768: - exp_warm_start = '.true.' - else: - exp_warm_start = '.false.' - elif start == 'cold': + if start == 'cold': exp_warm_start = '.false.' elif start == 'warm': exp_warm_start = '.true.' @@ -195,7 +190,7 @@ def edit_baseconfig(): base_svn = '/scratch1/NCEPDEV/global/glopara/svn' dmpdir = '/scratch1/NCEPDEV/global/glopara/dump' nwprod = '/scratch1/NCEPDEV/global/glopara/nwpara' - comroot = '/scratch1/NCEPDEV/rstprod/com' + comroot = '/scratch1/NCEPDEV/global/glopara/com' homedir = '/scratch1/NCEPDEV/global/$USER' stmp = '/scratch1/NCEPDEV/stmp2/$USER' ptmp = '/scratch1/NCEPDEV/stmp4/$USER' @@ -207,6 +202,24 @@ def edit_baseconfig(): chgrp_rstprod = 'YES' chgrp_cmd = 'chgrp rstprod' hpssarch = 'YES' + elif machine == 'JET': + base_git = '/lfs4/HFIP/hfv3gfs/glopara/git' + base_svn = '/dev/null/global/save/glopara/svn/' + dmpdir = '/lfs4/HFIP/hfv3gfs/glopara/dump' + nwprod = '/lfs4/HFIP/hfv3gfs/glopara/nwpara' + comroot = '/lfs4/HFIP/hfv3gfs/glopara/com' + homedir = '/lfs4/HFIP/hfv3gfs/$USER' + stmp = '/lfs4/HFIP/hfv3gfs/${USER}/stmp' + ptmp = '/lfs4/HFIP/hfv3gfs/${USER}/ptmp' + noscrub = '$HOMEDIR' + account = 'hfv3gfs' + queue = 'batch' + queue_service = 'service' + partition_batch = '$PARTITION_BATCH' + chgrp_rstprod = 'YES' + chgrp_cmd = 'chgrp rstprrod' + exp_warm_start = '.false.' + hpssarch = 'YES' elif machine == 'ORION': base_git = '/work/noaa/global/glopara/git' base_svn = '/work/noaa/global/glopara/svn' @@ -228,10 +241,10 @@ def edit_baseconfig(): # COMROT directory create_comrot = True if os.path.exists(comrot): - print() - print(f'COMROT already exists in {comrot}') - print() - overwrite_comrot = input('Do you wish to over-write COMROT [y/N]: ') + print + print 'COMROT already exists in %s' % comrot + print + overwrite_comrot = raw_input('Do you wish to over-write COMROT [y/N]: ') create_comrot = True if overwrite_comrot in ['y', 'yes', 'Y', 'YES'] else False if create_comrot: shutil.rmtree(comrot) @@ -242,10 +255,10 @@ def edit_baseconfig(): # EXP directory create_expdir = True if os.path.exists(expdir): - print() - print(f'EXPDIR already exists in {expdir}') - print() - overwrite_expdir = input('Do you wish to over-write EXPDIR [y/N]: ') + print + print 'EXPDIR already exists in %s' % expdir + print + overwrite_expdir = raw_input('Do you wish to over-write EXPDIR [y/N]: ') create_expdir = True if overwrite_expdir in ['y', 'yes', 'Y', 'YES'] else False if create_expdir: shutil.rmtree(expdir) diff --git a/ush/rocoto/setup_workflow_fcstonly.py b/ush/rocoto/setup_workflow_fcstonly.py index c4a47ef708c..7403f795a29 100755 --- a/ush/rocoto/setup_workflow_fcstonly.py +++ b/ush/rocoto/setup_workflow_fcstonly.py @@ -41,9 +41,9 @@ def main(): _base = wfu.config_parser([wfu.find_config('config.base', configs)]) if not os.path.samefile(args.expdir,_base['EXPDIR']): - print('MISMATCH in experiment directories!') - print(f'''config.base: EXPDIR = {repr(_base['EXPDIR'])}''') - print(f'input arg: --expdir = {repr(args.expdir)}') + print 'MISMATCH in experiment directories!' + print 'config.base: EXPDIR = %s' % repr(_base['EXPDIR']) + print 'input arg: --expdir = %s' % repr(args.expdir) sys.exit(1) dict_configs = wfu.source_configs(configs, taskplan) @@ -78,7 +78,7 @@ def get_preamble(): strings.append('\t\trahul.mahajan@noaa.gov\n') strings.append('\n') strings.append('\tNOTES:\n') - strings.append(f'\t\tThis workflow was automatically generated at {datetime.now()}\n') + strings.append('\t\tThis workflow was automatically generated at %s\n' % datetime.now()) strings.append('\t-->\n') return ''.join(strings) @@ -97,42 +97,42 @@ def get_definitions(base): strings.append('\n') strings.append('\t\n') - strings.append(f'''\t\n''') - strings.append(f'''\t\n''') - strings.append(f'''\t\n''') + strings.append('\t\n' % base['PSLOT']) + strings.append('\t\n' % base['CDUMP']) + strings.append('\t\n' % base['CASE']) strings.append('\n') strings.append('\t\n') - strings.append(f'''\t\n''') - strings.append(f'''\t\n''') + strings.append('\t\n' % base['SDATE'].strftime('%Y%m%d%H%M')) + strings.append('\t\n' % base['EDATE'].strftime('%Y%m%d%H%M')) if base['INTERVAL'] is None: - print('cycle INTERVAL cannot be None') + print 'cycle INTERVAL cannot be None' sys.exit(1) - strings.append(f'''\t\n''') + strings.append('\t\n' % base['INTERVAL']) strings.append('\n') strings.append('\t\n') - strings.append(f'''\t\n''') + strings.append('\t\n' % base['RUN_ENVIR']) strings.append('\n') strings.append('\t\n') - strings.append(f'''\t\n''') - strings.append(f'''\t\n''') - strings.append(f'''\t\n''') + strings.append('\t\n' % base['EXPDIR']) + strings.append('\t\n' % base['ROTDIR']) + strings.append('\t\n' % base['ICSDIR']) strings.append('\n') strings.append('\t\n') - strings.append(f'''\t\n''') - strings.append(f'''\t\n''') + strings.append('\t\n' % base['HOMEgfs']) + strings.append('\t\n' % base['BASE_JOB']) strings.append('\n') strings.append('\t\n') - strings.append(f'''\t\n''') - strings.append(f'''\t\n''') - strings.append(f'''\t\n''') - if scheduler in ['slurm'] and machine in ['ORION']: - strings.append(f'''\t\n''') + strings.append('\t\n' % base['ACCOUNT']) + strings.append('\t\n' % base['QUEUE']) + strings.append('\t\n' % base['QUEUE_SERVICE']) + if scheduler in ['slurm'] and machine in ['ORION','JET']: + strings.append('\t\n' % base['PARTITION_BATCH']) if scheduler in ['slurm']: - strings.append(f'''\t\n''') - strings.append(f'\t\n') + strings.append('\t\n' % base['QUEUE_SERVICE']) + strings.append('\t\n' % scheduler) strings.append('\n') strings.append('\t\n') - strings.append(f'''\t\n''') + strings.append('\t\n' % base['HPSSARCH']) strings.append('\n') strings.append('\t\n') strings.append('\t\n') @@ -170,18 +170,22 @@ def get_resources(dict_configs, cdump='gdas'): wtimestr, resstr, queuestr, memstr, natstr = wfu.get_resources(machine, cfg, task, reservation, cdump=cdump) - taskstr = f'{task.upper()}_{cdump.upper()}' + taskstr = '%s_%s' % (task.upper(), cdump.upper()) - strings.append(f'\t\n') + strings.append('\t\n' % (taskstr, queuestr)) if scheduler in ['slurm'] and machine in ['ORION'] and task not in ['getic', 'arch']: - strings.append(f'\t\n') + strings.append('\t\n' % taskstr ) if scheduler in ['slurm'] and task in ['getic', 'arch']: - strings.append(f'\t\n') - strings.append(f'\t\n') - strings.append(f'\t\n') + strings.append('\t\n' % taskstr ) + if scheduler in ['slurm'] and machine in ['JET'] and task in ['fcst']: + strings.append('\t\n' % taskstr ) + if scheduler in ['slurm'] and machine in ['JET'] and task in ['post']: + strings.append('\t\n' % taskstr ) + strings.append('\t\n' % (taskstr, wtimestr)) + strings.append('\t\n' % (taskstr, resstr)) if len(memstr) != 0: - strings.append(f'\t\n') - strings.append(f'\t\n') + strings.append('\t\n' % (taskstr, memstr)) + strings.append('\t\n' % (taskstr, natstr)) strings.append('\n') @@ -198,23 +202,23 @@ def get_postgroups(post, cdump='gdas'): # Get a list of all forecast hours if cdump in ['gdas']: - fhrs = list(range(fhmin, fhmax+fhout, fhout)) + fhrs = range(fhmin, fhmax+fhout, fhout) elif cdump in ['gfs']: fhmax = np.max([post['FHMAX_GFS_00'],post['FHMAX_GFS_06'],post['FHMAX_GFS_12'],post['FHMAX_GFS_18']]) fhout = post['FHOUT_GFS'] fhmax_hf = post['FHMAX_HF_GFS'] fhout_hf = post['FHOUT_HF_GFS'] - fhrs_hf = list(range(fhmin, fhmax_hf+fhout_hf, fhout_hf)) - fhrs = fhrs_hf + list(range(fhrs_hf[-1]+fhout, fhmax+fhout, fhout)) + fhrs_hf = range(fhmin, fhmax_hf+fhout_hf, fhout_hf) + fhrs = fhrs_hf + range(fhrs_hf[-1]+fhout, fhmax+fhout, fhout) npostgrp = post['NPOSTGRP'] ngrps = npostgrp if len(fhrs) > npostgrp else len(fhrs) - fhrs = [f'f{f:03d}' for f in fhrs] + fhrs = ['f%03d' % f for f in fhrs] fhrs = np.array_split(fhrs, ngrps) fhrs = [f.tolist() for f in fhrs] - fhrgrp = ' '.join([f'{x:03d}' for x in range(1, ngrps+1)]) + fhrgrp = ' '.join(['%03d' % x for x in range(1, ngrps+1)]) fhrdep = ' '.join([f[-1] for f in fhrs]) fhrlst = ' '.join(['_'.join(f) for f in fhrs]) @@ -284,7 +288,7 @@ def get_workflow(dict_configs, cdump='gdas'): if hpssarch in ['YES']: deps = [] - dep_dict = {'type': 'task', 'name': f'{cdump}getic'} + dep_dict = {'type': 'task', 'name': '%sgetic' % cdump} deps.append(rocoto.add_dependency(dep_dict)) dependencies2 = rocoto.create_dependency(dep=deps) @@ -307,9 +311,9 @@ def get_workflow(dict_configs, cdump='gdas'): # waveprep if do_wave in ['Y', 'YES'] and do_wave_cdump in ['GFS', 'BOTH']: deps = [] - dep_dict = {'type': 'task', 'name': f'{cdump}waveinit'} + dep_dict = {'type': 'task', 'name': '%swaveinit' % cdump} deps.append(rocoto.add_dependency(dep_dict)) - dep_dict = {'type': 'task', 'name': f'{cdump}init'} + dep_dict = {'type': 'task', 'name': '%sinit' % cdump} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) task = wfu.create_wf_task('waveprep', cdump=cdump, envar=envars, dependency=dependencies) @@ -328,7 +332,7 @@ def get_workflow(dict_configs, cdump='gdas'): if do_wave in ['Y', 'YES'] and do_wave_cdump in ['GFS', 'BOTH']: deps = [] - dep_dict = {'type': 'task', 'name': f'{cdump}waveprep'} + dep_dict = {'type': 'task', 'name': '%swaveprep' % cdump} deps.append(rocoto.add_dependency(dep_dict)) dependencies2 = rocoto.create_dependency(dep_condition='and', dep=deps) @@ -344,7 +348,7 @@ def get_workflow(dict_configs, cdump='gdas'): # post deps = [] - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.log#dep#.txt' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.log#dep#.txt' % (cdump, cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps) @@ -363,13 +367,13 @@ def get_workflow(dict_configs, cdump='gdas'): # wavepostsbs if do_wave in ['Y', 'YES'] and do_wave_cdump in ['GFS', 'BOTH']: deps = [] - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/wave/rundata/{cdump}wave.out_grd.gnh_10m.@Y@m@d.@H0000' + data = '&ROTDIR;/%s.@Y@m@d/@H/wave/rundata/%swave.out_grd.gnh_10m.@Y@m@d.@H0000' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/wave/rundata/{cdump}wave.out_grd.aoc_9km.@Y@m@d.@H0000' + data = '&ROTDIR;/%s.@Y@m@d/@H/wave/rundata/%swave.out_grd.aoc_9km.@Y@m@d.@H0000' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/wave/rundata/{cdump}wave.out_grd.gsh_15m.@Y@m@d.@H0000' + data = '&ROTDIR;/%s.@Y@m@d/@H/wave/rundata/%swave.out_grd.gsh_15m.@Y@m@d.@H0000' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) @@ -380,7 +384,7 @@ def get_workflow(dict_configs, cdump='gdas'): # wavepostbndpnt if do_wave in ['Y', 'YES']: deps = [] - dep_dict = {'type':'task', 'name':f'{cdump}fcst'} + dep_dict = {'type':'task', 'name':'%sfcst' % cdump} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps) task = wfu.create_wf_task('wavepostbndpnt', cdump=cdump, envar=envars, dependency=dependencies) @@ -390,7 +394,7 @@ def get_workflow(dict_configs, cdump='gdas'): # wavepostbndpntbll if do_wave in ['Y', 'YES']: deps = [] - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.logf180.txt' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.logf180.txt' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps) @@ -401,9 +405,9 @@ def get_workflow(dict_configs, cdump='gdas'): # wavepostpnt if do_wave in ['Y', 'YES']: deps = [] - dep_dict = {'type':'task', 'name':f'{cdump}fcst'} + dep_dict = {'type':'task', 'name':'%sfcst' % cdump} deps.append(rocoto.add_dependency(dep_dict)) - dep_dict = {'type':'task', 'name':f'{cdump}wavepostbndpntbll'} + dep_dict = {'type':'task', 'name':'%swavepostbndpntbll' % cdump} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) task = wfu.create_wf_task('wavepostpnt', cdump=cdump, envar=envars, dependency=dependencies) @@ -413,7 +417,7 @@ def get_workflow(dict_configs, cdump='gdas'): # wavegempak if do_wave in ['Y', 'YES'] and do_gempak in ['Y', 'YES']: deps = [] - dep_dict = {'type':'task', 'name':f'{cdump}wavepostsbs'} + dep_dict = {'type':'task', 'name':'%swavepostsbs' % cdump} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps) task = wfu.create_wf_task('wavegempak', cdump=cdump, envar=envars, dependency=dependencies) @@ -423,9 +427,9 @@ def get_workflow(dict_configs, cdump='gdas'): # waveawipsbulls if do_wave in ['Y', 'YES'] and do_awips in ['Y', 'YES']: deps = [] - dep_dict = {'type':'task', 'name':f'{cdump}wavepostsbs'} + dep_dict = {'type':'task', 'name':'%swavepostsbs' % cdump} deps.append(rocoto.add_dependency(dep_dict)) - dep_dict = {'type':'task', 'name':f'{cdump}wavepostpnt'} + dep_dict = {'type':'task', 'name':'%swavepostpnt' % cdump} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) task = wfu.create_wf_task('waveawipsbulls', cdump=cdump, envar=envars, dependency=dependencies) @@ -435,7 +439,7 @@ def get_workflow(dict_configs, cdump='gdas'): # waveawipsgridded if do_wave in ['Y', 'YES'] and do_awips in ['Y', 'YES']: deps = [] - dep_dict = {'type':'task', 'name':f'{cdump}wavepostsbs'} + dep_dict = {'type':'task', 'name':'%swavepostsbs' % cdump} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps) task = wfu.create_wf_task('waveawipsgridded', cdump=cdump, envar=envars, dependency=dependencies) @@ -445,34 +449,34 @@ def get_workflow(dict_configs, cdump='gdas'): # wafs if do_wafs in ['Y', 'YES']: deps = [] - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if006' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if006' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if012' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if012' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if015' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if015' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if018' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if018' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if021' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if021' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if024' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if024' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if027' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if027' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if030' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if030' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if033' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if033' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if036' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if036' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) @@ -483,34 +487,34 @@ def get_workflow(dict_configs, cdump='gdas'): # wafsgcip if do_wafs in ['Y', 'YES']: deps = [] - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if006' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if006' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if012' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if012' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if015' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if015' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if018' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if018' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if021' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if021' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if024' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if024' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if027' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if027' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if030' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if030' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if033' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if033' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if036' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if036' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) @@ -521,34 +525,34 @@ def get_workflow(dict_configs, cdump='gdas'): # wafsgrib2 if do_wafs in ['Y', 'YES']: deps = [] - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if006' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if006' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if012' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if012' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if015' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if015' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if018' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if018' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if021' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if021' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if024' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if024' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if027' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if027' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if030' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if030' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if033' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if033' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if036' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if036' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) @@ -559,34 +563,34 @@ def get_workflow(dict_configs, cdump='gdas'): # wafsgrib20p25 if do_wafs in ['Y', 'YES']: deps = [] - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if006' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if006' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if012' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if012' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if015' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if015' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if018' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if018' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if021' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if021' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if024' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if024' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if027' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if027' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if030' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if030' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if033' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if033' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{cdump}.@Y@m@d/@H/atmos/{cdump}.t@Hz.wafs.grb2if036' + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.wafs.grb2if036' % (cdump,cdump) dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) @@ -597,7 +601,7 @@ def get_workflow(dict_configs, cdump='gdas'): # wafsblending if do_wafs in ['Y', 'YES']: deps = [] - dep_dict = {'type': 'task', 'name': f'{cdump}wafsgrib2'} + dep_dict = {'type': 'task', 'name': '%swafsgrib2' % cdump} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps) task = wfu.create_wf_task('wafsblending', cdump=cdump, envar=envars, dependency=dependencies) @@ -607,7 +611,7 @@ def get_workflow(dict_configs, cdump='gdas'): # wafsblending0p25 if do_wafs in ['Y', 'YES']: deps = [] - dep_dict = {'type': 'task', 'name': f'{cdump}wafsgrib20p25'} + dep_dict = {'type': 'task', 'name': '%swafsgrib20p25' % cdump} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps) task = wfu.create_wf_task('wafsblending0p25', cdump=cdump, envar=envars, dependency=dependencies) @@ -617,7 +621,7 @@ def get_workflow(dict_configs, cdump='gdas'): #postsnd if do_bufrsnd in ['Y', 'YES']: deps = [] - dep_dict = {'type': 'task', 'name': f'{cdump}fcst'} + dep_dict = {'type': 'task', 'name': '%sfcst' % cdump} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps) task = wfu.create_wf_task('postsnd', cdump=cdump, envar=envars, dependency=dependencies) @@ -627,7 +631,7 @@ def get_workflow(dict_configs, cdump='gdas'): # awips if do_awips in ['Y', 'YES']: deps = [] - dep_dict = {'type': 'metatask', 'name': f'{cdump}post'} + dep_dict = {'type': 'metatask', 'name': '%spost' % cdump} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps) fhrgrp = rocoto.create_envar(name='FHRGRP', value='#grp#') @@ -645,7 +649,7 @@ def get_workflow(dict_configs, cdump='gdas'): # gempak if do_gempak in ['Y', 'YES']: deps = [] - dep_dict = {'type': 'metatask', 'name': f'{cdump}post'} + dep_dict = {'type': 'metatask', 'name': '%spost' % cdump} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps) task = wfu.create_wf_task('gempak', cdump=cdump, envar=envars, dependency=dependencies) @@ -654,7 +658,7 @@ def get_workflow(dict_configs, cdump='gdas'): # vrfy deps = [] - dep_dict = {'type':'metatask', 'name':f'{cdump}post'} + dep_dict = {'type':'metatask', 'name':'%spost' % cdump} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps) task = wfu.create_wf_task('vrfy', cdump=cdump, envar=envars, dependency=dependencies) @@ -664,9 +668,9 @@ def get_workflow(dict_configs, cdump='gdas'): # metp if do_metp in ['Y', 'YES']: deps = [] - dep_dict = {'type':'metatask', 'name':f'{cdump}post'} + dep_dict = {'type':'metatask', 'name':'%spost' % cdump} deps.append(rocoto.add_dependency(dep_dict)) - dep_dict = {'type':'task', 'name':f'{cdump}arch', 'offset':'-&INTERVAL;'} + dep_dict = {'type':'task', 'name':'%sarch' % cdump, 'offset':'-&INTERVAL;'} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) sdate_gfs = rocoto.create_envar(name='SDATE_GFS', value='&SDATE;') @@ -681,16 +685,16 @@ def get_workflow(dict_configs, cdump='gdas'): # arch deps = [] - dep_dict = {'type':'metatask', 'name':f'{cdump}post'} + dep_dict = {'type':'metatask', 'name':'%spost' % cdump} deps.append(rocoto.add_dependency(dep_dict)) - dep_dict = {'type':'task', 'name':f'{cdump}vrfy'} + dep_dict = {'type':'task', 'name':'%svrfy' % cdump} deps.append(rocoto.add_dependency(dep_dict)) if do_wave in ['Y', 'YES']: - dep_dict = {'type': 'task', 'name': f'{cdump}wavepostsbs'} + dep_dict = {'type': 'task', 'name': '%swavepostsbs' % cdump} deps.append(rocoto.add_dependency(dep_dict)) - dep_dict = {'type': 'task', 'name': f'{cdump}wavepostpnt'} + dep_dict = {'type': 'task', 'name': '%swavepostpnt' % cdump} deps.append(rocoto.add_dependency(dep_dict)) - dep_dict = {'type': 'task', 'name': f'{cdump}wavepostbndpnt'} + dep_dict = {'type': 'task', 'name': '%swavepostbndpnt' % cdump} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) task = wfu.create_wf_task('arch', cdump=cdump, envar=envars, dependency=dependencies, final=True) @@ -715,7 +719,7 @@ def get_workflow_body(dict_configs, cdump='gdas'): strings.append('\t&EXPDIR;/logs/@Y@m@d@H.log\n') strings.append('\n') strings.append('\t\n') - strings.append(f'\t&SDATE; &EDATE; &INTERVAL;\n') + strings.append('\t&SDATE; &EDATE; &INTERVAL;\n' % cdump) strings.append('\n') strings.append(get_workflow(dict_configs, cdump=cdump)) strings.append('\n') @@ -754,7 +758,7 @@ def create_xml(dict_configs): workflow = temp_workflow # Start writing the XML file - fh = open(f'{base["EXPDIR"]}/{base["PSLOT"]}.xml', 'w') + fh = open('%s/%s.xml' % (base['EXPDIR'], base['PSLOT']), 'w') fh.write(preamble) fh.write(definitions) diff --git a/ush/rocoto/workflow_utils.py b/ush/rocoto/workflow_utils.py index 1918badb004..a414e3deb45 100644 --- a/ush/rocoto/workflow_utils.py +++ b/ush/rocoto/workflow_utils.py @@ -16,6 +16,7 @@ DATE_ENV_VARS=['CDATE','SDATE','EDATE'] SCHEDULER_MAP={'HERA':'slurm', + 'JET':'slurm', 'ORION':'slurm', 'WCOSS':'lsf', 'WCOSS_DELL_P3':'lsf', @@ -34,14 +35,13 @@ def __init__(self,scripts,errors): def get_shell_env(scripts): vars=dict() - runme=''.join([ f'source {s} ; ' for s in scripts ]) - magic=f'--- ENVIRONMENT BEGIN {random.randint(0,64**5)} ---' - runme+=f'/bin/echo -n "{(magic,)}" ; /usr/bin/env -0' - with open('/dev/null','w') as null: + runme=''.join([ 'source %s ; '%(s,) for s in scripts ]) + magic='--- ENVIRONMENT BEGIN %d ---'%random.randint(0,64**5) + runme+='/bin/echo -n "%s" ; /usr/bin/env -0'%(magic,) + with open('/dev/null','wb+') as null: env=subprocess.Popen(runme,shell=True,stdin=null.fileno(), stdout=subprocess.PIPE) (out,err)=env.communicate() - out = out.decode() begin=out.find(magic) if begin<0: raise ShellScriptException(scripts,'Cannot find magic string; ' @@ -71,7 +71,7 @@ def get_configs(expdir): return a list of configs minus the ones ending with ".default" """ result=list() - for config in glob.glob(f'{expdir}/config.*'): + for config in glob.glob('%s/config.*' % expdir): if not config.endswith('.default'): result.append(config) return result @@ -82,7 +82,8 @@ def find_config(config_name, configs): if config_name == os.path.basename(config): return config - raise UnknownConfigError(f'{config_name} does not exist (known: {repr(config_name)}), ABORT!') + raise UnknownConfigError("%s does not exist (known: %s), ABORT!" % ( + config_name,repr(config_name))) def source_configs(configs, tasks): ''' @@ -113,9 +114,9 @@ def source_configs(configs, tasks): files.append(find_config('config.fcst', configs)) files.append(find_config('config.efcs', configs)) else: - files.append(find_config(f'config.{task}', configs)) + files.append(find_config('config.%s' % task, configs)) - print(f'sourcing config.{task}') + print 'sourcing config.%s' % task dict_configs[task] = config_parser(files) return dict_configs @@ -130,10 +131,10 @@ def config_parser(files): in the script. :rtype: dict """ - if isinstance(files,(str, bytes)): + if isinstance(files,basestring): files=[files] varbles=dict() - for key,value in get_script_env(files).items(): + for key,value in get_script_env(files).iteritems(): if key in DATE_ENV_VARS: # likely a date, convert to datetime varbles[key] = datetime.strptime(value,'%Y%m%d%H') elif '.' in value: # Likely a number and that too a float @@ -145,7 +146,7 @@ def config_parser(files): def detectMachine(): - machines = ['HERA', 'ORION', 'WCOSS_C', 'WCOSS_DELL_P3'] + machines = ['HERA', 'ORION', 'WCOSS_C', 'WCOSS_DELL_P3', 'JET'] if os.path.exists('/scratch1/NCEPDEV'): return 'HERA' @@ -155,45 +156,47 @@ def detectMachine(): return 'WCOSS_C' elif os.path.exists('/gpfs/dell2'): return 'WCOSS_DELL_P3' + elif os.path.exists('/lfs4/HFIP'): + return 'JET' else: - print(f'workflow is currently only supported on: {machines}') + print 'workflow is currently only supported on: %s' % ' '.join(machines) raise NotImplementedError('Cannot auto-detect platform, ABORT!') def get_scheduler(machine): try: return SCHEDULER_MAP[machine] except KeyError: - raise UnknownMachineError(f'Unknown machine: {machine}, ABORT!') + raise UnknownMachineError('Unknown machine: %s, ABORT!' % machine) def create_wf_task(task, cdump='gdas', cycledef=None, envar=None, dependency=None, \ metatask=None, varname=None, varval=None, vardict=None, \ final=False): if metatask is None: - taskstr = f'{task}' + taskstr = '%s' % task else: - taskstr = f'{task}#{varname}#' - metataskstr = f'{cdump}{metatask}' + taskstr = '%s#%s#' % (task, varname) + metataskstr = '%s%s' % (cdump, metatask) metatask_dict = {'metataskname': metataskstr, \ - 'varname': f'{varname}', \ - 'varval': f'{varval}', \ + 'varname': '%s' % varname, \ + 'varval': '%s' % varval, \ 'vardict': vardict} - taskstr = f'{cdump}{taskstr}' + taskstr = '%s%s' % (cdump, taskstr) cycledefstr = cdump if cycledef is None else cycledef - task_dict = {'taskname': f'{taskstr}', \ - 'cycledef': f'{cycledefstr}', \ + task_dict = {'taskname': '%s' % taskstr, \ + 'cycledef': '%s' % cycledefstr, \ 'maxtries': '&MAXTRIES;', \ - 'command': f'&JOBS_DIR;/{task}.sh', \ - 'jobname': f'&PSLOT;_{taskstr}_@H', \ + 'command': '&JOBS_DIR;/%s.sh' % task, \ + 'jobname': '&PSLOT;_%s_@H' % taskstr, \ 'account': '&ACCOUNT;', \ - 'queue': f'&QUEUE_{task.upper()}_{cdump.upper()};', \ - 'walltime': f'&WALLTIME_{task.upper()}_{cdump.upper()};', \ - 'native': f'&NATIVE_{task.upper()}_{cdump.upper()};', \ - 'memory': f'&MEMORY_{task.upper()}_{cdump.upper()};', \ - 'resources': f'&RESOURCES_{task.upper()}_{cdump.upper()};', \ - 'log': f'&ROTDIR;/logs/@Y@m@d@H/{taskstr}.log', \ + 'queue': '&QUEUE_%s_%s;' % (task.upper(), cdump.upper()), \ + 'walltime': '&WALLTIME_%s_%s;' % (task.upper(), cdump.upper()), \ + 'native': '&NATIVE_%s_%s;' % (task.upper(), cdump.upper()), \ + 'memory': '&MEMORY_%s_%s;' % (task.upper(), cdump.upper()), \ + 'resources': '&RESOURCES_%s_%s;' % (task.upper(), cdump.upper()), \ + 'log': '&ROTDIR;/logs/@Y@m@d@H/%s.log' % taskstr, \ 'envar': envar, \ 'dependency': dependency, \ 'final': final} @@ -201,9 +204,12 @@ def create_wf_task(task, cdump='gdas', cycledef=None, envar=None, dependency=Non # Add PARTITION_BATCH to all non-service jobs on Orion (SLURM) if get_scheduler(detectMachine()) in ['slurm'] and detectMachine() in ['ORION']: task_dict['partition'] = '&PARTITION_BATCH;' - # Add PARTITION_SERVICE to all service jobs (SLURM) - if get_scheduler(detectMachine()) in ['slurm'] and task in ['getic','arch','earc']: - task_dict['partition'] = f'&PARTITION_{task.upper()}_{cdump.upper()};' + # Add PARTITION_SERVICE to all service jobs on Hera (SLURM) + if get_scheduler(detectMachine()) in ['slurm'] and task in ['getic','arch','earc'] and detectMachine() in ['HERA']: + task_dict['partition'] = '&PARTITION_%s_%s;' % (task.upper(),cdump.upper()) + # Add PARTITION_SERVICE to all service jobs on JET (SLURM) + if get_scheduler(detectMachine()) in ['slurm'] and task in ['getic','arch','earc','fcst'] and detectMachine() in ['JET']: + task_dict['partition'] = '&PARTITION_%s_%s;' % (task.upper(),cdump.upper()) if metatask is None: task = rocoto.create_task(task_dict) @@ -220,7 +226,7 @@ def create_firstcyc_task(cdump='gdas'): ''' task = 'firstcyc' - taskstr = f'{task}' + taskstr = '%s' % task deps = [] data = '&EXPDIR;/logs/@Y@m@d@H.log' @@ -230,18 +236,18 @@ def create_firstcyc_task(cdump='gdas'): deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) - task_dict = {'taskname': f'{taskstr}' , \ + task_dict = {'taskname': '%s' % taskstr, \ 'cycledef': 'first', \ 'maxtries': '&MAXTRIES;', \ 'final' : True, \ 'command': 'sleep 1', \ - 'jobname': f'&PSLOT;_{taskstr}_@H', \ + 'jobname': '&PSLOT;_%s_@H' % taskstr, \ 'account': '&ACCOUNT;', \ 'queue': '&QUEUE_SERVICE;', \ - 'walltime': f'&WALLTIME_ARCH_{cdump.upper()};', \ - 'native': f'&NATIVE_ARCH_{cdump.upper()};', \ - 'resources': f'&RESOURCES_ARCH_{cdump.upper()};', \ - 'log': f'&ROTDIR;/logs/@Y@m@d@H/{taskstr}.log', \ + 'walltime': '&WALLTIME_ARCH_%s;' % cdump.upper(), \ + 'native': '&NATIVE_ARCH_%s;' % cdump.upper(), \ + 'resources': '&RESOURCES_ARCH_%s;' % cdump.upper(), \ + 'log': '&ROTDIR;/logs/@Y@m@d@H/%s.log' % taskstr, \ 'dependency': dependencies} if get_scheduler(detectMachine()) in ['slurm']: @@ -275,33 +281,27 @@ def get_resources(machine, cfg, task, reservation, cdump='gdas'): scheduler = get_scheduler(machine) - if cdump in ['gfs'] and f'wtime_{task}_gfs' in cfg.keys(): - wtimestr = cfg[f'wtime_{task}_gfs'] + if cdump in ['gfs'] and 'wtime_%s_gfs' % task in cfg.keys(): + wtimestr = cfg['wtime_%s_gfs' % task] else: - wtimestr = cfg[f'wtime_{task}'] + wtimestr = cfg['wtime_%s' % task] ltask = 'eobs' if task in ['eomg'] else task - memory = cfg.get(f'memory_{ltask}', None) + memory = cfg.get('memory_%s' % ltask, None) - if cdump in ['gfs'] and f'npe_{task}_gfs' in cfg.keys(): - tasks = cfg[f'npe_{ltask}_gfs'] + if cdump in ['gfs'] and 'npe_%s_gfs' % task in cfg.keys(): + tasks = cfg['npe_%s_gfs' % ltask] else: - try: - tasks = cfg[f'npe_{ltask}'] - except KeyError: - tasks = cfg["',)npe_waveawipsgridded"] - - if cdump in ['gfs'] and f'npe_node_{task}_gfs' in cfg.keys(): - ppn = cfg[f'npe_node_{ltask}_gfs'] - else: - ppn = cfg[f'npe_node_{ltask}'] - - if machine in [ 'WCOSS_DELL_P3', 'HERA', 'ORION']: - try: - threads = cfg[f'nth_{ltask}'] - except KeyError: - threads = cfg["',)nth_epos"] + tasks = cfg['npe_%s' % ltask] + + if cdump in ['gfs'] and 'npe_node_%s_gfs' % task in cfg.keys(): + ppn = cfg['npe_node_%s_gfs' % ltask] + else: + ppn = cfg['npe_node_%s' % ltask] + + if machine in [ 'WCOSS_DELL_P3', 'HERA', 'ORION', 'JET' ]: + threads = cfg['nth_%s' % ltask] nodes = np.int(np.ceil(np.float(tasks) / np.float(ppn))) @@ -311,28 +311,28 @@ def get_resources(machine, cfg, task, reservation, cdump='gdas'): if scheduler in ['slurm']: natstr = '--export=NONE' - if machine in ['HERA', 'ORION', 'WCOSS_C', 'WCOSS_DELL_P3']: + if machine in ['HERA', 'JET', 'ORION', 'WCOSS_C', 'WCOSS_DELL_P3']: - if machine in ['HERA', 'ORION']: - resstr = f'{nodes}:ppn={ppn}:tpp={threads}' + if machine in ['HERA', 'JET', 'ORION']: + resstr = '%d:ppn=%d:tpp=%d' % (nodes, ppn, threads) else: - resstr = f'{nodes}:ppn={ppn}' + resstr = '%d:ppn=%d' % (nodes, ppn) if machine in ['WCOSS_C'] and task in ['arch', 'earc', 'getic']: resstr += '' if machine in ['WCOSS_DELL_P3']: if not reservation in ['NONE']: - natstr = f"-U {reservation} -R 'affinity[core({threads})]'" + natstr = "-U %s -R 'affinity[core(%d)]'" % (reservation, threads) else: - natstr = f"-R 'affinity[core({threads})]'" + natstr = "-R 'affinity[core(%d)]'" % (threads) if task in ['arch', 'earc', 'getic']: natstr = "-R 'affinity[core(1)]'" elif machine in ['WCOSS']: - resstr = f'{tasks}' + resstr = '%d' % tasks if task in ['arch', 'earc', 'getic']: queuestr = '&QUEUE;' if scheduler in ['slurm'] else '&QUEUE_SERVICE;' @@ -350,7 +350,7 @@ def create_crontab(base, cronint=5): # No point creating a crontab if rocotorun is not available. rocotoruncmd = find_executable('rocotorun') if rocotoruncmd is None: - print('Failed to find rocotorun, crontab will not be created') + print 'Failed to find rocotorun, crontab will not be created' return # Leaving the code for a wrapper around crontab file if needed again later @@ -379,13 +379,13 @@ def create_crontab(base, cronint=5): # # else: - rocotorunstr = f'''{rocotoruncmd} -d {base['EXPDIR']}/{base['PSLOT']}.db -w {base['EXPDIR']}/{base['PSLOT']}.xml''' - cronintstr = f'*/{cronint} * * * *' + rocotorunstr = '%s -d %s/%s.db -w %s/%s.xml' % (rocotoruncmd, base['EXPDIR'], base['PSLOT'], base['EXPDIR'], base['PSLOT']) + cronintstr = '*/%d * * * *' % cronint # On WCOSS, rocoto module needs to be loaded everytime cron runs if base['machine'] in ['WCOSS']: rocotoloadstr = '. /usrx/local/Modules/default/init/sh; module use -a /usrx/local/emc_rocoto/modulefiles; module load rocoto/1.3.0rc2)' - rocotorunstr = f'({rocotoloadstr} {rocotorunstr})' + rocotorunstr = '(%s %s)' % (rocotoloadstr, rocotorunstr) try: REPLYTO = os.environ['REPLYTO'] @@ -395,13 +395,13 @@ def create_crontab(base, cronint=5): strings = [] strings.append('\n') - strings.append(f'''#################### {base['PSLOT']} ####################\n''') - strings.append(f'MAILTO="{REPLYTO}"\n') - strings.append(f'{cronintstr} {rocotorunstr}\n') + strings.append('#################### %s ####################\n' % base['PSLOT']) + strings.append('MAILTO="%s"\n' % REPLYTO) + strings.append('%s %s\n' % (cronintstr, rocotorunstr)) strings.append('#################################################################\n') strings.append('\n') - fh = open(os.path.join(base['EXPDIR'], f'''{base['PSLOT']}.crontab'''), 'w') + fh = open(os.path.join(base['EXPDIR'], '%s.crontab' % base['PSLOT']), 'w') fh.write(''.join(strings)) fh.close() diff --git a/util/modulefiles/gfs_util.jet b/util/modulefiles/gfs_util.jet new file mode 100644 index 00000000000..62e198e12db --- /dev/null +++ b/util/modulefiles/gfs_util.jet @@ -0,0 +1,31 @@ +#%Module##################################################### +## Module file for GFS util +############################################################# +# +# Loading required system modules +# + +# Load hpc-stack +module use /lfs4/HFIP/hfv3gfs/nwprod/hpc-stack/libs/modulefiles/stack +module load hpc/1.1.0 + +# Load intel compiler and mpi +module load hpc-intel/18.0.5.274 +module load hpc-impi/2018.4.274 + +module load bacio/2.4.1 +module load w3emc/2.7.3 +module load w3nco/2.4.1 +module load ip/3.3.3 +module load sp/2.3.3 +module load bufr/11.4.0 + +module load jasper/2.0.22 +module load png/1.6.35 +module load zlib/1.2.11 + +module load ncl/6.5.0 +module load gempak/7.4.2 + +export GEMINC=/apps/gempak/7.4.2/gempak/include +export GEMOLB=/apps/gempak/7.4.2/os/linux64/lib