This example contains the data and setup for running a storm surge forecast for Hurricane Ophelia.
Hurricane Ophelia was a category 3 hurricane and the sixth major hurricane in the Atlantic in 2017. Ophelia formed into a tropical storm by 0600 UTC October 09, strengthened to become a hurricane by 1800 UTC October 11, made landfall along the southwestern coast of Ireland at 1100 UTC 15 October. Extratropical Ophelia moved north-east across western Island, emerged over the North Sea, maked landfall along the coast of Norway, and dissipated by 0000 UTC 18 October.
Source: NOAA Tropical Cyclone Report (https://www.nhc.noaa.gov/data/tcr/AL172017_Ophelia.pdf)
If Clawpack has not been installed, one can install Clawpack from here: https://www.clawpack.org/installing.html
Before installation of Clawpack, prerequisites may need to be installed including pip3 and python3.
Best of luck installing dependencies!
After installing Clawpack, run examples, either this one here or from Clawpack,
for Hurricane Ike: http://www.clawpack.org/gallery/_static/geoclaw/examples/storm-surge/ike/README.html
for Hurricane Isaac: http://www.clawpack.org/gallery/_static/geoclaw/examples/storm-surge/isaac/README.html
If running this example, download setrun.py, setplot.py, and Makefile to desired folder.
Data for Clawpack to run simulation was taken from NOAA's storm data archive:
https://ftp.nhc.noaa.gov/atcf/archive/2017/
Hurricane Ophelia storm data was located in bal172017.dat.gz
In setrun.py, one can retrieve data directly from source by writing a code similar to this:
# Convert ATCF data to GeoClaw format
clawutil.data.get_remote_file("https://ftp.nhc.noaa.gov/atcf/archive/2017/bal172017.dat.gz")
atcf_path = os.path.join(scratch_dir, "bal172017.dat")
Topography data was accessed using GEBCO 2020 Gridded Bathymetry Data Download tool: https://download.gebco.net/
Specifications to download topography:
Latitude: S 20, N 80
Longitude: W -40, E 20
Format: 2D netCDF Grid or Esri ASCII (depending on size of file one prefers)
Topography file already converted to ASC file can be accessed in: https://www.dropbox.com/sh/gyhx2lio1sr5tl9/AAD7Can6yYIfW3I6nChfLFNMa?dl=0
In this example, the topogaphy was placed in the geoclaw folder and the following code was modified in setrun.py to read in the topography data.
topo_path = os.path.join("/home/socoyjonathan/clawpack_src/clawpack-v5.7.1/geoclaw/topograpy", "topography.asc")
Download topography data, add file to desired folder, but set the correct path from home folder to folder where file will be located, and add the name of the asc file as in this example.
NETCDF type also works but may need to convert to .tt3 file to be compatible with GeoClaw.
Simulation ran from 2 days before landfall, 14 October, to 2 days 12 hours after landfall, 18 October.
Gauges were selected from the British Oceanography Data Centre (BODC): https://www.bodc.ac.uk/data/hosted_data_systems/sea_level/uk_tide_gauge_network/
For this example, four gauge locations were selected and specified in setrun.py
# Portrush:
rundata.gaugedata.gauges.append([1, -6.657948, 55.206390, rundata.clawdata.t0, rundata.clawdata.tfinal])
For UK based storms, due to limited data availability, comparisons of surges may prove to be rigorous.
Output for gauge data ran from 2 days before landfall to 2 days after landfall
Observed data for sea level for each gauge location was downloaded from: https://www.bodc.ac.uk/data/hosted_data_systems/sea_level/uk_tide_gauge_network/processed_customise_time_selection/
Unfortunately, the datum is unknown and is not provided by BODC. Therefore, tide data is unknown, and observed data cannot be de-tided.
One may resort to the python package Pytides to predict tide data, allow for observed data to be de-tided, and observed surge data to be compared to Clawpack simulation output for surge data.
Pytides may be installed from its source: https://github.com/sam-cox/pytides
However, source files are not compatible with Python 3, and Python 2 installation not recommended. Therefore, modifications to the import code is required.
Alternatively, one can clone this modified package adjusted to work with Python 3.7 and above: https://github.com/yudevan/pytides
After obtaining tide predictions from pytides, de-tide observed data from BODC and save surge data as a text file.
In this example, Clawpack gauge data was downloaded after simulation was complete and using python scripts, Clawpack output and observed data were compared by observing their plots.
If working with NOAA database and US-based storms, one may obtain observed data from NOAA's database and modify setplot.py to compare surge data within Clawpack
In this example,
Portrush station in Northern Ireland experienced a storm surge of approximately .486 m. Clawpack prediction was approximately the same. Time of surge is slightly off.
Tobermory station in Scotland experienced a storm surge of approximately .75 m. Clawpack prediction was approximately .62 m. Time of surge aligns.
Ullapool station in Scotland experienced a storm surge of approximately .680 m. Clawpack prediction was approximately .63 m. Time of surge is slightly off.
Kinlochbervie station in Scotland experienced a storm surge of approximately .29 m. Clawpack prediction was approximately .52 m. Time of surge aligns.
Comparisons for surge data can be found here: https://www.dropbox.com/s/1h3xa4d8al9fiuz/Clawpack_Surge_Comparisons.pdf?dl=0
In each case, discrepencies may be due to insuffient refinements in simulation. A more powerful machine may provide more accurate forecast models to storm surge simulations. The tidal predictions may have been slightly off too within unknown datum for observed data from BODC.
Storm surges obtained from Clawpack were consistent. Comparing Clawpack output to observed data, storm surges were a good model of a real-world storm surge. More analysis and refinements may lead to more accurate results.
Final remarks: setrun.py may be modified to have higher levels of refinement as in this example:
# max number of refinement levels:
amrdata.amr_levels_max = 6
And refinement ratios may be specified in setrun.py too as in this example:
regions.append([1,3,rundata.clawdata.t0, rundata.clawdata.tfinal, -30.0, -12.0, 30.0, 72.0])
For any questions on the specifics of this example, contact Jonathan Socoy ([email protected]).