Source code for obspy.taup.taup

# -*- coding: utf-8 -*-
"""
Wrapper around obspy.taup.tau.

Still around for legacy reasons.
"""
from __future__ import (absolute_import, division, print_function,
                        unicode_literals)
from future.builtins import *  # NOQA

import numpy as np
import warnings

from obspy.core.util.deprecation_helpers import ObsPyDeprecationWarning
from . import tau


_MODEL_CACHE = {}


[docs]def getTravelTimes(delta, depth, model='iasp91', phase_list=["ttall"]): # noqa """ Returns travel times. :type delta: float :param delta: Distance in degrees. :type depth: float :param depth: Depth in kilometer. :type model: str, optional :param model: Either ``'iasp91'`` or ``'ak135'`` velocity model. Defaults to ``'iasp91'``. :param phase_list: List of desired phase names. Will be passed to taupy. :type phase_list: list of strings :rtype: list of dicts :return: A list of phase arrivals given in time order. Each phase is represented by a dictionary containing phase name, travel time in seconds, take-off angle, and the ray parameter. .. rubric:: Example >>> from obspy.taup.taup import getTravelTimes >>> tt = getTravelTimes(delta=52.474, depth=611.0, model='ak135') >>> len(tt) 24 >>> tt[0] #doctest: +SKIP {'phase_name': 'P', 'dT/dD': 7.1050525, 'take-off angle': 45.169445, 'time': 497.53741} .. versionchanged:: 0.10.0 Deprecated. The backend is no longer the Fortran iasp-tau program but a Python port of the Java TauP library. A consequence of this is that the ``"dT/dh"`` and ``"d2T/dD2"`` values are no longer returned. Furthermore this function now has a ``phase_list`` keyword argument. """ warnings.warn("The getTravelTimes() function is deprecated. Please use " "the obspy.taup.TauPyModel class directly.", ObsPyDeprecationWarning, stacklevel=2) model = model.lower() # Cache models. if model in ("ak135", "iasp91") and model in _MODEL_CACHE: tau_model = _MODEL_CACHE[model] else: tau_model = tau.TauPyModel(model) if model in ("ak135", "iasp91"): _MODEL_CACHE[model] = tau_model tt = tau_model.get_travel_times(source_depth_in_km=float(depth), distance_in_degree=float(delta), phase_list=phase_list) return [{ "phase_name": arr.purist_name, "time": arr.time, "take-off angle": arr.takeoff_angle, "dT/dD": arr.ray_param_sec_degree} for arr in tt]
[docs]def travelTimePlot(min_degree=0, max_degree=360, npoints=1000, # noqa phases=None, depth=100, model='iasp91'): """ Basic travel time plotting function. :type min_degree: float, optional :param min_degree: Minimum distance in degree used in plot. Defaults to ``0``. :type max_degree: float, optional :param max_degree: Maximum distance in degree used in plot. Defaults to ``360``. :type npoints: int, optional :param npoints: Number of points to plot. Defaults to ``1000``. :type phases: list of str, optional :param phases: List of phase names which should be used within the plot. Defaults to all phases if not explicit set. :type depth: float, optional :param depth: Depth in kilometer. Defaults to ``100``. :type model: str, optional :param model: Either ``'iasp91'`` or ``'ak135'`` velocity model. Defaults to ``'iasp91'``. :return: None .. rubric:: Example >>> from obspy.taup.taup import travelTimePlot >>> travelTimePlot(min_degree=0, max_degree=50, phases=['P', 'S', 'PP'], ... depth=120, model='iasp91') #doctest: +SKIP .. plot:: from obspy.taup.taup import travelTimePlot travelTimePlot(min_degree=0, max_degree=50, phases=['P', 'S', 'PP'], depth=120, model='iasp91') .. versionchanged:: 0.10.0 Deprecated. """ warnings.warn("The travelTimePlot() function is deprecated. Please use " "the obspy.taup.TauPyModel class directly.", ObsPyDeprecationWarning, stacklevel=2) import matplotlib.pylab as plt data = {} if not phases: phases = ["ttall"] degrees = np.linspace(min_degree, max_degree, npoints) # Loop over all degrees. for degree in degrees: with warnings.catch_warnings(record=True): tt = getTravelTimes(degree, depth, model, phase_list=phases) # Mirror if necessary. if degree > 180: degree = 180 - (degree - 180) for item in tt: phase = item['phase_name'] if phase not in data: data[phase] = [[], []] data[phase][1].append(item['time'] / 60.0) data[phase][0].append(degree) # Plot and some formatting. for key, value in data.items(): plt.plot(value[0], value[1], '.', label=key) plt.grid() plt.xlabel('Distance (degrees)') plt.ylabel('Time (minutes)') if max_degree <= 180: plt.xlim(min_degree, max_degree) else: plt.xlim(min_degree, 180) plt.legend(numpoints=1) plt.show()
if __name__ == '__main__': import doctest doctest.testmod(exclude_empty=True)