diff --git a/.gitmodules b/.gitmodules index 4f564f93..d9b7f42d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,4 @@ [submodule "tests/produtil/NCEPLIBS-pyprodutil"] path = tests/produtil/NCEPLIBS-pyprodutil - url = gerrit:NCEPLIBS-pyprodutil + url = https://github.com/NOAA-EMC/NCEPLIBS-pyprodutil + branch = port-2-hera diff --git a/src/conf/module-setup.csh.inc b/src/conf/module-setup.csh.inc index 37f304fd..d3145e83 100644 --- a/src/conf/module-setup.csh.inc +++ b/src/conf/module-setup.csh.inc @@ -8,13 +8,13 @@ if ( { test -d /lfs3 } ) then source /apps/lmod/lmod/init/$__ms_shell endif module purge -else if ( { test -d /scratch1 } ) then +else if ( { test -d /scratch1 -a ! -d /scratch } ) then # We are on NOAA Hera if ( ! { module help >& /dev/null } ) then source /apps/lmod/lmod/init/$__ms_shell endif module purge -else if ( { test -d /scratch3 } ) then +else if ( { test -d /scratch3 -a -d /scratch } ) then # We are on NOAA Theia if ( ! { module help >& /dev/null } ) then source /apps/lmod/lmod/init/$__ms_shell diff --git a/src/conf/module-setup.sh.inc b/src/conf/module-setup.sh.inc index 2b330b47..cf5f853c 100644 --- a/src/conf/module-setup.sh.inc +++ b/src/conf/module-setup.sh.inc @@ -22,13 +22,13 @@ if [[ -d /lfs3 ]] ; then source /apps/lmod/lmod/init/$__ms_shell fi module purge -elif [[ -d /scratch1 ]] ; then +elif [[ -d /scratch1 && ! -d /scratch ]] ; then # We are on NOAA Hera if ( ! eval module help > /dev/null 2>&1 ) ; then source /apps/lmod/lmod/init/$__ms_shell fi module purge -elif [[ -d /scratch3 ]] ; then +elif [[ -d /scratch3 && -d /scratch ]] ; then # We are on NOAA Theia if ( ! eval module help > /dev/null 2>&1 ) ; then source /apps/lmod/lmod/init/$__ms_shell diff --git a/src/module_EARTH_GRID_COMP.F90 b/src/module_EARTH_GRID_COMP.F90 index 3336eec3..18390b1d 100644 --- a/src/module_EARTH_GRID_COMP.F90 +++ b/src/module_EARTH_GRID_COMP.F90 @@ -587,6 +587,76 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) file=__FILE__)) & return ! bail out endif + !For MOM6 and WW3 variables to match: + if (.not.NUOPC_FieldDictionaryHasEntry( & + "eastward_partitioned_stokes_drift_1")) then + call NUOPC_FieldDictionaryAddEntry( & + standardName="eastward_partitioned_stokes_drift_1", & + canonicalUnits="m s-1", & + rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + endif + + if (.not.NUOPC_FieldDictionaryHasEntry( & + "northward_partitioned_stokes_drift_1")) then + call NUOPC_FieldDictionaryAddEntry( & + standardName="northward_partitioned_stokes_drift_1", & + canonicalUnits="m s-1", & + rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + endif + if (.not.NUOPC_FieldDictionaryHasEntry( & + "eastward_partitioned_stokes_drift_2")) then + call NUOPC_FieldDictionaryAddEntry( & + standardName="eastward_partitioned_stokes_drift_2", & + canonicalUnits="m s-1", & + rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + endif + if (.not.NUOPC_FieldDictionaryHasEntry( & + "northward_partitioned_stokes_drift_2")) then + call NUOPC_FieldDictionaryAddEntry( & + standardName="northward_partitioned_stokes_drift_2", & + canonicalUnits="m s-1", & + rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + endif + if (.not.NUOPC_FieldDictionaryHasEntry( & + "eastward_partitioned_stokes_drift_3")) then + call NUOPC_FieldDictionaryAddEntry( & + standardName="eastward_partitioned_stokes_drift_3", & + canonicalUnits="m s-1", & + rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + endif + + if (.not.NUOPC_FieldDictionaryHasEntry( & + "northward_partitioned_stokes_drift_3")) then + call NUOPC_FieldDictionaryAddEntry( & + standardName="northward_partitioned_stokes_drift_3", & + canonicalUnits="m s-1", & + rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + endif + ! end of MOM6 and WW3 variables to match if (.not.NUOPC_FieldDictionaryHasEntry( & "inst_temp_height_surface")) then call NUOPC_FieldDictionaryAddEntry( & diff --git a/src/module_MEDIATOR.F90 b/src/module_MEDIATOR.F90 index 6a3d44fd..23ac5f7a 100644 --- a/src/module_MEDIATOR.F90 +++ b/src/module_MEDIATOR.F90 @@ -5502,6 +5502,29 @@ subroutine MedPhase_prep_ocn(gcomp, rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out + call fieldBundle_FieldMerge(is_local%wrap%FBforOcn, 'mean_prec_rate', & + is_local%wrap%FBAtm_o , 'mean_prec_rate', atmwgt, & + rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=__FILE__)) return ! bail out + + !------------- + ! field_for_ocn = field_from_ice * ice_fraction + !------------- + + call fieldBundle_FieldMerge(is_local%wrap%FBforOcn, 'net_heat_flx_to_ocn', & + is_local%wrap%FBIce_o , 'net_heat_flx_to_ocn', icewgt, & + rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=__FILE__)) return ! bail out + + + call fieldBundle_FieldMerge(is_local%wrap%FBforOcn, 'mean_fresh_water_to_ocean_rate', & + is_local%wrap%FBIce_o , 'mean_fresh_water_to_ocean_rate', icewgt, & + rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=__FILE__)) return ! bail out + ! not used by mom, mom uses net, also mean_down_lw_flx not connected to ocn ! call fieldBundle_FieldMerge(is_local%wrap%FBforOcn, 'mean_down_lw_flx', & ! is_local%wrap%FBAtm_o , 'mean_down_lw_flx', atmwgt, & @@ -5518,6 +5541,13 @@ subroutine MedPhase_prep_ocn(gcomp, rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out + call fieldBundle_FieldMerge(is_local%wrap%FBforOcn , 'mean_sensi_heat_flx' , & + is_local%wrap%FBAccumAtmOcn, 'mean_sensi_heat_flx_atm_into_ocn', atmwgt1, & + is_local%wrap%FBAtm_o , 'mean_sensi_heat_flx' , wgtm01, & + rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=__FILE__)) return ! bail out + call fieldBundle_FieldMerge(is_local%wrap%FBforOcn , 'mean_net_lw_flx' , & is_local%wrap%FBAtm_o , 'mean_down_lw_flx' , atmwgt1, & is_local%wrap%FBAccumAtmOcn, 'mean_up_lw_flx_ocn', atmwgt1, & @@ -5535,23 +5565,18 @@ subroutine MedPhase_prep_ocn(gcomp, rc) ! line=__LINE__, file=__FILE__)) return ! bail out !------------- - ! field_for_ocn = field_from_atm * (1-ice_fraction) + field_from_ice * (ice_fraction) + ! field_for_ocn = field_from_ice * ice_fraction !------------- - call fieldBundle_FieldMerge(is_local%wrap%FBforOcn, 'mean_prec_rate' , & - is_local%wrap%FBAtm_o , 'mean_prec_rate' , atmwgt, & - is_local%wrap%FBIce_o , 'mean_fresh_water_to_ocean_rate', icewgt, & + call fieldBundle_FieldMerge(is_local%wrap%FBforOcn, 'mean_salt_rate', & + is_local%wrap%FBIce_o , 'mean_salt_rate', icewgt, & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out - call fieldBundle_FieldMerge(is_local%wrap%FBforOcn , 'mean_sensi_heat_flx' , & - is_local%wrap%FBAccumAtmOcn, 'mean_sensi_heat_flx_atm_into_ocn', atmwgt1, & - is_local%wrap%FBIce_o , 'net_heat_flx_to_ocn' , icewgt1, & - is_local%wrap%FBAtm_o , 'mean_sensi_heat_flx' , wgtm01, & - rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=__FILE__)) return ! bail out + !------------- + ! field_for_ocn = field_from_atm * (1-ice_fraction) + field_from_ice * (ice_fraction) + !------------- call fieldBundle_FieldMerge(is_local%wrap%FBforOcn , 'mean_zonal_moment_flx' , & is_local%wrap%FBAccumAtmOcn, 'stress_on_air_ocn_zonal', atmwgt1, & diff --git a/tests/apps.def b/tests/apps.def index cec5fd87..f67a8874 100644 --- a/tests/apps.def +++ b/tests/apps.def @@ -1,19 +1,12 @@ -# JET NOTE: We only list one jet generation (the oldest) because it -# takes too long to test all three generations. - # List of valid platforms and the human-readable names of each. -#PLATFORM xjet NAME xJet -#PLATFORM svjet NAME sJet and vJet -#PLATFORM tujet NAME uJet and tJet -#PLATFORM ujet.slurm NAME uJet SLURM Test PLATFORM theia NAME Theia -#PLATFORM theia.intel NAME Theia (Intel compiler) PLATFORM theia.slurm.intel NAME Theia (SLURM test) +PLATFORM hera NAME Hera +PLATFORM hera.intel NAME Hera (SLURM test) PLATFORM wcoss1 NAME WCOSS Phase 1 PLATFORM wcoss2 NAME WCOSS Phase 2 PLATFORM wcoss_cray NAME WCOSS Cray PLATFORM wcoss_dell_p3 NAME WCOSS Phase 3 -#PLATFORM gaea NAME GAEA C3 # List of known apps and the compsets to run for each app. APP NEMSfv3gfs COMPSETS -f @@ -29,39 +22,27 @@ APP FV3GFS-GSDCHEM URL gerrit:EMC_FV3GFS-GSDCHEM # Shell expressions that generate scrub space for a given $username # on each platform. -#ON xjet SCRUB /lfs3/projects/hfv3gfs/$username/scrub/xjet -#ON svjet SCRUB /lfs3/projects/hfv3gfs/$username/scrub/svjet -#ON tujet SCRUB /lfs3/projects/hfv3gfs/$username/scrub/tujet -#ON ujet.slurm SCRUB /lfs3/projects/hfv3gfs/$username/scrub/ujet.slurm -ON theia SCRUB /scratch4/NCEPDEV/nems/scrub/$username -#ON theia.intel SCRUB /scratch4/NCEPDEV/nems/scrub/$username +ON theia SCRUB /scratch4/NCEPDEV/nems/scrub/$username ON theia.slurm.intel SCRUB /scratch4/NCEPDEV/nems/scrub/$username -ON wcoss1 SCRUB /ptmpp1/$username -ON wcoss2 SCRUB /ptmpd3/$username -ON wcoss_cray SCRUB /gpfs/hps2/ptmp/$username -ON wcoss_dell_p3 SCRUB /gpfs/dell2/ptmp/$username -#ON gaea SCRUB $( ls -1d /lustre/f2/scratch/*/$username /lustre/f2/scratch/$username | head -1 ) +ON hera SCRUB /scratch1/NCEPDEV/nems/$username +ON hera.intel SCRUB /scratch1/NCEPDEV/nems/$username +ON wcoss1 SCRUB /ptmpp1/$username +ON wcoss2 SCRUB /ptmpd3/$username +ON wcoss_cray SCRUB /gpfs/hps2/ptmp/$username +ON wcoss_dell_p3 SCRUB /gpfs/dell2/ptmp/$username # List of apps to run on each platform. -#ON xjet APPS NEMSfv3gfs -#ON svjet APPS NEMSfv3gfs -#ON tujet APPS NEMSfv3gfs -#ON ujet.slurm APPS NEMSfv3gfs ON theia APPS FV3-MOM6-CICE5 -#ON theia.intel APPS NEMSfv3gfs FV3GFS-GSDCHEM ON theia.slurm.intel APPS NEMSfv3gfs WW3-FV3 +ON hera APPS FV3-MOM6-CICE5 +ON hera.intel APPS NEMSfv3gfs WW3-FV3 ON wcoss1 APPS NEMSfv3gfs ON wcoss2 APPS NEMSfv3gfs WW3-FV3 ON wcoss_cray APPS NEMSfv3gfs FV3GFS-GSDCHEM ON wcoss_dell_p3 APPS NEMSfv3gfs -#ON gaea APPS NEMSfv3gfs # Extra arguments to rt.sh for each platform -#ON xjet EXTRA_ARGS --temp-dir /lfs3/projects/hfv3gfs/$USER/scrub/xjet --project hfv3gfs --platform xjet -#ON svjet EXTRA_ARGS --temp-dir /lfs3/projects/hfv3gfs/$USER/scrub/svjet --project hfv3gfs --platform svjet -#ON ujet.slurm EXTRA_ARGS --temp-dir /lfs3/projects/hfv3gfs/$USER/scrub/ujet.slurm --project hfv3gfs --platform ujet.slurm -#ON tujet EXTRA_ARGS --temp-dir /lfs3/projects/hfv3gfs/$USER/scrub/tujet --project hfv3gfs --platform tujet ON theia EXTRA_ARGS --platform theia -#ON theia.intel EXTRA_ARGS --platform theia.intel ON theia.slurm.intel EXTRA_ARGS --platform theia.slurm.intel -#ON gaea EXTRA_ARGS --platform gaea.c3 +ON hera EXTRA_ARGS --platform hera +ON hera.intel EXTRA_ARGS --platform hera.intel diff --git a/tests/commit.def b/tests/commit.def index 9f663d9f..acd65c66 100644 --- a/tests/commit.def +++ b/tests/commit.def @@ -1,14 +1,12 @@ # Directory to receive the webpage with regression test results -#ON tujet WEBPAGE /lfs3/projects/hfv3gfs/emc.nemspara/web/nems-commit/NUOPC/ -#ON ujet.slurm WEBPAGE /lfs3/projects/hfv3gfs/emc.nemspara/web/nems-commit/NUOPC/ -ON theia WEBPAGE jetscp.rdhpcs.noaa.gov:/lfs3/projects/hfv3gfs/emc.nemspara/web/nems-commit/NUOPC/ -#ON theia.intel WEBPAGE jetscp.rdhpcs.noaa.gov:/lfs3/projects/hfv3gfs/emc.nemspara/web/nems-commit/NUOPC/ +ON theia WEBPAGE jetscp.rdhpcs.noaa.gov:/lfs3/projects/hfv3gfs/emc.nemspara/web/nems-commit/NUOPC/ ON theia.slurm.intel WEBPAGE jetscp.rdhpcs.noaa.gov:/lfs3/projects/hfv3gfs/emc.nemspara/web/nems-commit/NUOPC/ -ON wcoss1 WEBPAGE jetscp.rdhpcs.noaa.gov:/lfs3/projects/hfv3gfs/emc.nemspara/web/nems-commit/NUOPC/ -ON wcoss2 WEBPAGE jetscp.rdhpcs.noaa.gov:/lfs3/projects/hfv3gfs/emc.nemspara/web/nems-commit/NUOPC/ -ON wcoss_cray WEBPAGE jetscp.rdhpcs.noaa.gov:/lfs3/projects/hfv3gfs/emc.nemspara/web/nems-commit/NUOPC/ -ON wcoss_dell_p3 WEBPAGE jetscp.rdhpcs.noaa.gov:/lfs3/projects/hfv3gfs/emc.nemspara/web/nems-commit/NUOPC/ -#ON gaea WEBPAGE jetscp.rdhpcs.noaa.gov:/lfs3/projects/hfv3gfs/emc.nemspara/web/nems-commit/NUOPC/ +ON hera WEBPAGE jetscp.rdhpcs.noaa.gov:/lfs3/projects/hfv3gfs/emc.nemspara/web/nems-commit/NUOPC/ +ON hera.intel WEBPAGE jetscp.rdhpcs.noaa.gov:/lfs3/projects/hfv3gfs/emc.nemspara/web/nems-commit/NUOPC/ +ON wcoss1 WEBPAGE jetscp.rdhpcs.noaa.gov:/lfs3/projects/hfv3gfs/emc.nemspara/web/nems-commit/NUOPC/ +ON wcoss2 WEBPAGE jetscp.rdhpcs.noaa.gov:/lfs3/projects/hfv3gfs/emc.nemspara/web/nems-commit/NUOPC/ +ON wcoss_cray WEBPAGE jetscp.rdhpcs.noaa.gov:/lfs3/projects/hfv3gfs/emc.nemspara/web/nems-commit/NUOPC/ +ON wcoss_dell_p3 WEBPAGE jetscp.rdhpcs.noaa.gov:/lfs3/projects/hfv3gfs/emc.nemspara/web/nems-commit/NUOPC/ USER ACCOUNT IS Ratko.Vasic ROLE ACCOUNT IS emc.nemspara @@ -17,7 +15,7 @@ ROLE ACCOUNT IS emc.nemspara # to test the app's own NEMS NEMS BRANCH IS commit_tmp -# app branch - branch to use for committing logs to each +# app branch - branch to use for committing logs to each #APP BRANCH IS NUOPC-commit # If relevant, the starting branch that we copy to make the app diff --git a/tests/produtil/NCEPLIBS-pyprodutil b/tests/produtil/NCEPLIBS-pyprodutil index 231628a6..1c96952b 160000 --- a/tests/produtil/NCEPLIBS-pyprodutil +++ b/tests/produtil/NCEPLIBS-pyprodutil @@ -1 +1 @@ -Subproject commit 231628a66feeb00594dca973308c182add86e0a9 +Subproject commit 1c96952b092e8dc4da03b741ae1e8453fc9fe099 diff --git a/tests/rtgen b/tests/rtgen index e3024b03..afbbd932 100755 --- a/tests/rtgen +++ b/tests/rtgen @@ -551,6 +551,63 @@ def decide_project_theia(): logger.info('%10s : %6d %s'%(proj,projalloc[proj],chose)) return projchoose +# Hera project selection + +def decide_project_hera(): +# """!Chooses which project to use when submitting jobs on Hera. + +# Uses the saccount_params program to scan the available core-hours +# on Hera. Chooses the project with the most available core-hours. +# If no projects have resources, or if some error happens, then +# the "nems" project is used.""" +# logger=logging.getLogger('rtgen') +# try: +# account_params=produtil.run.runstr( +# batchexe('account_params'),logger=jlogger) +# except(EnvironmentError,ExitStatusException) as ee: +# logger.warning('Cannot run account_params: '+str(ee)) +# logger.warning('Will use project "nems" for cpu hours.') + return 'nems' +# default_project='nems' +# projects=list() +# projalloc=dict() +# for line in account_params.splitlines(): +# # Allocation: 6912 stmp 0.00 0.00 0.00 +# m=re.match('^\s*Allocation:\s+(\d+)\s+(\S+)\s+([0-9.]+)',line) +# if not m: +# # skip other lines +# logger.debug('Skip line: '+line.rstrip()) +# continue +# gid,name,alloc = m.groups() +# try: +# alloc=float(alloc) +# if name=='nems': alloc/=2 +# if not projects: +# default_project=name +# projects.append(name) +# projalloc[name]=alloc +# except (ValueError,TypeError) as vte: +# logger.warning('Cannot parse: '+line.rstrip()) +# continue +# if not projects: +# # Parse error or failure of account_params. +# logger.warning('Could not parse account_params output. Will use default: '+default_project) +# return default_project +# projects.sort(lambda a,b: cmp(projalloc[a],projalloc[b])) +# projchoose=projects[-1] + +# if projalloc[projchoose]<1.0: +# logger.warning('All projects passed core-hour limit; will use first project: '+default_project) +# return default_project + +# for proj in projects: +# if proj==projchoose: +# chose='<== chosen' +# else: +# chose='' +# logger.info('%10s : %6d %s'%(proj,projalloc[proj],chose)) +# return projchoose + def decide_tmp_theia(): """!Chooses a scratch space to use on Theia, based on how close each space is to its quota. @@ -626,6 +683,82 @@ def decide_tmp_theia(): ######################################################################## +def decide_tmp_hera(): + """!Chooses a scratch space to use on Hera, based on how close + each space is to its quota. + + Uses the pan_df program to check the quota of stmp1 through stmp4. + Returns the one that is farthest from quota based on percent + usage. If this process fails, such as pan_df giving a non-zero + return status or unparseable output, then a random stmp is chosen. + + @returns path to a temporary directory, which may not yet exist.""" +# logger=logging.getLogger('rtgen') +# stmps=[ '/scratch1/NCEPDEV/stmp2', +# '/scratch1/NCEPDEV/stmp4', +# '/scratch2/NCEPDEV/stmp1', +# '/scratch2/NCEPDEV/stmp3' ] + return '/scratch1/NCEPDEV/stmp2/'+username() +# try: +# args=['-B', '1G', '--' ] +# args.extend(stmps) +# pan_df=produtil.run.runstr(batchexe('pan_df')[args]) +# storage=dict() +# for m in re.finditer(r'''(?isx) +# (?: +# \s* (?P \S+ ) +# [ \t\r\n]+ (?P \d+ ) +# \s+ (?P \d+ ) +# \s+ (?P \d+ ) +# \s+ (?P [0-9.]+ ) % +# \s+ (?P \S+ ) +# | +# (?P [^\r\n]*[\r\n] | [^\r\n]*\Z ) ) +# ''',pan_df): +# # Skip lines that do not have usage information (such as +# # the header line). +# if m.group('bad') or not m.group('mntpnt'): +# logger.debug('pan_df: ignoring %s'%(repr(m.group(0).strip()),)) +# continue + +# mntpnt=m.group('mntpnt') +# percent=m.group('percent') +# percent=int(percent,10) + +# # Skip lines with invalid mount points: +# if not os.path.isdir(mntpnt): +# logger.warning( +# 'Ignoring invalid mount point from pan_df: %s'%( +# mntpnt,)) +# continue + +# # Store all valid lines: +# logger.debug('pan_df: %s at %d%% usage'%(mntpnt,percent)) +# storage[mntpnt]=percent + +# # Return the least used stmp if available. +# if not storage: +# logger.error( +# 'No valid lines seen in pan_df output.') +# else: +# by_usage=storage.keys() +# by_usage.sort( +# lambda a,b: cmp(storage[a],storage[b])) +# logger.info('%s: use this tmp (has lowest usage at %d%%)'%( +# by_usage[0],storage[by_usage[0]])) +# return os.path.join(by_usage[0],username()) + +# except(EnvironmentError,ExitStatusException,KeyError,ValueError) as e: +# # Log all likely errors before emergency fallback option: +# logger.error(str(e),exc_info=True) + +# use_me=random.choice(stmps) +# logger.warning("Auto-detection of least used stmp failed.") +# logger.warning("%s: randomly chosen stmp"%(use_me,)) +# return os.path.join(use_me,username()) + +######################################################################## + # Jet project detection def decide_tmp_jet(): @@ -941,6 +1074,10 @@ class RTGen(TestGen): out.write('module use /scratch4/NCEPDEV/nems/noscrub/emc.nemspara/soft/modulefiles/\n') out.write('module load rocoto/1.3.0rc2\n') out.write('module load hpss emc-utils/1.1.0 ; have_qoutql=YES\n') + elif here.name == 'hera': + out.write('module use /scratch1/NCEPDEV/nems/emc.nemspara/soft/modulefiles/\n') + out.write('module load rocoto/1.3.1\n') + out.write('module load hpss emc-utils/1.1.0 ; have_qoutql=YES\n') elif here.name == 'gaea': out.write('module use /lustre/f2/pdata/ncep_shared/emc.nemspara/soft/modulefiles\n') out.write('module load rocoto/1.3.0rc2 emc-utils/1.0.0 ; have_qoutql=YES\n') @@ -1347,6 +1484,8 @@ def rtgen(verbose,baseline_dir,dry_run,baseline,unique_id,temp, if project is None: if produtil.cluster.name() == 'theia': project=decide_project_theia() + elif produtil.cluster.name() == 'hera': + project=decide_project_hera() elif produtil.cluster.name() in ['gyre','tide','luna','surge','venus','mars']: project=decide_project_wcoss() elif produtil.cluster.name() == 'jet': @@ -1356,7 +1495,7 @@ def rtgen(verbose,baseline_dir,dry_run,baseline,unique_id,temp, elif produtil.cluster.name() == 'gaea': project=decide_project_gaea() else: - fail('Unknown system "'+produtil.cluster.name()+'". Only Theia, Jet, WCOSS, and GAEA are supported.') + fail('Unknown system "'+produtil.cluster.name()+'". Only Hera, Theia, Jet, WCOSS, and GAEA are supported.') jlogger.info('Auto-chosen project for job submission is %s'%( repr(project),)) else: @@ -1367,6 +1506,8 @@ def rtgen(verbose,baseline_dir,dry_run,baseline,unique_id,temp, if temp is None: if produtil.cluster.name() == 'theia': scratch_dir=decide_tmp_theia() + elif produtil.cluster.name() == 'hera': + scratch_dir=decide_tmp_hera() elif produtil.cluster.name() in ['gyre','tide','luna','surge','mars','venus']: scratch_dir=decide_tmp_wcoss(produtil.cluster.where().wcoss_phase) elif produtil.cluster.name() == 'gaea': @@ -1379,7 +1520,7 @@ def rtgen(verbose,baseline_dir,dry_run,baseline,unique_id,temp, assert('nceplibs' not in scratch_dir) assert('hwrfdata' not in scratch_dir) else: - fail('Unknown system "'+produtil.cluster.name()+'". Only Theia, Jet, WCOSS, and GAEA are supported.') + fail('Unknown system "'+produtil.cluster.name()+'". Only Hera, Theia, Jet, WCOSS, and GAEA are supported.') jlogger.info('Auto-chosen ptmp is %s'%(repr(scratch_dir),)) else: scratch_dir=temp