diff --git a/README.md b/README.md index 543f2f95..278b7eac 100644 --- a/README.md +++ b/README.md @@ -33,13 +33,32 @@ Example scripts can be found at `examples/` ### 1. generate JSON configuration files -The following code (`examples/nems_adcirc/hera_shinnecock_ike_spinup_tidal_atmesh_ww3data.py`) creates a configuration for -coupling `(ATMESH + WW3DATA) -> ADCIRC` -on Hera, over a small Shinnecock Inlet mesh: +The following command creates a configuration for coupling `(ATMESH + WW3DATA) -> ADCIRC` over a small Shinnecock Inlet mesh: -```python -#! /usr/bin/env python +```bash +initialize_adcirc \ + --platform HERA \ + --mesh-directory ../../../../models/meshes/shinnecock/v1.0 \ + --output-directory hera_shinnecock_ike_spinup_tidal_atmesh_ww3data \ + --modeled-start-time 20080823 \ + --modeled-duration 14:06:00:00 \ + --modeled-timestep 00:00:02 \ + --nems-interval 01:00:00 \ + --tidal-spinup-duration 12:06:00:00 \ + --adcirc-executable /scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/NEMS/exe/NEMS.x \ + --adcprep-executable /scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/ADCIRC/work/adcprep \ + --modulefile /scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/modulefiles/envmodules_intel.hera \ + --generate-script \ + --forcings tidal,atmesh,ww3data \ + --tidal-source TPXO \ + --tidal-path /scratch2/COASTAL/coastal/save/shared/models/forcings/tides/h_tpxo9.v1.nc \ + --atmesh-path /scratch2/COASTAL/coastal/save/shared/models/forcings/shinnecock/ike/wind_atm_fin_ch_time_vec.nc \ + --ww3data-path /scratch2/COASTAL/coastal/save/shared/models/forcings/shinnecock/ike/ww3.Constant.20151214_sxy_ike_date.nc +``` +Alternatively, the following Python code creates the same configuration: + +```python from datetime import datetime, timedelta from pathlib import Path @@ -49,42 +68,27 @@ from adcircpy.forcing.waves.ww3 import WaveWatch3DataForcing from adcircpy.forcing.winds.atmesh import AtmosphericMeshForcing from coupledmodeldriver import Platform -from coupledmodeldriver.generate import NEMSADCIRCGenerationScript, NEMSADCIRCRunConfiguration - -# paths to compiled `NEMS.x` and `adcprep` -NEMS_EXECUTABLE = '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/NEMS/exe/NEMS.x' -ADCPREP_EXECUTABLE = '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/ADCIRC/work/adcprep' - -MODULES_FILENAME = '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/modulefiles/envmodules_intel.hera' - -# directory containing input ADCIRC mesh nodes (`fort.14`) and (optionally) mesh values (`fort.13`) -MESH_DIRECTORY = Path('/scratch2/COASTAL/coastal/save/shared/models') / 'meshes' / 'shinnecock' / 'v1.0' - -# directory containing input atmospheric mesh forcings (`wind_atm_fin_ch_time_vec.nc`) and WaveWatch III forcings (`ww3.Constant.20151214_sxy_ike_date.nc`) -FORCINGS_DIRECTORY = Path('/scratch2/COASTAL/coastal/save/shared/models') / 'forcings' / 'shinnecock' / 'ike' +from coupledmodeldriver.generate import NEMSADCIRCRunConfiguration # directory to which to write configuration OUTPUT_DIRECTORY = Path(__file__).parent / Path(__file__).stem +# start and end times for model +MODELED_START_TIME = datetime(year=2008, month=8, day=23) +MODELED_DURATION = timedelta(days=14.5) +MODELED_TIMESTEP = timedelta(seconds=2) +TIDAL_SPINUP_DURATION = timedelta(days=12.5) +NEMS_INTERVAL = timedelta(hours=1) + +# directories containing forcings and mesh +MESH_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/meshes/shinnecock/v1.0' +FORCINGS_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/forcings/shinnecock/ike' HAMTIDE_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/hamtide' TPXO_FILENAME = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/h_tpxo9.v1.nc' -platform = Platform.HERA -adcirc_processors = 11 -modeled_start_time = datetime(2008, 8, 23) -modeled_duration = timedelta(days=14.5) -modeled_timestep = timedelta(seconds=2) -tidal_spinup_duration = timedelta(days=12.5) -nems_interval = timedelta(hours=1) -job_duration = timedelta(hours=6) - -# dictionary defining runs with ADCIRC value perturbations - in this case, a single run with no perturbation -runs = {f'test_case_1': None} - -# describe connections between coupled components -nems_connections = ['ATM -> OCN', 'WAV -> OCN'] -nems_mediations = None -nems_sequence = [ +# connections between coupled components +NEMS_CONNECTIONS = ['ATM -> OCN', 'WAV -> OCN'] +NEMS_SEQUENCE = [ 'ATM -> OCN', 'WAV -> OCN', 'ATM', @@ -92,76 +96,57 @@ nems_sequence = [ 'OCN', ] -slurm_email_address = 'example@email.gov' - -# initialize `adcircpy` forcing objects -tidal_forcing = Tides(tidal_source=TidalSource.TPXO, resource=TPXO_FILENAME) -tidal_forcing.use_all() -wind_forcing = AtmosphericMeshForcing( - filename=FORCINGS_DIRECTORY / 'wind_atm_fin_ch_time_vec.nc', - nws=17, - interval_seconds=3600, -) -wave_forcing = WaveWatch3DataForcing( - filename=FORCINGS_DIRECTORY / 'ww3.Constant.20151214_sxy_ike_date.nc', - nrs=5, - interval_seconds=3600, -) -forcings = [tidal_forcing, wind_forcing, wave_forcing] - -configuration = NEMSADCIRCRunConfiguration( - fort13=MESH_DIRECTORY / 'fort.13', - fort14=MESH_DIRECTORY / 'fort.14', - modeled_start_time=modeled_start_time, - modeled_end_time=modeled_start_time + modeled_duration, - modeled_timestep=modeled_timestep, - nems_interval=nems_interval, - nems_connections=nems_connections, - nems_mediations=nems_mediations, - nems_sequence=nems_sequence, - tidal_spinup_duration=tidal_spinup_duration, - platform=platform, - runs=runs, - forcings=forcings, - adcirc_processors=adcirc_processors, - slurm_partition=None, - slurm_job_duration=job_duration, - slurm_email_address=slurm_email_address, - nems_executable=NEMS_EXECUTABLE, - adcprep_executable=ADCPREP_EXECUTABLE, - source_filename=MODULES_FILENAME, -) - -configuration.write_directory(OUTPUT_DIRECTORY, overwrite=False) - -generation_script = NEMSADCIRCGenerationScript() -generation_script.write(OUTPUT_DIRECTORY / 'generate_nems_adcirc.py', overwrite=True) -``` - -Alternatively, you may use the command-line interface: - -```bash -initialize_adcirc \ - --platform HERA \ - --mesh-directory ../../../../models/meshes/hsofs/250m/v1.0 \ - --output-directory hera_shinnecock_ike_spinup_tidal_atmesh_ww3data \ - --modeled-start-time 20080823 \ - --modeled-duration 14:06:00:00 \ - --modeled-timestep 00:00:02 \ - --nems-interval 01:00:00 \ - --tidal-spinup-duration 12:06:00:00 \ - --adcirc-executable /scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/NEMS/exe/NEMS.x \ - --adcprep-executable /scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/ADCIRC/work/adcprep \ - --modulefile /scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/modulefiles/envmodules_intel.hera \ - --generate-script \ - --forcings tidal,atmesh,ww3data \ - --tidal-source TPXO \ - --tidal-path /scratch2/COASTAL/coastal/save/shared/models/forcings/tides/h_tpxo9.v1.nc \ - --atmesh-path /scratch2/COASTAL/coastal/save/shared/models/forcings/shinnecock/ike/wind_atm_fin_ch_time_vec.nc \ - --ww3data-path /scratch2/COASTAL/coastal/save/shared/models/forcings/shinnecock/ike/ww3.Constant.20151214_sxy_ike_date.nc +# platform-specific parameters +PLATFORM = Platform.HERA +ADCIRC_PROCESSORS = 11 +NEMS_EXECUTABLE = '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/NEMS/exe/NEMS.x' +ADCPREP_EXECUTABLE = '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/ADCIRC/work/adcprep' +MODULEFILE = '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/modulefiles/envmodules_intel.hera' +SLURM_JOB_DURATION = timedelta(hours=6) + +if __name__ == '__main__': + # initialize `adcircpy` forcing objects + FORCINGS_DIRECTORY = Path(FORCINGS_DIRECTORY) + tidal_forcing = Tides(tidal_source=TidalSource.TPXO, resource=TPXO_FILENAME) + tidal_forcing.use_all() + wind_forcing = AtmosphericMeshForcing( + filename=FORCINGS_DIRECTORY / 'wind_atm_fin_ch_time_vec.nc', + nws=17, + interval_seconds=3600, + ) + wave_forcing = WaveWatch3DataForcing( + filename=FORCINGS_DIRECTORY / 'ww3.Constant.20151214_sxy_ike_date.nc', + nrs=5, + interval_seconds=3600, + ) + forcings = [tidal_forcing, wind_forcing, wave_forcing] + + configuration = NEMSADCIRCRunConfiguration( + mesh_directory=MESH_DIRECTORY, + modeled_start_time=MODELED_START_TIME, + modeled_end_time=MODELED_START_TIME + MODELED_DURATION, + modeled_timestep=MODELED_TIMESTEP, + nems_interval=NEMS_INTERVAL, + nems_connections=NEMS_CONNECTIONS, + nems_mediations=None, + nems_sequence=NEMS_SEQUENCE, + tidal_spinup_duration=TIDAL_SPINUP_DURATION, + platform=PLATFORM, + runs=None, + forcings=forcings, + adcirc_processors=ADCIRC_PROCESSORS, + slurm_partition=None, + slurm_job_duration=SLURM_JOB_DURATION, + slurm_email_address=None, + nems_executable=NEMS_EXECUTABLE, + adcprep_executable=ADCPREP_EXECUTABLE, + source_filename=MODULEFILE, + ) + + configuration.write_directory(OUTPUT_DIRECTORY, overwrite=False) ``` -Either method will create the directory `hera_shinnecock_ike_spinup_tidal_atmesh_ww3data/` and generate the following JSON +Either method will create the directory `hera_shinnecock_ike_spinup_tidal_atmesh_ww3data/` with the following JSON configuration files: ``` @@ -173,7 +158,6 @@ configuration files: ┣ ✎ configure_tidal_forcing.json ┣ ✎ configure_atmesh.json ┣ ✎ configure_ww3data.json -┗ ▶ generate_nems_adcirc.py ``` These files contain relevant configuration values for an ADCIRC run. You will likely wish to change these values to alter the @@ -198,7 +182,6 @@ The resulting configuration will have the following structure: ┣ ✎ configure_tidal_forcing.json ┣ ✎ configure_atmesh.json ┣ ✎ configure_ww3data.json -┣ ▶ generate_nems_adcirc.py ┣ 📂 coldstart/ ┃ ┣ 📜 fort.13 ┃ ┣ 🔗 fort.14 -> ../fort.14 @@ -210,7 +193,7 @@ The resulting configuration will have the following structure: ┃ ┣ 🔗 adcirc.job -> ../job_adcirc_hera.job.coldstart ┃ ┗ 🔗 setup.sh -> ../setup.sh.coldstart ┣ 📂 runs/ -┃ ┗ 📂 test_case_1/ +┃ ┗ 📂 run_1/ ┃ ┣ 📜 fort.13 ┃ ┣ 🔗 fort.14 -> ../../fort.14 ┃ ┣ 📜 fort.15 @@ -254,3 +237,78 @@ The queue will have the following jobs added: 16368046 ADCIRC_MESH_PARTITION 1 1 afterany:16368045(unfulfilled) 2021-02-18T19:29:17 N/A N/A 16368047 ADCIRC_HOTSTART 13 1 afterany:16368046(unfulfilled) 2021-02-18T19:29:17 N/A N/A ``` + +## Command-line interface + +`coupledmodeldriver` exposes the following CLI commands: + +- `initialize_adcirc` +- `generate_adcirc` + +### Initialize ADCIRC configuration (`initialize_adcirc`) + +`initialize_adcirc` creates JSON configuration files according to the given parameters. + +``` +usage: initialize_adcirc [-h] --platform PLATFORM --mesh-directory MESH_DIRECTORY --modeled-start-time MODELED_START_TIME + --modeled-duration MODELED_DURATION --modeled-timestep MODELED_TIMESTEP [--nems-interval NEMS_INTERVAL] + [--modulefile MODULEFILE] [--tidal-spinup-duration TIDAL_SPINUP_DURATION] [--forcings FORCINGS] + [--adcirc-executable ADCIRC_EXECUTABLE] [--adcprep-executable ADCPREP_EXECUTABLE] + [--adcirc-processors ADCIRC_PROCESSORS] [--job-duration JOB_DURATION] [--output-directory OUTPUT_DIRECTORY] + [--generate-script] [--skip-existing] + +optional arguments: + -h, --help show this help message and exit + --platform PLATFORM HPC platform for which to configure + --mesh-directory MESH_DIRECTORY + path to input mesh (`fort.13`, `fort.14`) + --modeled-start-time MODELED_START_TIME + start time within the modeled system + --modeled-duration MODELED_DURATION + end time within the modeled system + --modeled-timestep MODELED_TIMESTEP + time interval within the modeled system + --nems-interval NEMS_INTERVAL + main loop interval of NEMS run + --modulefile MODULEFILE + path to module file to `source` + --tidal-spinup-duration TIDAL_SPINUP_DURATION + spinup time for ADCIRC tidal coldstart + --forcings FORCINGS comma-separated list of forcings to configure, from ['tidal', 'atmesh', 'besttrack', 'owi', 'ww3data'] + --adcirc-executable ADCIRC_EXECUTABLE + filename of compiled `adcirc` or `NEMS.x` + --adcprep-executable ADCPREP_EXECUTABLE + filename of compiled `adcprep` + --adcirc-processors ADCIRC_PROCESSORS + numbers of processors to assign for ADCIRC + --job-duration JOB_DURATION + wall clock time for job + --output-directory OUTPUT_DIRECTORY + directory to which to write configuration files + --generate-script write a Python script to load configuration + --skip-existing skip existing files +``` + +ADCIRC run options that are not exposed by this command, such as `runs` or `gwce_solution_scheme`, can be specified by directly +modifying the JSON files. + +### Generate ADCIRC configuration (`generate_adcirc`) + +`generate_adcirc` reads a set of JSON configuration files and generates an ADCIRC run configuration from the options read from +these files. + +``` +usage: generate_adcirc [-h] [--configuration-directory CONFIGURATION_DIRECTORY] [--output-directory OUTPUT_DIRECTORY] + [--skip-existing] [--verbose] + +optional arguments: + -h, --help show this help message and exit + --configuration-directory CONFIGURATION_DIRECTORY + path containing JSON configuration files + --output-directory OUTPUT_DIRECTORY + path to store generated configuration files + --skip-existing skip existing files + --verbose show more verbose log messages +``` + +After this configuration is generated, the model can be started by executing the `run_.sh` script. diff --git a/client/initialize_adcirc.py b/client/initialize_adcirc.py index 3a745483..ac00777a 100644 --- a/client/initialize_adcirc.py +++ b/client/initialize_adcirc.py @@ -135,7 +135,9 @@ def main(): value = None if argument.startswith('-'): parsed_argument = argument.strip('-').strip() - if len(extra_arguments) > index + 1 and not extra_arguments[index + 1].startswith('-'): + if len(extra_arguments) > index + 1 and not extra_arguments[index + 1].startswith( + '-' + ): value = extra_arguments[index + 1].strip() forcing = parsed_argument.split('-')[0] if forcing not in forcings: @@ -219,16 +221,9 @@ def main(): f'unrecognized forcing "{provided_name}"; ' f'must be from {FORCING_NAMES}' ) - fort13_filename = mesh_directory / 'fort.13' - fort14_filename = mesh_directory / 'fort.14' - - if not fort13_filename.exists(): - fort13_filename = None - if nems_interval is not None: configuration = NEMSADCIRCRunConfiguration( - fort13=fort13_filename, - fort14=fort14_filename, + mesh_directory=mesh_directory, modeled_start_time=modeled_start_time, modeled_end_time=modeled_start_time + modeled_duration, modeled_timestep=modeled_timestep, @@ -251,8 +246,7 @@ def main(): generation_script = NEMSADCIRCGenerationScript() else: configuration = ADCIRCRunConfiguration( - fort13=fort13_filename, - fort14=fort14_filename, + mesh_directory=mesh_directory, modeled_start_time=modeled_start_time, modeled_end_time=modeled_start_time + modeled_duration, modeled_timestep=modeled_timestep, @@ -270,11 +264,13 @@ def main(): ) generation_script = ADCIRCGenerationScript() - configuration.write_directory(directory=output_directory, overwrite=overwrite) + configuration.write_directory( + directory=output_directory, overwrite=overwrite, + ) if generate_script: generation_script.write( - filename=output_directory / 'generate_adcirc.py', overwrite=overwrite + filename=output_directory / 'generate_adcirc.py', overwrite=overwrite, ) diff --git a/coupledmodeldriver/configure/models.py b/coupledmodeldriver/configure/models.py index fa552254..bcd538b9 100644 --- a/coupledmodeldriver/configure/models.py +++ b/coupledmodeldriver/configure/models.py @@ -92,7 +92,6 @@ def __init__( :param modeled_timestep: time interval between model steps :param fort_13_path: file path to `fort.13` :param fort_14_path: file path to `fort.14` - :param fort_14_path: file path to `fort.14` :param tidal_spinup_duration: tidal spinup duration for ADCIRC coldstart :param tidal_spinup_timestep: tidal spinup modeled time interval for ADCIRC coldstart :param forcings: list of Forcing objects to apply to the mesh diff --git a/coupledmodeldriver/generate/adcirc/configure.py b/coupledmodeldriver/generate/adcirc/configure.py index dc4c01d6..d27c5925 100644 --- a/coupledmodeldriver/generate/adcirc/configure.py +++ b/coupledmodeldriver/generate/adcirc/configure.py @@ -33,8 +33,7 @@ class ADCIRCRunConfiguration(RunConfiguration): def __init__( self, - fort13: PathLike, - fort14: PathLike, + mesh_directory: PathLike, modeled_start_time: datetime, modeled_end_time: datetime, modeled_timestep: timedelta, @@ -53,8 +52,7 @@ def __init__( """ Generate required configuration files for an ADCIRC run. - :param fort13: path to input mesh values (`fort.13`) - :param fort14: path to input mesh nodes (`fort.14`) + :param mesh_directory: path to input mesh directory (containing `fort.13`, `fort.14`) :param modeled_start_time: start time within the modeled system :param modeled_end_time: end time within the modeled system :param modeled_timestep: time interval within the modeled system @@ -70,6 +68,9 @@ def __init__( :param source_filename: path to module file to `source` """ + if not isinstance(mesh_directory, Path): + mesh_directory = Path(mesh_directory) + if platform is None: platform = Platform.LOCAL @@ -99,8 +100,8 @@ def __init__( modeled_start_time=modeled_start_time, modeled_end_time=modeled_end_time, modeled_timestep=modeled_timestep, - fort_13_path=fort13, - fort_14_path=fort14, + fort_13_path=mesh_directory / 'fort.13', + fort_14_path=mesh_directory / 'fort.14', tidal_spinup_duration=tidal_spinup_duration, source_filename=source_filename, slurm_configuration=slurm, @@ -186,8 +187,7 @@ class NEMSADCIRCRunConfiguration(ADCIRCRunConfiguration): def __init__( self, - fort13: PathLike, - fort14: PathLike, + mesh_directory: PathLike, modeled_start_time: datetime, modeled_end_time: datetime, modeled_timestep: timedelta, @@ -210,8 +210,7 @@ def __init__( self.__nems = None super().__init__( - fort13=fort13, - fort14=fort14, + mesh_directory=mesh_directory, modeled_start_time=modeled_start_time, modeled_end_time=modeled_end_time, modeled_timestep=modeled_timestep, diff --git a/coupledmodeldriver/utilities.py b/coupledmodeldriver/utilities.py index e31503db..3ce7b7aa 100644 --- a/coupledmodeldriver/utilities.py +++ b/coupledmodeldriver/utilities.py @@ -50,7 +50,6 @@ def get_logger( logger.setLevel(logging.DEBUG) if console_level != logging.NOTSET: if console_level <= logging.INFO: - class LoggingOutputFilter(logging.Filter): def filter(self, rec): return rec.levelno in (logging.DEBUG, logging.INFO) diff --git a/examples/adcirc_only/hera_hsofs120m_sandy_spinup.py b/examples/adcirc_only/hera_hsofs120m_sandy_spinup.py index 4783fc75..36dd8ea2 100644 --- a/examples/adcirc_only/hera_hsofs120m_sandy_spinup.py +++ b/examples/adcirc_only/hera_hsofs120m_sandy_spinup.py @@ -1,5 +1,3 @@ -#! /usr/bin/env python - from datetime import datetime, timedelta from pathlib import Path @@ -7,75 +5,47 @@ from coupledmodeldriver.generate import ADCIRCGenerationScript, \ ADCIRCRunConfiguration -# paths to compiled `NEMS.x` and `adcprep` +# directory to which to write configuration +OUTPUT_DIRECTORY = Path(__file__).parent / Path(__file__).stem + +# start and end times for model +MODELED_START_TIME = datetime(year=2008, month=8, day=23) +MODELED_DURATION = timedelta(days=14.5) +MODELED_TIMESTEP = timedelta(seconds=2) +TIDAL_SPINUP_DURATION = timedelta(days=12.5) + +# directories containing forcings and mesh +MESH_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/meshes/hsofs/120m/v3.0_20210401' + +# platform-specific parameters +PLATFORM = Platform.HERA +ADCIRC_PROCESSORS = 15 * PLATFORM.value['processors_per_node'] ADCIRC_EXECUTABLE = ( '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/ADCIRC/work/padcirc' ) ADCPREP_EXECUTABLE = ( '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/ADCIRC/work/adcprep' ) - -MODULES_FILENAME = '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/modulefiles/envmodules_intel.hera' - -# directory containing input ADCIRC mesh nodes (`fort.14`) and (optionally) mesh values (`fort.13`) -MESH_DIRECTORY = ( - Path('/scratch2/COASTAL/coastal/save/shared/models') - / 'meshes' - / 'hsofs' - / '120m' - / 'v2.2_20210915' -) - -# directory containing input atmospheric mesh forcings (`wind_atm_fin_ch_time_vec.nc`) and WaveWatch III forcings (`ww3.Constant.20151214_sxy_ike_date.nc`) -FORCINGS_DIRECTORY = ( - Path('/scratch2/COASTAL/coastal/save/shared/models') - / 'forcings' - / 'hsofs' - / '120m' - / 'sandy' -) - -# directory to which to write configuration -OUTPUT_DIRECTORY = Path(__file__).parent / Path(__file__).stem - -HAMTIDE_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/hamtide' -TPXO_FILENAME = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/h_tpxo9.v1.nc' +MODULEFILE = '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/modulefiles/envmodules_intel.hera' +SLURM_JOB_DURATION = timedelta(hours=6) if __name__ == '__main__': - platform = Platform.HERA - adcirc_processors = 11 - modeled_start_time = datetime(2008, 8, 23) - modeled_duration = timedelta(days=14.5) - modeled_timestep = timedelta(seconds=2) - tidal_spinup_duration = timedelta(days=12.5) - nems_interval = timedelta(hours=1) - job_duration = timedelta(hours=6) - - # dictionary defining runs with ADCIRC value perturbations - in this case, a single run with no perturbation - runs = {f'test_case_1': None} - - slurm_email_address = 'example@email.gov' - - # initialize `adcircpy` forcing objects - forcings = [] - configuration = ADCIRCRunConfiguration( - fort13=MESH_DIRECTORY / 'fort.13', - fort14=MESH_DIRECTORY / 'fort.14', - modeled_start_time=modeled_start_time, - modeled_end_time=modeled_start_time + modeled_duration, - modeled_timestep=modeled_timestep, - tidal_spinup_duration=tidal_spinup_duration, - platform=platform, - runs=runs, - forcings=forcings, - adcirc_processors=adcirc_processors, + mesh_directory=MESH_DIRECTORY, + modeled_start_time=MODELED_START_TIME, + modeled_end_time=MODELED_START_TIME + MODELED_DURATION, + modeled_timestep=MODELED_TIMESTEP, + tidal_spinup_duration=TIDAL_SPINUP_DURATION, + platform=PLATFORM, + runs=None, + forcings=None, + adcirc_processors=ADCIRC_PROCESSORS, slurm_partition=None, - slurm_job_duration=job_duration, - slurm_email_address=slurm_email_address, + slurm_job_duration=SLURM_JOB_DURATION, + slurm_email_address=None, adcirc_executable=ADCIRC_EXECUTABLE, adcprep_executable=ADCPREP_EXECUTABLE, - source_filename=MODULES_FILENAME, + source_filename=MODULEFILE, ) configuration.write_directory(OUTPUT_DIRECTORY, overwrite=False) diff --git a/examples/adcirc_only/hera_hsofs120m_sandy_spinup_tidal.py b/examples/adcirc_only/hera_hsofs120m_sandy_spinup_tidal.py index 260b9b55..e77e5cc7 100644 --- a/examples/adcirc_only/hera_hsofs120m_sandy_spinup_tidal.py +++ b/examples/adcirc_only/hera_hsofs120m_sandy_spinup_tidal.py @@ -1,5 +1,3 @@ -#! /usr/bin/env python - from datetime import datetime, timedelta from pathlib import Path @@ -10,77 +8,55 @@ from coupledmodeldriver.generate import ADCIRCGenerationScript, \ ADCIRCRunConfiguration -# paths to compiled `NEMS.x` and `adcprep` +# directory to which to write configuration +OUTPUT_DIRECTORY = Path(__file__).parent / Path(__file__).stem + +# start and end times for model +MODELED_START_TIME = datetime(year=2008, month=8, day=23) +MODELED_DURATION = timedelta(days=14.5) +MODELED_TIMESTEP = timedelta(seconds=2) +TIDAL_SPINUP_DURATION = timedelta(days=12.5) + +# directories containing forcings and mesh +MESH_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/meshes/hsofs/120m/v3.0_20210401' +FORCINGS_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/forcings/hsofs/120m/sandy' +HAMTIDE_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/hamtide' +TPXO_FILENAME = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/h_tpxo9.v1.nc' + +# platform-specific parameters +PLATFORM = Platform.HERA +ADCIRC_PROCESSORS = 15 * PLATFORM.value['processors_per_node'] ADCIRC_EXECUTABLE = ( '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/ADCIRC/work/padcirc' ) ADCPREP_EXECUTABLE = ( '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/ADCIRC/work/adcprep' ) - -MODULES_FILENAME = '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/modulefiles/envmodules_intel.hera' - -# directory containing input ADCIRC mesh nodes (`fort.14`) and (optionally) mesh values (`fort.13`) -MESH_DIRECTORY = ( - Path('/scratch2/COASTAL/coastal/save/shared/models') - / 'meshes' - / 'hsofs' - / '120m' - / 'v2.2_20210915' -) - -# directory containing input atmospheric mesh forcings (`wind_atm_fin_ch_time_vec.nc`) and WaveWatch III forcings (`ww3.Constant.20151214_sxy_ike_date.nc`) -FORCINGS_DIRECTORY = ( - Path('/scratch2/COASTAL/coastal/save/shared/models') - / 'forcings' - / 'hsofs' - / '120m' - / 'sandy' -) - -# directory to which to write configuration -OUTPUT_DIRECTORY = Path(__file__).parent / Path(__file__).stem - -HAMTIDE_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/hamtide' -TPXO_FILENAME = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/h_tpxo9.v1.nc' +MODULEFILE = '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/modulefiles/envmodules_intel.hera' +SLURM_JOB_DURATION = timedelta(hours=6) if __name__ == '__main__': - platform = Platform.HERA - adcirc_processors = 11 - modeled_start_time = datetime(2008, 8, 23) - modeled_duration = timedelta(days=14.5) - modeled_timestep = timedelta(seconds=2) - tidal_spinup_duration = timedelta(days=12.5) - nems_interval = timedelta(hours=1) - job_duration = timedelta(hours=6) - - # dictionary defining runs with ADCIRC value perturbations - in this case, a single run with no perturbation - runs = {f'test_case_1': None} - - slurm_email_address = 'example@email.gov' - # initialize `adcircpy` forcing objects tidal_forcing = Tides(tidal_source=TidalSource.TPXO, resource=TPXO_FILENAME) tidal_forcing.use_all() forcings = [tidal_forcing] configuration = ADCIRCRunConfiguration( - fort13=MESH_DIRECTORY / 'fort.13', - fort14=MESH_DIRECTORY / 'fort.14', - modeled_start_time=modeled_start_time, - modeled_end_time=modeled_start_time + modeled_duration, - modeled_timestep=modeled_timestep, - tidal_spinup_duration=tidal_spinup_duration, - platform=platform, - runs=runs, + mesh_directory=MESH_DIRECTORY, + modeled_start_time=MODELED_START_TIME, + modeled_end_time=MODELED_START_TIME + MODELED_DURATION, + modeled_timestep=MODELED_TIMESTEP, + tidal_spinup_duration=TIDAL_SPINUP_DURATION, + platform=PLATFORM, + runs=None, forcings=forcings, - adcirc_processors=adcirc_processors, + adcirc_processors=ADCIRC_PROCESSORS, slurm_partition=None, - slurm_job_duration=job_duration, - slurm_email_address=slurm_email_address, + slurm_job_duration=SLURM_JOB_DURATION, + slurm_email_address=None, adcirc_executable=ADCIRC_EXECUTABLE, adcprep_executable=ADCPREP_EXECUTABLE, - source_filename=MODULES_FILENAME, + source_filename=MODULEFILE, ) configuration.write_directory(OUTPUT_DIRECTORY, overwrite=False) diff --git a/examples/adcirc_only/hera_hsofs120m_sandy_spinup_tidal_atmesh_ww3data.py b/examples/adcirc_only/hera_hsofs120m_sandy_spinup_tidal_atmesh_ww3data.py index cf58f211..eb035661 100644 --- a/examples/adcirc_only/hera_hsofs120m_sandy_spinup_tidal_atmesh_ww3data.py +++ b/examples/adcirc_only/hera_hsofs120m_sandy_spinup_tidal_atmesh_ww3data.py @@ -1,5 +1,3 @@ -#! /usr/bin/env python - from datetime import datetime, timedelta from pathlib import Path @@ -12,55 +10,34 @@ from coupledmodeldriver.generate import ADCIRCGenerationScript, \ ADCIRCRunConfiguration -# paths to compiled `NEMS.x` and `adcprep` +# directory to which to write configuration +OUTPUT_DIRECTORY = Path(__file__).parent / Path(__file__).stem + +# start and end times for model +MODELED_START_TIME = datetime(year=2008, month=8, day=23) +MODELED_DURATION = timedelta(days=14.5) +MODELED_TIMESTEP = timedelta(seconds=2) +TIDAL_SPINUP_DURATION = timedelta(days=12.5) + +# directories containing forcings and mesh +MESH_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/meshes/hsofs/120m/v3.0_20210401' +FORCINGS_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/forcings/hsofs/120m/sandy' +HAMTIDE_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/hamtide' +TPXO_FILENAME = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/h_tpxo9.v1.nc' + +# platform-specific parameters +PLATFORM = Platform.HERA +ADCIRC_PROCESSORS = 15 * PLATFORM.value['processors_per_node'] ADCIRC_EXECUTABLE = ( '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/ADCIRC/work/padcirc' ) ADCPREP_EXECUTABLE = ( '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/ADCIRC/work/adcprep' ) - -MODULES_FILENAME = '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/modulefiles/envmodules_intel.hera' - -# directory containing input ADCIRC mesh nodes (`fort.14`) and (optionally) mesh values (`fort.13`) -MESH_DIRECTORY = ( - Path('/scratch2/COASTAL/coastal/save/shared/models') - / 'meshes' - / 'hsofs' - / '120m' - / 'v2.2_20210915' -) - -# directory containing input atmospheric mesh forcings (`wind_atm_fin_ch_time_vec.nc`) and WaveWatch III forcings (`ww3.Constant.20151214_sxy_ike_date.nc`) -FORCINGS_DIRECTORY = ( - Path('/scratch2/COASTAL/coastal/save/shared/models') - / 'forcings' - / 'hsofs' - / '120m' - / 'sandy' -) - -# directory to which to write configuration -OUTPUT_DIRECTORY = Path(__file__).parent / Path(__file__).stem - -HAMTIDE_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/hamtide' -TPXO_FILENAME = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/h_tpxo9.v1.nc' +MODULEFILE = '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/modulefiles/envmodules_intel.hera' +SLURM_JOB_DURATION = timedelta(hours=6) if __name__ == '__main__': - platform = Platform.HERA - adcirc_processors = 11 - modeled_start_time = datetime(2008, 8, 23) - modeled_duration = timedelta(days=14.5) - modeled_timestep = timedelta(seconds=2) - tidal_spinup_duration = timedelta(days=12.5) - nems_interval = timedelta(hours=1) - job_duration = timedelta(hours=6) - - # dictionary defining runs with ADCIRC value perturbations - in this case, a single run with no perturbation - runs = {f'test_case_1': None} - - slurm_email_address = 'example@email.gov' - # initialize `adcircpy` forcing objects tidal_forcing = Tides(tidal_source=TidalSource.TPXO, resource=TPXO_FILENAME) tidal_forcing.use_all() @@ -77,22 +54,21 @@ forcings = [tidal_forcing, wind_forcing, wave_forcing] configuration = ADCIRCRunConfiguration( - fort13=MESH_DIRECTORY / 'fort.13', - fort14=MESH_DIRECTORY / 'fort.14', - modeled_start_time=modeled_start_time, - modeled_end_time=modeled_start_time + modeled_duration, - modeled_timestep=modeled_timestep, - tidal_spinup_duration=tidal_spinup_duration, - platform=platform, - runs=runs, + mesh_directory=MESH_DIRECTORY, + modeled_start_time=MODELED_START_TIME, + modeled_end_time=MODELED_START_TIME + MODELED_DURATION, + modeled_timestep=MODELED_TIMESTEP, + tidal_spinup_duration=TIDAL_SPINUP_DURATION, + platform=PLATFORM, + runs=None, forcings=forcings, - adcirc_processors=adcirc_processors, + adcirc_processors=ADCIRC_PROCESSORS, slurm_partition=None, - slurm_job_duration=job_duration, - slurm_email_address=slurm_email_address, + slurm_job_duration=SLURM_JOB_DURATION, + slurm_email_address=None, adcirc_executable=ADCIRC_EXECUTABLE, adcprep_executable=ADCPREP_EXECUTABLE, - source_filename=MODULES_FILENAME, + source_filename=MODULEFILE, ) configuration.write_directory(OUTPUT_DIRECTORY, overwrite=False) diff --git a/examples/adcirc_only/hera_hsofs250m_sandy_spinup.py b/examples/adcirc_only/hera_hsofs250m_sandy_spinup.py deleted file mode 100644 index 90f1e5b4..00000000 --- a/examples/adcirc_only/hera_hsofs250m_sandy_spinup.py +++ /dev/null @@ -1,80 +0,0 @@ -#! /usr/bin/env python - -from datetime import datetime, timedelta -from pathlib import Path - -from coupledmodeldriver import Platform -from coupledmodeldriver.generate import ADCIRCGenerationScript, \ - ADCIRCRunConfiguration - -# paths to compiled `NEMS.x` and `adcprep` -ADCIRC_EXECUTABLE = ( - '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/ADCIRC/work/padcirc' -) -ADCPREP_EXECUTABLE = ( - '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/ADCIRC/work/adcprep' -) - -MODULES_FILENAME = '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/modulefiles/envmodules_intel.hera' - -# directory containing input ADCIRC mesh nodes (`fort.14`) and (optionally) mesh values (`fort.13`) -MESH_DIRECTORY = ( - Path('/scratch2/COASTAL/coastal/save/shared/models') / 'meshes' / 'hsofs' / '250m' / 'v1.0' -) - -# directory containing input atmospheric mesh forcings (`wind_atm_fin_ch_time_vec.nc`) and WaveWatch III forcings (`ww3.Constant.20151214_sxy_ike_date.nc`) -FORCINGS_DIRECTORY = ( - Path('/scratch2/COASTAL/coastal/save/shared/models') - / 'forcings' - / 'hsofs' - / '250m' - / 'sandy' -) - -# directory to which to write configuration -OUTPUT_DIRECTORY = Path(__file__).parent / Path(__file__).stem - -HAMTIDE_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/hamtide' -TPXO_FILENAME = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/h_tpxo9.v1.nc' - -if __name__ == '__main__': - platform = Platform.HERA - adcirc_processors = 11 - modeled_start_time = datetime(2008, 8, 23) - modeled_duration = timedelta(days=14.5) - modeled_timestep = timedelta(seconds=2) - tidal_spinup_duration = timedelta(days=12.5) - nems_interval = timedelta(hours=1) - job_duration = timedelta(hours=6) - - # dictionary defining runs with ADCIRC value perturbations - in this case, a single run with no perturbation - runs = {f'test_case_1': None} - - slurm_email_address = 'example@email.gov' - - # initialize `adcircpy` forcing objects - forcings = [] - - configuration = ADCIRCRunConfiguration( - fort13=MESH_DIRECTORY / 'fort.13', - fort14=MESH_DIRECTORY / 'fort.14', - modeled_start_time=modeled_start_time, - modeled_end_time=modeled_start_time + modeled_duration, - modeled_timestep=modeled_timestep, - tidal_spinup_duration=tidal_spinup_duration, - platform=platform, - runs=runs, - forcings=forcings, - adcirc_processors=adcirc_processors, - slurm_partition=None, - slurm_job_duration=job_duration, - slurm_email_address=slurm_email_address, - adcirc_executable=ADCIRC_EXECUTABLE, - adcprep_executable=ADCPREP_EXECUTABLE, - source_filename=MODULES_FILENAME, - ) - - configuration.write_directory(OUTPUT_DIRECTORY, overwrite=False) - - generation_script = ADCIRCGenerationScript() - generation_script.write(OUTPUT_DIRECTORY / 'generate_adcirc.py', overwrite=True) diff --git a/examples/adcirc_only/hera_hsofs250m_sandy_spinup_tidal.py b/examples/adcirc_only/hera_hsofs250m_sandy_spinup_tidal.py deleted file mode 100644 index 6f8ac742..00000000 --- a/examples/adcirc_only/hera_hsofs250m_sandy_spinup_tidal.py +++ /dev/null @@ -1,85 +0,0 @@ -#! /usr/bin/env python - -from datetime import datetime, timedelta -from pathlib import Path - -from adcircpy.forcing.tides import Tides -from adcircpy.forcing.tides.tides import TidalSource - -from coupledmodeldriver import Platform -from coupledmodeldriver.generate import ADCIRCGenerationScript, \ - ADCIRCRunConfiguration - -# paths to compiled `NEMS.x` and `adcprep` -ADCIRC_EXECUTABLE = ( - '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/ADCIRC/work/padcirc' -) -ADCPREP_EXECUTABLE = ( - '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/ADCIRC/work/adcprep' -) - -MODULES_FILENAME = '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/modulefiles/envmodules_intel.hera' - -# directory containing input ADCIRC mesh nodes (`fort.14`) and (optionally) mesh values (`fort.13`) -MESH_DIRECTORY = ( - Path('/scratch2/COASTAL/coastal/save/shared/models') / 'meshes' / 'hsofs' / '250m' / 'v1.0' -) - -# directory containing input atmospheric mesh forcings (`wind_atm_fin_ch_time_vec.nc`) and WaveWatch III forcings (`ww3.Constant.20151214_sxy_ike_date.nc`) -FORCINGS_DIRECTORY = ( - Path('/scratch2/COASTAL/coastal/save/shared/models') - / 'forcings' - / 'hsofs' - / '250m' - / 'sandy' -) - -# directory to which to write configuration -OUTPUT_DIRECTORY = Path(__file__).parent / Path(__file__).stem - -HAMTIDE_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/hamtide' -TPXO_FILENAME = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/h_tpxo9.v1.nc' - -if __name__ == '__main__': - platform = Platform.HERA - adcirc_processors = 11 - modeled_start_time = datetime(2008, 8, 23) - modeled_duration = timedelta(days=14.5) - modeled_timestep = timedelta(seconds=2) - tidal_spinup_duration = timedelta(days=12.5) - nems_interval = timedelta(hours=1) - job_duration = timedelta(hours=6) - - # dictionary defining runs with ADCIRC value perturbations - in this case, a single run with no perturbation - runs = {f'test_case_1': None} - - slurm_email_address = 'example@email.gov' - - # initialize `adcircpy` forcing objects - tidal_forcing = Tides(tidal_source=TidalSource.TPXO, resource=TPXO_FILENAME) - tidal_forcing.use_all() - forcings = [tidal_forcing] - - configuration = ADCIRCRunConfiguration( - fort13=MESH_DIRECTORY / 'fort.13', - fort14=MESH_DIRECTORY / 'fort.14', - modeled_start_time=modeled_start_time, - modeled_end_time=modeled_start_time + modeled_duration, - modeled_timestep=modeled_timestep, - tidal_spinup_duration=tidal_spinup_duration, - platform=platform, - runs=runs, - forcings=forcings, - adcirc_processors=adcirc_processors, - slurm_partition=None, - slurm_job_duration=job_duration, - slurm_email_address=slurm_email_address, - adcirc_executable=ADCIRC_EXECUTABLE, - adcprep_executable=ADCPREP_EXECUTABLE, - source_filename=MODULES_FILENAME, - ) - - configuration.write_directory(OUTPUT_DIRECTORY, overwrite=False) - - generation_script = ADCIRCGenerationScript() - generation_script.write(OUTPUT_DIRECTORY / 'generate_adcirc.py', overwrite=True) diff --git a/examples/adcirc_only/hera_hsofs250m_sandy_spinup_tidal_atmesh_ww3data.py b/examples/adcirc_only/hera_hsofs250m_sandy_spinup_tidal_atmesh_ww3data.py deleted file mode 100644 index e0a03001..00000000 --- a/examples/adcirc_only/hera_hsofs250m_sandy_spinup_tidal_atmesh_ww3data.py +++ /dev/null @@ -1,97 +0,0 @@ -#! /usr/bin/env python - -from datetime import datetime, timedelta -from pathlib import Path - -from adcircpy.forcing.tides import Tides -from adcircpy.forcing.tides.tides import TidalSource -from adcircpy.forcing.waves.ww3 import WaveWatch3DataForcing -from adcircpy.forcing.winds.atmesh import AtmosphericMeshForcing - -from coupledmodeldriver import Platform -from coupledmodeldriver.generate import ADCIRCGenerationScript, \ - ADCIRCRunConfiguration - -# paths to compiled `NEMS.x` and `adcprep` -ADCIRC_EXECUTABLE = ( - '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/ADCIRC/work/padcirc' -) -ADCPREP_EXECUTABLE = ( - '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/ADCIRC/work/adcprep' -) - -MODULES_FILENAME = '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/modulefiles/envmodules_intel.hera' - -# directory containing input ADCIRC mesh nodes (`fort.14`) and (optionally) mesh values (`fort.13`) -MESH_DIRECTORY = ( - Path('/scratch2/COASTAL/coastal/save/shared/models') / 'meshes' / 'hsofs' / '250m' / 'v1.0' -) - -# directory containing input atmospheric mesh forcings (`wind_atm_fin_ch_time_vec.nc`) and WaveWatch III forcings (`ww3.Constant.20151214_sxy_ike_date.nc`) -FORCINGS_DIRECTORY = ( - Path('/scratch2/COASTAL/coastal/save/shared/models') - / 'forcings' - / 'hsofs' - / '250m' - / 'sandy' -) - -# directory to which to write configuration -OUTPUT_DIRECTORY = Path(__file__).parent / Path(__file__).stem - -HAMTIDE_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/hamtide' -TPXO_FILENAME = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/h_tpxo9.v1.nc' - -if __name__ == '__main__': - platform = Platform.HERA - adcirc_processors = 11 - modeled_start_time = datetime(2008, 8, 23) - modeled_duration = timedelta(days=14.5) - modeled_timestep = timedelta(seconds=2) - tidal_spinup_duration = timedelta(days=12.5) - nems_interval = timedelta(hours=1) - job_duration = timedelta(hours=6) - - # dictionary defining runs with ADCIRC value perturbations - in this case, a single run with no perturbation - runs = {f'test_case_1': None} - - slurm_email_address = 'example@email.gov' - - # initialize `adcircpy` forcing objects - tidal_forcing = Tides(tidal_source=TidalSource.TPXO, resource=TPXO_FILENAME) - tidal_forcing.use_all() - wind_forcing = AtmosphericMeshForcing( - filename=FORCINGS_DIRECTORY / 'wind_atm_fin_ch_time_vec.nc', - nws=17, - interval_seconds=3600, - ) - wave_forcing = WaveWatch3DataForcing( - filename=FORCINGS_DIRECTORY / 'ww3.Constant.20151214_sxy_ike_date.nc', - nrs=5, - interval_seconds=3600, - ) - forcings = [tidal_forcing, wind_forcing, wave_forcing] - - configuration = ADCIRCRunConfiguration( - fort13=MESH_DIRECTORY / 'fort.13', - fort14=MESH_DIRECTORY / 'fort.14', - modeled_start_time=modeled_start_time, - modeled_end_time=modeled_start_time + modeled_duration, - modeled_timestep=modeled_timestep, - tidal_spinup_duration=tidal_spinup_duration, - platform=platform, - runs=runs, - forcings=forcings, - adcirc_processors=adcirc_processors, - slurm_partition=None, - slurm_job_duration=job_duration, - slurm_email_address=slurm_email_address, - adcirc_executable=ADCIRC_EXECUTABLE, - adcprep_executable=ADCPREP_EXECUTABLE, - source_filename=MODULES_FILENAME, - ) - - configuration.write_directory(OUTPUT_DIRECTORY, overwrite=False) - - generation_script = ADCIRCGenerationScript() - generation_script.write(OUTPUT_DIRECTORY / 'generate_adcirc.py', overwrite=True) diff --git a/examples/adcirc_only/hera_shinnecock_ike_spinup.py b/examples/adcirc_only/hera_shinnecock_ike_spinup.py deleted file mode 100644 index 0a4548fa..00000000 --- a/examples/adcirc_only/hera_shinnecock_ike_spinup.py +++ /dev/null @@ -1,76 +0,0 @@ -#! /usr/bin/env python - -from datetime import datetime, timedelta -from pathlib import Path - -from coupledmodeldriver import Platform -from coupledmodeldriver.generate import ADCIRCGenerationScript, \ - ADCIRCRunConfiguration - -# paths to compiled `NEMS.x` and `adcprep` -ADCIRC_EXECUTABLE = ( - '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/ADCIRC/work/padcirc' -) -ADCPREP_EXECUTABLE = ( - '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/ADCIRC/work/adcprep' -) - -MODULES_FILENAME = '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/modulefiles/envmodules_intel.hera' - -# directory containing input ADCIRC mesh nodes (`fort.14`) and (optionally) mesh values (`fort.13`) -MESH_DIRECTORY = ( - Path('/scratch2/COASTAL/coastal/save/shared/models') / 'meshes' / 'shinnecock' / 'v1.0' -) - -# directory containing input atmospheric mesh forcings (`wind_atm_fin_ch_time_vec.nc`) and WaveWatch III forcings (`ww3.Constant.20151214_sxy_ike_date.nc`) -FORCINGS_DIRECTORY = ( - Path('/scratch2/COASTAL/coastal/save/shared/models') / 'forcings' / 'shinnecock' / 'ike' -) - -# directory to which to write configuration -OUTPUT_DIRECTORY = Path(__file__).parent / Path(__file__).stem - -HAMTIDE_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/hamtide' -TPXO_FILENAME = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/h_tpxo9.v1.nc' - -if __name__ == '__main__': - platform = Platform.HERA - adcirc_processors = 11 - modeled_start_time = datetime(2008, 8, 23) - modeled_duration = timedelta(days=14.5) - modeled_timestep = timedelta(seconds=2) - tidal_spinup_duration = timedelta(days=12.5) - nems_interval = timedelta(hours=1) - job_duration = timedelta(hours=6) - - # dictionary defining runs with ADCIRC value perturbations - in this case, a single run with no perturbation - runs = {f'test_case_1': None} - - slurm_email_address = 'example@email.gov' - - # initialize `adcircpy` forcing objects - forcings = [] - - configuration = ADCIRCRunConfiguration( - fort13=MESH_DIRECTORY / 'fort.13', - fort14=MESH_DIRECTORY / 'fort.14', - modeled_start_time=modeled_start_time, - modeled_end_time=modeled_start_time + modeled_duration, - modeled_timestep=modeled_timestep, - tidal_spinup_duration=tidal_spinup_duration, - platform=platform, - runs=runs, - forcings=forcings, - adcirc_processors=adcirc_processors, - slurm_partition=None, - slurm_job_duration=job_duration, - slurm_email_address=slurm_email_address, - adcirc_executable=ADCIRC_EXECUTABLE, - adcprep_executable=ADCPREP_EXECUTABLE, - source_filename=MODULES_FILENAME, - ) - - configuration.write_directory(OUTPUT_DIRECTORY, overwrite=False) - - generation_script = ADCIRCGenerationScript() - generation_script.write(OUTPUT_DIRECTORY / 'generate_adcirc.py', overwrite=True) diff --git a/examples/nems_adcirc/hera_hsofs120m_sandy_spinup_tidal_atmesh_ww3data.py b/examples/nems_adcirc/hera_hsofs120m_sandy_spinup_tidal_atmesh_ww3data.py index d6824c62..a893a634 100644 --- a/examples/nems_adcirc/hera_hsofs120m_sandy_spinup_tidal_atmesh_ww3data.py +++ b/examples/nems_adcirc/hera_hsofs120m_sandy_spinup_tidal_atmesh_ww3data.py @@ -1,5 +1,3 @@ -#! /usr/bin/env python - from datetime import datetime, timedelta from pathlib import Path @@ -14,66 +12,45 @@ NEMSADCIRCRunConfiguration, ) -# paths to compiled `NEMS.x` and `adcprep` +# directory to which to write configuration +OUTPUT_DIRECTORY = Path(__file__).parent / Path(__file__).stem + +# start and end times for model +MODELED_START_TIME = datetime(year=2008, month=8, day=23) +MODELED_DURATION = timedelta(days=14.5) +MODELED_TIMESTEP = timedelta(seconds=2) +TIDAL_SPINUP_DURATION = timedelta(days=12.5) +NEMS_INTERVAL = timedelta(hours=1) + +# directories containing forcings and mesh +MESH_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/meshes/hsofs/120m/v3.0_20210401' +FORCINGS_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/forcings/hsofs/120m/sandy' +HAMTIDE_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/hamtide' +TPXO_FILENAME = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/h_tpxo9.v1.nc' + +# connections between coupled components +NEMS_CONNECTIONS = ['ATM -> OCN', 'WAV -> OCN'] +NEMS_SEQUENCE = [ + 'ATM -> OCN', + 'WAV -> OCN', + 'ATM', + 'WAV', + 'OCN', +] + +# platform-specific parameters +PLATFORM = Platform.HERA +ADCIRC_PROCESSORS = 15 * PLATFORM.value['processors_per_node'] NEMS_EXECUTABLE = ( '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/NEMS/exe/NEMS.x' ) ADCPREP_EXECUTABLE = ( '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/ADCIRC/work/adcprep' ) - -MODULES_FILENAME = '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/modulefiles/envmodules_intel.hera' - -# directory containing input ADCIRC mesh nodes (`fort.14`) and (optionally) mesh values (`fort.13`) -MESH_DIRECTORY = ( - Path('/scratch2/COASTAL/coastal/save/shared/models') - / 'meshes' - / 'hsofs' - / '120m' - / 'v2.2_20210915' -) - -# directory containing input atmospheric mesh forcings (`wind_atm_fin_ch_time_vec.nc`) and WaveWatch III forcings (`ww3.Constant.20151214_sxy_ike_date.nc`) -FORCINGS_DIRECTORY = ( - Path('/scratch2/COASTAL/coastal/save/shared/models') - / 'forcings' - / 'hsofs' - / '120m' - / 'sandy' -) - -# directory to which to write configuration -OUTPUT_DIRECTORY = Path(__file__).parent / Path(__file__).stem - -HAMTIDE_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/hamtide' -TPXO_FILENAME = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/h_tpxo9.v1.nc' +MODULEFILE = '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/modulefiles/envmodules_intel.hera' +SLURM_JOB_DURATION = timedelta(hours=6) if __name__ == '__main__': - platform = Platform.HERA - adcirc_processors = 15 * platform.value['processors_per_node'] - modeled_start_time = datetime(2012, 10, 22, 6) - modeled_duration = timedelta(days=14.5) - modeled_timestep = timedelta(seconds=2) - tidal_spinup_duration = timedelta(days=12.5) - nems_interval = timedelta(hours=1) - job_duration = timedelta(hours=6) - - # dictionary defining runs with ADCIRC value perturbations - in this case, a single run with no perturbation - runs = {f'test_case_1': None} - - # describe connections between coupled components - nems_connections = ['ATM -> OCN', 'WAV -> OCN'] - nems_mediations = None - nems_sequence = [ - 'ATM -> OCN', - 'WAV -> OCN', - 'ATM', - 'WAV', - 'OCN', - ] - - slurm_email_address = 'example@email.gov' - # initialize `adcircpy` forcing objects tidal_forcing = Tides(tidal_source=TidalSource.TPXO, resource=TPXO_FILENAME) tidal_forcing.use_all() @@ -90,26 +67,25 @@ forcings = [tidal_forcing, wind_forcing, wave_forcing] configuration = NEMSADCIRCRunConfiguration( - fort13=MESH_DIRECTORY / 'fort.13', - fort14=MESH_DIRECTORY / 'fort.14', - modeled_start_time=modeled_start_time, - modeled_end_time=modeled_start_time + modeled_duration, - modeled_timestep=modeled_timestep, - nems_interval=nems_interval, - nems_connections=nems_connections, - nems_mediations=nems_mediations, - nems_sequence=nems_sequence, - tidal_spinup_duration=tidal_spinup_duration, - platform=platform, - runs=runs, + mesh_directory=MESH_DIRECTORY, + modeled_start_time=MODELED_START_TIME, + modeled_end_time=MODELED_START_TIME + MODELED_DURATION, + modeled_timestep=MODELED_TIMESTEP, + nems_interval=NEMS_INTERVAL, + nems_connections=NEMS_CONNECTIONS, + nems_mediations=None, + nems_sequence=NEMS_SEQUENCE, + tidal_spinup_duration=TIDAL_SPINUP_DURATION, + platform=PLATFORM, + runs=None, forcings=forcings, - adcirc_processors=adcirc_processors, + adcirc_processors=ADCIRC_PROCESSORS, slurm_partition=None, - slurm_job_duration=job_duration, - slurm_email_address=slurm_email_address, + slurm_job_duration=SLURM_JOB_DURATION, + slurm_email_address=None, nems_executable=NEMS_EXECUTABLE, adcprep_executable=ADCPREP_EXECUTABLE, - source_filename=MODULES_FILENAME, + source_filename=MODULEFILE, ) configuration.write_directory(OUTPUT_DIRECTORY, overwrite=False) diff --git a/examples/nems_adcirc/hera_hsofs250m_sandy_spinup_tidal_atmesh_ww3data.py b/examples/nems_adcirc/hera_hsofs250m_sandy_spinup_tidal_atmesh_ww3data.py deleted file mode 100644 index b1e8524b..00000000 --- a/examples/nems_adcirc/hera_hsofs250m_sandy_spinup_tidal_atmesh_ww3data.py +++ /dev/null @@ -1,114 +0,0 @@ -#! /usr/bin/env python - -from datetime import datetime, timedelta -from pathlib import Path - -from adcircpy.forcing.tides import Tides -from adcircpy.forcing.tides.tides import TidalSource -from adcircpy.forcing.waves.ww3 import WaveWatch3DataForcing -from adcircpy.forcing.winds.atmesh import AtmosphericMeshForcing - -from coupledmodeldriver import Platform -from coupledmodeldriver.generate import ( - NEMSADCIRCGenerationScript, - NEMSADCIRCRunConfiguration, -) - -# paths to compiled `NEMS.x` and `adcprep` -NEMS_EXECUTABLE = ( - '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/NEMS/exe/NEMS.x' -) -ADCPREP_EXECUTABLE = ( - '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/ADCIRC/work/adcprep' -) - -MODULES_FILENAME = '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/modulefiles/envmodules_intel.hera' - -# directory containing input ADCIRC mesh nodes (`fort.14`) and (optionally) mesh values (`fort.13`) -MESH_DIRECTORY = ( - Path('/scratch2/COASTAL/coastal/save/shared/models') / 'meshes' / 'hsofs' / '250m' / 'v1.0' -) - -# directory containing input atmospheric mesh forcings (`wind_atm_fin_ch_time_vec.nc`) and WaveWatch III forcings (`ww3.Constant.20151214_sxy_ike_date.nc`) -FORCINGS_DIRECTORY = ( - Path('/scratch2/COASTAL/coastal/save/shared/models') - / 'forcings' - / 'hsofs' - / '250m' - / 'sandy' -) - -# directory to which to write configuration -OUTPUT_DIRECTORY = Path(__file__).parent / Path(__file__).stem - -HAMTIDE_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/hamtide' -TPXO_FILENAME = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/h_tpxo9.v1.nc' - -if __name__ == '__main__': - platform = Platform.HERA - adcirc_processors = 15 * platform.value['processors_per_node'] - modeled_start_time = datetime(2012, 10, 22, 6) - modeled_duration = timedelta(days=14.5) - modeled_timestep = timedelta(seconds=2) - tidal_spinup_duration = timedelta(days=12.5) - nems_interval = timedelta(hours=1) - job_duration = timedelta(hours=6) - - # dictionary defining runs with ADCIRC value perturbations - in this case, a single run with no perturbation - runs = {f'test_case_1': None} - - # describe connections between coupled components - nems_connections = ['ATM -> OCN', 'WAV -> OCN'] - nems_mediations = None - nems_sequence = [ - 'ATM -> OCN', - 'WAV -> OCN', - 'ATM', - 'WAV', - 'OCN', - ] - - slurm_email_address = 'example@email.gov' - - # initialize `adcircpy` forcing objects - tidal_forcing = Tides(tidal_source=TidalSource.TPXO, resource=TPXO_FILENAME) - tidal_forcing.use_all() - wind_forcing = AtmosphericMeshForcing( - filename=FORCINGS_DIRECTORY / 'Wind_HWRF_SANDY_Nov2018_ExtendedSmoothT.nc', - nws=17, - interval_seconds=3600, - ) - wave_forcing = WaveWatch3DataForcing( - filename=FORCINGS_DIRECTORY / 'ww3.HWRF.NOV2018.2012_sxy.nc', - nrs=5, - interval_seconds=3600, - ) - forcings = [tidal_forcing, wind_forcing, wave_forcing] - - configuration = NEMSADCIRCRunConfiguration( - fort13=MESH_DIRECTORY / 'fort.13', - fort14=MESH_DIRECTORY / 'fort.14', - modeled_start_time=modeled_start_time, - modeled_end_time=modeled_start_time + modeled_duration, - modeled_timestep=modeled_timestep, - nems_interval=nems_interval, - nems_connections=nems_connections, - nems_mediations=nems_mediations, - nems_sequence=nems_sequence, - tidal_spinup_duration=tidal_spinup_duration, - platform=platform, - runs=runs, - forcings=forcings, - adcirc_processors=adcirc_processors, - slurm_partition=None, - slurm_job_duration=job_duration, - slurm_email_address=slurm_email_address, - nems_executable=NEMS_EXECUTABLE, - adcprep_executable=ADCPREP_EXECUTABLE, - source_filename=MODULES_FILENAME, - ) - - configuration.write_directory(OUTPUT_DIRECTORY, overwrite=False) - - generation_script = NEMSADCIRCGenerationScript() - generation_script.write(OUTPUT_DIRECTORY / 'generate_nems_adcirc.py', overwrite=True) diff --git a/examples/nems_adcirc/hera_shinnecock_ike_spinup_tidal_atmesh_ww3data.py b/examples/nems_adcirc/hera_shinnecock_ike_spinup_tidal_atmesh_ww3data.py deleted file mode 100644 index 611302cf..00000000 --- a/examples/nems_adcirc/hera_shinnecock_ike_spinup_tidal_atmesh_ww3data.py +++ /dev/null @@ -1,110 +0,0 @@ -#! /usr/bin/env python - -from datetime import datetime, timedelta -from pathlib import Path - -from adcircpy.forcing.tides import Tides -from adcircpy.forcing.tides.tides import TidalSource -from adcircpy.forcing.waves.ww3 import WaveWatch3DataForcing -from adcircpy.forcing.winds.atmesh import AtmosphericMeshForcing - -from coupledmodeldriver import Platform -from coupledmodeldriver.generate import ( - NEMSADCIRCGenerationScript, - NEMSADCIRCRunConfiguration, -) - -# paths to compiled `NEMS.x` and `adcprep` -NEMS_EXECUTABLE = ( - '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/NEMS/exe/NEMS.x' -) -ADCPREP_EXECUTABLE = ( - '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/ADCIRC/work/adcprep' -) - -MODULES_FILENAME = '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/modulefiles/envmodules_intel.hera' - -# directory containing input ADCIRC mesh nodes (`fort.14`) and (optionally) mesh values (`fort.13`) -MESH_DIRECTORY = ( - Path('/scratch2/COASTAL/coastal/save/shared/models') / 'meshes' / 'shinnecock' / 'v1.0' -) - -# directory containing input atmospheric mesh forcings (`wind_atm_fin_ch_time_vec.nc`) and WaveWatch III forcings (`ww3.Constant.20151214_sxy_ike_date.nc`) -FORCINGS_DIRECTORY = ( - Path('/scratch2/COASTAL/coastal/save/shared/models') / 'forcings' / 'shinnecock' / 'ike' -) - -# directory to which to write configuration -OUTPUT_DIRECTORY = Path(__file__).parent / Path(__file__).stem - -HAMTIDE_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/hamtide' -TPXO_FILENAME = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/h_tpxo9.v1.nc' - -if __name__ == '__main__': - platform = Platform.HERA - adcirc_processors = 11 - modeled_start_time = datetime(2008, 8, 23) - modeled_duration = timedelta(days=14.5) - modeled_timestep = timedelta(seconds=2) - tidal_spinup_duration = timedelta(days=12.5) - nems_interval = timedelta(hours=1) - job_duration = timedelta(hours=6) - - # dictionary defining runs with ADCIRC value perturbations - in this case, a single run with no perturbation - runs = {f'test_case_1': None} - - # describe connections between coupled components - nems_connections = ['ATM -> OCN', 'WAV -> OCN'] - nems_mediations = None - nems_sequence = [ - 'ATM -> OCN', - 'WAV -> OCN', - 'ATM', - 'WAV', - 'OCN', - ] - - slurm_email_address = 'example@email.gov' - - # initialize `adcircpy` forcing objects - tidal_forcing = Tides(tidal_source=TidalSource.TPXO, resource=TPXO_FILENAME) - tidal_forcing.use_all() - wind_forcing = AtmosphericMeshForcing( - filename=FORCINGS_DIRECTORY / 'wind_atm_fin_ch_time_vec.nc', - nws=17, - interval_seconds=3600, - ) - wave_forcing = WaveWatch3DataForcing( - filename=FORCINGS_DIRECTORY / 'ww3.Constant.20151214_sxy_ike_date.nc', - nrs=5, - interval_seconds=3600, - ) - forcings = [tidal_forcing, wind_forcing, wave_forcing] - - configuration = NEMSADCIRCRunConfiguration( - fort13=MESH_DIRECTORY / 'fort.13', - fort14=MESH_DIRECTORY / 'fort.14', - modeled_start_time=modeled_start_time, - modeled_end_time=modeled_start_time + modeled_duration, - modeled_timestep=modeled_timestep, - nems_interval=nems_interval, - nems_connections=nems_connections, - nems_mediations=nems_mediations, - nems_sequence=nems_sequence, - tidal_spinup_duration=tidal_spinup_duration, - platform=platform, - runs=runs, - forcings=forcings, - adcirc_processors=adcirc_processors, - slurm_partition=None, - slurm_job_duration=job_duration, - slurm_email_address=slurm_email_address, - nems_executable=NEMS_EXECUTABLE, - adcprep_executable=ADCPREP_EXECUTABLE, - source_filename=MODULES_FILENAME, - ) - - configuration.write_directory(OUTPUT_DIRECTORY, overwrite=False) - - generation_script = NEMSADCIRCGenerationScript() - generation_script.write(OUTPUT_DIRECTORY / 'generate_nems_adcirc.py', overwrite=True) diff --git a/examples/nems_adcirc/hera_shinnecock_ike_spinup_tidal_atmesh_ww3data_perturbed_mannings_n.py b/examples/nems_adcirc/hera_shinnecock_ike_spinup_tidal_atmesh_ww3data_perturbed_mannings_n.py index c1595793..5d2cd6f8 100644 --- a/examples/nems_adcirc/hera_shinnecock_ike_spinup_tidal_atmesh_ww3data_perturbed_mannings_n.py +++ b/examples/nems_adcirc/hera_shinnecock_ike_spinup_tidal_atmesh_ww3data_perturbed_mannings_n.py @@ -1,5 +1,3 @@ -#! /usr/bin/env python - from datetime import datetime, timedelta from pathlib import Path @@ -15,42 +13,45 @@ NEMSADCIRCRunConfiguration, ) -# paths to compiled `NEMS.x` and `adcprep` +# directory to which to write configuration +OUTPUT_DIRECTORY = Path(__file__).parent / Path(__file__).stem + +# start and end times for model +MODELED_START_TIME = datetime(year=2008, month=8, day=23) +MODELED_DURATION = timedelta(days=14.5) +MODELED_TIMESTEP = timedelta(seconds=2) +TIDAL_SPINUP_DURATION = timedelta(days=12.5) +NEMS_INTERVAL = timedelta(hours=1) + +# directories containing forcings and mesh +MESH_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/meshes/shinnecock/v1.0' +FORCINGS_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/forcings/shinnecock/ike' +HAMTIDE_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/hamtide' +TPXO_FILENAME = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/h_tpxo9.v1.nc' + +# connections between coupled components +NEMS_CONNECTIONS = ['ATM -> OCN', 'WAV -> OCN'] +NEMS_SEQUENCE = [ + 'ATM -> OCN', + 'WAV -> OCN', + 'ATM', + 'WAV', + 'OCN', +] + +# platform-specific parameters +PLATFORM = Platform.HERA +ADCIRC_PROCESSORS = 15 * PLATFORM.value['processors_per_node'] NEMS_EXECUTABLE = ( '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/NEMS/exe/NEMS.x' ) ADCPREP_EXECUTABLE = ( '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/ADCIRC/work/adcprep' ) - -MODULES_FILENAME = '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/modulefiles/envmodules_intel.hera' - -# directory containing input ADCIRC mesh nodes (`fort.14`) and (optionally) mesh values (`fort.13`) -MESH_DIRECTORY = ( - Path('/scratch2/COASTAL/coastal/save/shared/models') / 'meshes' / 'shinnecock' / 'v1.0' -) - -# directory containing input atmospheric mesh forcings (`wind_atm_fin_ch_time_vec.nc`) and WaveWatch III forcings (`ww3.Constant.20151214_sxy_ike_date.nc`) -FORCINGS_DIRECTORY = ( - Path('/scratch2/COASTAL/coastal/save/shared/models') / 'forcings' / 'shinnecock' / 'ike' -) - -# directory to which to write configuration -OUTPUT_DIRECTORY = Path(__file__).parent / Path(__file__).stem - -HAMTIDE_DIRECTORY = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/hamtide' -TPXO_FILENAME = '/scratch2/COASTAL/coastal/save/shared/models/forcings/tides/h_tpxo9.v1.nc' +MODULEFILE = '/scratch2/COASTAL/coastal/save/shared/repositories/ADC-WW3-NWM-NEMS/modulefiles/envmodules_intel.hera' +SLURM_JOB_DURATION = timedelta(hours=6) if __name__ == '__main__': - platform = Platform.HERA - adcirc_processors = 11 - modeled_start_time = datetime(2008, 8, 23) - modeled_duration = timedelta(days=14.5) - modeled_timestep = timedelta(seconds=2) - tidal_spinup_duration = timedelta(days=12.5) - nems_interval = timedelta(hours=1) - job_duration = timedelta(hours=6) - # dictionary defining runs with ADCIRC value perturbations - in this case, a range of Manning's N values range = [0.016, 0.08] mean = numpy.mean(range) @@ -58,20 +59,8 @@ values = numpy.random.normal(mean, std, 5) runs = {f'mannings_n_{value:.3}': {'mannings_n_at_sea_floor': value} for value in values} - # describe connections between coupled components - nems_connections = ['ATM -> OCN', 'WAV -> OCN'] - nems_mediations = None - nems_sequence = [ - 'ATM -> OCN', - 'WAV -> OCN', - 'ATM', - 'WAV', - 'OCN', - ] - - slurm_email_address = 'example@email.gov' - # initialize `adcircpy` forcing objects + FORCINGS_DIRECTORY = Path(FORCINGS_DIRECTORY) tidal_forcing = Tides(tidal_source=TidalSource.TPXO, resource=TPXO_FILENAME) tidal_forcing.use_all() wind_forcing = AtmosphericMeshForcing( @@ -88,25 +77,25 @@ configuration = NEMSADCIRCRunConfiguration( fort13=MESH_DIRECTORY / 'fort.13', - fort14=MESH_DIRECTORY / 'fort.14', - modeled_start_time=modeled_start_time, - modeled_end_time=modeled_start_time + modeled_duration, - modeled_timestep=modeled_timestep, - nems_interval=nems_interval, - nems_connections=nems_connections, - nems_mediations=nems_mediations, - nems_sequence=nems_sequence, - tidal_spinup_duration=tidal_spinup_duration, - platform=platform, + mesh_directory=MESH_DIRECTORY / 'fort.14', + modeled_start_time=MODELED_START_TIME, + modeled_end_time=MODELED_START_TIME + MODELED_DURATION, + modeled_timestep=MODELED_TIMESTEP, + nems_interval=NEMS_INTERVAL, + nems_connections=NEMS_CONNECTIONS, + nems_mediations=None, + nems_sequence=NEMS_SEQUENCE, + tidal_spinup_duration=TIDAL_SPINUP_DURATION, + platform=PLATFORM, runs=runs, forcings=forcings, - adcirc_processors=adcirc_processors, + adcirc_processors=ADCIRC_PROCESSORS, slurm_partition=None, - slurm_job_duration=job_duration, - slurm_email_address=slurm_email_address, + slurm_job_duration=SLURM_JOB_DURATION, + slurm_email_address=None, nems_executable=NEMS_EXECUTABLE, adcprep_executable=ADCPREP_EXECUTABLE, - source_filename=MODULES_FILENAME, + source_filename=MODULEFILE, ) configuration.write_directory(OUTPUT_DIRECTORY, overwrite=False) diff --git a/tests/test_generation.py b/tests/test_generation.py index a8c9b71c..6bfb30e0 100644 --- a/tests/test_generation.py +++ b/tests/test_generation.py @@ -88,8 +88,7 @@ def test_nems_adcirc_local_shinnecock_ike(): forcings = [tidal_forcing, wind_forcing, wave_forcing] configuration = NEMSADCIRCRunConfiguration( - fort13=mesh_directory / 'fort.13', - fort14=mesh_directory / 'fort.14', + mesh_directory=mesh_directory, modeled_start_time=modeled_start_time, modeled_end_time=modeled_start_time + modeled_duration, modeled_timestep=modeled_timestep, @@ -172,8 +171,7 @@ def test_nems_adcirc_hera_shinnecock_ike(): forcings = [tidal_forcing, wind_forcing, wave_forcing] configuration = NEMSADCIRCRunConfiguration( - fort13=mesh_directory / 'fort.13', - fort14=mesh_directory / 'fort.14', + mesh_directory=mesh_directory, modeled_start_time=modeled_start_time, modeled_end_time=modeled_start_time + modeled_duration, modeled_timestep=modeled_timestep, @@ -256,8 +254,7 @@ def test_nems_adcirc_stampede2_shinnecock_ike(): forcings = [tidal_forcing, wind_forcing, wave_forcing] configuration = NEMSADCIRCRunConfiguration( - fort13=mesh_directory / 'fort.13', - fort14=mesh_directory / 'fort.14', + mesh_directory=mesh_directory, modeled_start_time=modeled_start_time, modeled_end_time=modeled_start_time + modeled_duration, modeled_timestep=modeled_timestep, @@ -318,8 +315,7 @@ def test_adcirc_local_shinnecock_ike(): forcings = [tidal_forcing] configuration = ADCIRCRunConfiguration( - fort13=mesh_directory / 'fort.13', - fort14=mesh_directory / 'fort.14', + mesh_directory=mesh_directory, modeled_start_time=modeled_start_time, modeled_end_time=modeled_start_time + modeled_duration, modeled_timestep=modeled_timestep, @@ -375,8 +371,7 @@ def test_adcirc_hera_shinnecock_ike(): forcings = [tidal_forcing] configuration = ADCIRCRunConfiguration( - fort13=mesh_directory / 'fort.13', - fort14=mesh_directory / 'fort.14', + mesh_directory=mesh_directory, modeled_start_time=modeled_start_time, modeled_end_time=modeled_start_time + modeled_duration, modeled_timestep=modeled_timestep, @@ -432,8 +427,7 @@ def test_adcirc_stampede2_shinnecock_ike(): forcings = [tidal_forcing] configuration = ADCIRCRunConfiguration( - fort13=mesh_directory / 'fort.13', - fort14=mesh_directory / 'fort.14', + mesh_directory=mesh_directory, modeled_start_time=modeled_start_time, modeled_end_time=modeled_start_time + modeled_duration, modeled_timestep=modeled_timestep,