Source code for rockhound.slab2

"""
Load the subduction geometry for a given zone.
"""
import xarray as xr

from .registry import REGISTRY

DATASETS = {
    "depth": dict(name="Slab depth", units="meters"),
    "dip": dict(name="Slab dip", units="degree"),
    "strike": dict(name="Slab strike", units="degree"),
    "thickness": dict(name="Slab thickness", units="meters"),
    "depth_uncertainty": dict(name="Slab depth uncertainty", units="meters"),
}

ZONES = {
    "alaska": dict(fname_indicator="alu", name="Alaska"),
    "calabria": dict(fname_indicator="cal", name="Calabria"),
    "caribbean": dict(fname_indicator="car", name="Caribbean"),
    "cascadia": dict(fname_indicator="cas", name="Cascadia"),
    "central_america": dict(fname_indicator="cam", name="Central America"),
    "cotabalo": dict(fname_indicator="cot", name="Cotabalo"),
    "halmahera": dict(fname_indicator="hal", name="Halmahera"),
    "hellenic": dict(fname_indicator="hel", name="Hellenic Arc"),
    "himalaya": dict(fname_indicator="him", name="Himalaya"),
    "hindu_kush": dict(fname_indicator="hin", name="Hindu Kush"),
    "izu_bonin": dict(fname_indicator="izu", name="Izu-Bonin"),
    "kamchatka": dict(fname_indicator="kur", name="Kamchatka-Kuril Islands-Japan"),
    "kermadec": dict(fname_indicator="ker", name="Kermadec"),
    "makran": dict(fname_indicator="mak", name="Makran"),
    "manila_trench": dict(fname_indicator="man", name="Manila Trench"),
    "muertos_trough": dict(fname_indicator="mue", name="Muertos Trough"),
    "new_guinea": dict(fname_indicator="png", name="New Guinea"),
    "pamir": dict(fname_indicator="pam", name="Pamir"),
    "philippines": dict(fname_indicator="phi", name="Philippines"),
    "puysegur": dict(fname_indicator="puy", name="Puysegur"),
    "ryukyu": dict(fname_indicator="ryu", name="Ryukyu"),
    "scotia_sea": dict(fname_indicator="sco", name="Scotia Sea"),
    "solomon_islands": dict(fname_indicator="sol", name="Solomon Islands"),
    "south_america": dict(fname_indicator="sam", name="South America"),
    "sulawesi": dict(fname_indicator="sul", name="Sulawesi"),
    "sumatra_java": dict(fname_indicator="sum", name="Sumatra-Java"),
    "vanuatu": dict(fname_indicator="van", name="Vanuatu"),
}


[docs]def fetch_slab2(zone, *, load=True): """ Load the Slab2 model for a given subduction zone. Slab2 is a three-dimensional compilation of global subduction geometries (depth, dip, strike and thickness), separated into regional models for each major subduction zone. Each model is based on a probabilistic non-linear fit to data from a combined catalog consisting of several independent data sets - historic earthquake catalogs, CMT solutions, active seismic profiles, global plate boundaries, bathymetry and sediment thickness information [SLAB2]_. Parameters ---------- zone : str Subduction zone to fech the model. Available zones: - ``alaska``: Alaska - ``calabria``: Calabria - ``caribbean``: Caribbean - ``cascadia``: Cascadia - ``central_america``: Central America - ``cotabalo``: Cotabalo - ``halmahera``: Halmahera - ``hellenic``: Hellenic Arc - ``himalaya``: Himalaya - ``hindu_kush``: Hindu Kush - ``izu_bonin``: Izu-Bonin - ``kamchatka``: Kamchatka-Kuril Islands-Japan - ``kermadec``: Kermadec - ``makran``: Makran - ``manila_trench``: Manila Trench - ``muertos_trough``: Muertos Trough - ``new_guinea``: New Guinea - ``pamir``: Pamir - ``philippines``: Philippines - ``puysegur``: Puysegur - ``ryukyu``: Ryukyu - ``scotia_sea``: Scotia Sea - ``solomon_islands``: Solomon Islands - ``south_america``: South America - ``sulawesi``: Sulawesi - ``sumatra_java``: Sumatra-Java - ``vanuatu``: Vanuatu load : bool Whether to load the data into an :class:`xarray.Dataset` or just return the path to the downloaded data. If False, will return a list with the paths to the subduction grids, respectively. kwargs Keyword arguments will be forwarded to the :func:`xarray.open_dataset` function that loads the grid into memory. Returns ------- grid : :class:`xarray.Dataset` or str The loaded grid or the file path to the downloaded data. """ if zone not in ZONES: raise ValueError("Invalid slab zone: {}".format(zone)) fnames = [ REGISTRY.fetch( "{}_slab2_{}.grd".format(ZONES[zone]["fname_indicator"], dataset) ) for dataset in DATASETS ] if not load: return fnames arrays = [xr.open_dataarray(f).rename(x="longitude", y="latitude") for f in fnames] for array, dataset in zip(arrays, DATASETS): array.name = dataset # Change long_name and add units of each array array.attrs["long_name"] = DATASETS[dataset]["name"] array.attrs["units"] = DATASETS[dataset]["units"] # Merge arrays into a single xr.Dataset grid = xr.merge(arrays) # Change units of thickness, depth and depth_uncertainty to meters # Also change units of the actual_range attribute to meters for field in ("thickness", "depth", "depth_uncertainty"): grid[field] *= 1000 grid[field].attrs["actual_range"] *= 1000 # Change long_name and units of longitude and latitude coords grid.longitude.attrs["long_name"] = "Longitude" grid.longitude.attrs["units"] = "degrees" grid.latitude.attrs["long_name"] = "Latitude" grid.latitude.attrs["units"] = "degrees" # Add attributes to the xr.Dataset grid.attrs.update( { "title": "Slab2 model - Zone: {}".format(ZONES[zone]["name"]), "zone": zone, "zone_full_name": ZONES[zone]["name"], "datum": "WGS84", "doi": "10.5066/F7PV6JNV", } ) return grid