In the usage_examples
directory in the source code package, there is one example program for each of the languages supported by RSTT.
Language | File |
---|---|
C++ | cpp_example.cc |
C | c_example.c |
Fortran | fortran_example.f90 |
Java | java_example.java |
Python | python_example.py |
Each example program performs the same set of tasks and is written to be as simple as possible with extensive commenting. These programs are meant to be a starting point from which users may explore the documentation and write their own code.
To view these code examples online, click to expand one of the sections below
// include statements #include "SlbmInterface.h" // RSTT library #include "SLBMException.h" // RSTT error catching #include <iostream> // print to terminal #include <string> // strings #include <cmath> // math functions and constants // define some constants for converting between degrees<-->radians double DEG_PER_RAD = 180.0 / M_PI; double RAD_PER_DEG = M_PI / 180.0; // declare namespace (for convenience) using namespace slbm; // main program int main() { // wrap everything in a `try-catch` block try { // declare the relative path to the model file we're going to be using string modelPath = "../models/pdu202009Du.geotess"; // choose an arbitrary phase (Pn, Pg, Sn, or Lg) string phase = "Pn"; // arbitrary source (Meteor Crater, AZ) double srcLatDeg = 35.0274; // latitude (degrees) double srcLonDeg = -111.0228; // longitude (degrees) double srcDepKm = 1.2345; // depth (km) // arbitrary receiver (Albuquerque, NM) double rcvLatDeg = 35.1053; // latitude (degrees) double rcvLonDeg = -106.6294; // longitude (degrees) double rcvDepKm = -1.6000; // depth (km) // convert lat/lon from degrees to radians double srcLatRad = srcLatDeg * RAD_PER_DEG; double srcLonRad = srcLonDeg * RAD_PER_DEG; double rcvLatRad = rcvLatDeg * RAD_PER_DEG; double rcvLonRad = rcvLonDeg * RAD_PER_DEG; // instantiate an RSTT object SlbmInterface slbm; // load the velocity model slbm.loadVelocityModel(modelPath); // create a great circle from source to the receiver slbm.createGreatCircle(phase, srcLatRad, srcLonRad, srcDepKm, rcvLatRad, rcvLonRad, rcvDepKm); // get the distance and travel time from source --> receiver double distRad, distDeg, travelTimeSec; // instantiate variables slbm.getDistance(distRad); // compute distance (rad) and store its value slbm.getTravelTime(travelTimeSec); // compute travel time (sec) and store its value distDeg = distRad * DEG_PER_RAD; // convert radians --> degrees // get the travel time uncertainty double travelTimeUncertSec, // path-dependent travel time uncertainty (sec) travelTime1DUncertSec; // old-style 1D travel time uncertainty (sec) slbm.getTravelTimeUncertainty(travelTimeUncertSec); // compute uncertainty slbm.getTravelTimeUncertainty1D(travelTime1DUncertSec); // compute 1D uncertainty // print our results cout << fixed << setprecision(4) << endl << "C++ Example:" << endl << "--------------------------------" << endl << "Distance: " << setw(9) << distDeg << " deg" << endl << "Travel Time: " << setw(9) << travelTimeSec << " sec" << endl << "Uncertainty: " << setw(9) << travelTimeUncertSec << " sec" << endl << "Uncertainty (1D): " << setw(9) << travelTime1DUncertSec << " sec" << endl << endl; } // catch possible exceptions catch (const SLBMException& e) { // print the exception cout << __FILE__ << ":" << __LINE__ << endl << e.emessage << endl; // return with error cout << "Exited with error code " << 1 << endl; return e.ecode; } catch (const GeoTessException& e) { // print the exception cout << __FILE__ << ":" << __LINE__ << endl << e.emessage << endl; // return with error cout << "Exited with error code " << e.ecode << endl; return e.ecode; } catch (...) { // print the exception cout << __FILE__ << ":" << __LINE__ << endl << "ERROR: An unidentified error has occurred." << endl; // return with error cout << "Exited with error code " << 1 << endl; return 1; } // return successfully return 0; }
// include statements #include "slbm_C_shell.h" // RSTT C library #include <stdio.h> // print to terminal #include <math.h> // math functions and constants #include <stdlib.h> // needed for exit codes // define some constants for converting between degrees<-->radians double DEG_PER_RAD = 180.0 / M_PI; double RAD_PER_DEG = M_PI / 180.0; // error catching function void try(int errorCode) { // if there is an error code (i.e., function returns anything other than 0) if (errorCode != 0) { // initialize a character array to hold error messages char errorMsg[1000]; // get the error message slbm_shell_getErrorMessage(errorMsg); // print the error message printf("ERROR %d:%s\n", errorCode, errorMsg); // exit with the error code exit(errorCode); } } // main program int main() { // declare the relative path to the model file we're going to be using char* modelPath = "../models/pdu202009Du.geotess"; // choose an arbitrary phase (Pn, Pg, Sn, or Lg) char* phase = "Pn"; // arbitrary source (Meteor Crater, AZ) double srcLatDeg = 35.0274; // latitude (degrees) double srcLonDeg = -111.0228; // longitude (degrees) double srcDepKm = 1.2345; // depth (km) // arbitrary receiver (Albuquerque, NM) double rcvLatDeg = 35.1053; // latitude (degrees) double rcvLonDeg = -106.6294; // longitude (degrees) double rcvDepKm = -1.6000; // depth (km) // convert lat/lon from degrees to radians double srcLatRad = srcLatDeg * RAD_PER_DEG; double srcLonRad = srcLonDeg * RAD_PER_DEG; double rcvLatRad = rcvLatDeg * RAD_PER_DEG; double rcvLonRad = rcvLonDeg * RAD_PER_DEG; // instantiate an RSTT object try(slbm_shell_create()); // load the velocity model try(slbm_shell_loadVelocityModel(modelPath)); // create a great circle from source to the receiver try(slbm_shell_createGreatCircle(phase, &srcLatRad, &srcLonRad, &srcDepKm, &rcvLatRad, &rcvLonRad, &rcvDepKm)); // get the distance and travel time from source --> receiver double distRad, distDeg, travelTimeSec; // instantiate variables try(slbm_shell_getDistance(&distRad)); // compute distance (rad) and store its value try(slbm_shell_getTravelTime(&travelTimeSec)); // compute travel time (sec) and store its value distDeg = distRad * DEG_PER_RAD; // convert radians --> degrees // get the travel time uncertainty double travelTimeUncertSec, // path-dependent travel time uncertainty (sec) travelTime1DUncertSec; // old-style 1D travel time uncertainty (sec) try(slbm_shell_getTTUncertainty(&travelTimeUncertSec)); // compute uncertainty try(slbm_shell_getTTUncertainty1D(&travelTime1DUncertSec)); // compute 1D uncertainty // print our results printf("\n" "C Example:\n" "--------------------------------\n" "Distance: %9.4f deg\n" "Travel Time: %9.4f sec\n" "Uncertainty: %9.4f sec\n" "Uncertainty (1D): %9.4f sec\n" "\n", distDeg, travelTimeSec, travelTimeUncertSec, travelTime1DUncertSec); // return successfully return 0; }
! module that contains some various useful constants and definitions module constants ! import modern fortran kinds (real32/64, int8/16/32, etc.) use, intrinsic :: iso_fortran_env ! turn off f77 "feature" forcing counter variables (ijklmn) to be int implicit none ! define various variable types integer, parameter :: SP = real32 ! single-precision floating point integer, parameter :: DP = real64 ! double-precision floating point integer, parameter :: I1 = int8 ! 8 bit (1 byte) integer integer, parameter :: I2 = int16 ! 16 bit (2 bytes) integer integer, parameter :: I4 = int32 ! 32 bit (4 bytes) integer ! pi real(DP), parameter :: PI_DP = 4._DP * atan (1._DP) ! double-precision ! define some constants for converting between degrees<-->radians real(DP), parameter :: DEG_PER_RAD = 180._DP / PI_DP ! degrees per radian real(DP), parameter :: RAD_PER_DEG = PI_DP / 180._DP ! radians per degree end module constants ! module that contains useful error checking code module error_checking ! import the useful constants we've defined use constants ! turn off f77 "feature" forcing counter variables (ijklmn) to be int implicit none ! subroutine/function block contains ! error catching function subroutine catch(errorCode) ! define errorCode as an integer and is an input variable integer(I4), intent(in) :: errorCode ! declare a character array to hold our error message character(len=1024) :: errorMsg ! check if there is an error code (if it's not 0 or 1) if (errorCode /= 0 .AND. errorCode /= 1) then ! get the error message call slbm_get_error_message( errorMsg, sizeof(errorMsg) ) ! print the error message print '(a,i0,a)', "ERROR ", errorCode, ":" print '(a)', errorMsg ! exit the program with error stop 1 endif end subroutine catch end module error_checking ! main progran program main ! import statements use constants ! some useful constants we've defined use error_checking ! error checking functions ! turn off f77 "feature" forcing counter variables (ijklmn) to be int implicit none ! declare a whole bunch of variables integer(I4) :: errorCode ! integer error code character(len=80) :: modelPath ! /path/to/model_file integer(I4) :: phase ! phase id real(DP) :: srcLatDeg, srcLonDeg, srcDepKm, & ! source location rcvLatDeg, rcvLonDeg, rcvDepKm ! receiver location real(DP) :: srcLatRad, srcLonRad, & ! source location (radians) rcvLatRad, rcvLonRad ! source location (radians) real(DP) :: distDeg, distRad, & ! source <--> receiver distance travelTimeSec, & ! travel time (sec) from source --> receiver travelTimeUncertSec, & ! path-dependent travel time uncertainty (sec) travelTime1DUncertSec ! old-style 1D travel time uncertainty (sec) ! declare the relative path to the model file we're going to be using modelPath = "../models/pdu202009Du.geotess" ! choose an arbitrary phase (Pn=0, Sn=1, Pg=2, or Lg=3) phase = 0 ! arbitrary source (Meteor Crater, AZ) srcLatDeg = 35.0274_DP ! latitude (degrees) srcLonDeg = -111.0228_DP ! longitude (degrees) srcDepKm = 1.2345_DP ! depth (km) ! ! arbitrary receiver (Albuquerque, NM) rcvLatDeg = 35.1053_DP ! latitude (degrees) rcvLonDeg = -106.6294_DP ! longitude (degrees) rcvDepKm = -1.6000_DP ! depth (km) ! convert lat/lon from degrees to radians srcLatRad = srcLatDeg * rad_per_deg srcLonRad = srcLonDeg * rad_per_deg rcvLatRad = rcvLatDeg * rad_per_deg rcvLonRad = rcvLonDeg * rad_per_deg ! instantiate an RSTT object call slbm_create(errorCode) call catch(errorCode) ! check if the previous function returned an error ! load the velocity model call slbm_load_velocity_model(trim(modelPath), len_trim(modelPath), errorCode) call catch(errorCode) ! check if the previous function returned an error ! create a great circle from source to the receiver call slbm_create_great_circle(phase, & srcLatRad, srcLonRad, srcDepKm, & rcvLatRad, rcvLonRad, rcvDepKm, & errorCode) call catch(errorCode) ! check if the previous function returned an error ! get the distance and travel time from source --> receiver call slbm_get_distance(distRad, errorCode) ! compute distance (rad) and store its value call catch(errorCode) ! check if the previous function returned an error call slbm_get_travel_time(travelTimeSec, errorCode) ! compute travel time (sec) and store its value call catch(errorCode) ! check if the previous function returned an error distDeg = distRad * DEG_PER_RAD ! convert radians --> degrees ! get the travel time uncertainty call slbm_get_tt_uncertainty(travelTimeUncertSec, errorCode) ! compute uncertainty call catch(errorCode) ! check if the previous function returned an error call slbm_get_tt_uncertainty1d(travelTime1DUncertSec, errorCode) ! compute 1D uncertainty call catch(errorCode) ! check if the previous function returned an error ! print our results print '(a)', "" print '(a)', "Fortran Example:" print '(a)', "--------------------------------" print '(a,f9.4,a)', "Distance: ", distDeg, " deg" print '(a,f9.4,a)', "Travel Time: ", travelTimeSec, " sec" print '(a,f9.4,a)', "Uncertainty: ", travelTimeUncertSec, " sec" print '(a,f9.4,a)', "Uncertainty (1D): ", travelTime1DUncertSec, " sec" print '(a)', "" ! return successfully return end program main
// import statements import java.io.File; // file, path, and environment variable stuff import static java.lang.Math.*; // mathematics (degrees<-->radians) import gov.sandia.gnem.slbmjni.SlbmInterface; // RSTT library import gov.sandia.gnem.slbmjni.SLBMException; // RSTT error catching // main class public class java_example { // annoyingly long method which will run at startup and try to load slbmjni, // first from the system paths, then by searching environment variables // ($RSTT_ROOT, $RSTT_HOME, $SLBM_ROOT, $SLBM_HOME). this also has to take // into account multiple possible file extensions on MacOS (.dylib, .jnilib) static { // first we'll just try and load the library try { System.loadLibrary("slbmjni"); } // if that didn't work, we'll start checking environmental variables catch (java.lang.UnsatisfiedLinkError e) { // get the filename of the library we're looking for String libName = System.mapLibraryName("slbmjni"); // e.g., "libslbmjni.so" String libBase = libName.split("\\.")[0]; // file basename String libExt = libName.split("\\.")[1]; // file extension // make our list of env vars to search, in preferred order String envVars[] = {"RSTT_ROOT", "RSTT_HOME", "SLBM_ROOT", "SLBM_HOME"}; // initialize a boolean for when the library has loaded. if we have // successfully loaded it, we'll end the whole method boolean jniLoaded = false; // loop through each environment variable and look for slbmjni for (String env : envVars) { // try and get the environment variable String rootDir = System.getenv(env); // move on if it wasn't set if (rootDir == null) continue; // first check if libName exists if (new File(rootDir + "/lib/" + libBase + "." + libExt).exists()) System.load(rootDir + "/lib/" + libBase + "." + libExt); // load it // if that file doesn't exist, look for libslbmjni.jnilib else if (new File(rootDir + "/lib/" + libBase + ".jnilib").exists()) System.load(rootDir + "/lib/" + libBase + ".jnilib"); // load it // if that doesn't exist, we'll move onto the next variable else continue; // we made it this far, so we must have loaded the library! jniLoaded = true; // set our boolean to true break; // break out of the loop } // if, we still haven't loaded slbmjni, throw a helpful error message if (!jniLoaded) { // append some helpful info to the error message String errMsg = e.getMessage() + " or [$RSTT_ROOT/lib, $RSTT_HOME/lib, $SLBM_ROOT/lib, $SLBM_HOME/lib]"; // make a new UnsatisfiedLinkError with our updated message UnsatisfiedLinkError ex = new UnsatisfiedLinkError(errMsg); // print out the stacktrace, some helpful info, and exit ex.printStackTrace(); System.out.println("Did you try adding '-Djava.library.path=\"/path/to/rstt/lib\"' to your 'java' command?"); System.out.println("Alternatively, set $RSTT_ROOT, $RSTT_HOME, $SLBM_ROOT, or $SLBM_HOME environment variables."); System.exit(1); } } } // main method public static void main(String args[]) { // wrap everything in a `try-catch` block try { // declare the relative path to the model file we're going to be using String modelPath = "../models/pdu202009Du.geotess"; // choose an arbitrary phase (Pn, Pg, Sn, or Lg) String phase = "Pn"; // arbitrary source (Meteor Crater, AZ) double srcLatDeg = 35.0274; // latitude (degrees) double srcLonDeg = -111.0228; // longitude (degrees) double srcDepKm = 1.2345; // depth (km) // arbitrary receiver (Albuquerque, NM) double rcvLatDeg = 35.1053; // latitude (degrees) double rcvLonDeg = -106.6294; // longitude (degrees) double rcvDepKm = -1.6000; // depth (km) // convert lat/lon from degrees to radians double srcLatRad = toRadians(srcLatDeg); double srcLonRad = toRadians(srcLonDeg); double rcvLatRad = toRadians(rcvLatDeg); double rcvLonRad = toRadians(rcvLonDeg); // instantiate an RSTT object SlbmInterface slbm = new SlbmInterface(); // load velocity model slbm.loadVelocityModel(modelPath); // create a great circle from source to the receiver slbm.createGreatCircle(phase, srcLatRad, srcLonRad, srcDepKm, rcvLatRad, rcvLonRad, rcvDepKm); // get the distance and travel time from source --> receiver double distRad, distDeg, travelTimeSec; // instantiate variables distRad = slbm.getDistance(); // compute distance (rad) and store its value travelTimeSec = slbm.getTravelTime(); // compute travel time (sec) and store its value distDeg = toDegrees(distRad); // convert radians --> degrees // get the travel time uncertainty double travelTimeUncertSec, // path-dependent travel time uncertainty (sec) travelTime1DUncertSec; // old-style 1D travel time uncertainty (sec) travelTimeUncertSec = slbm.getTravelTimeUncertainty(); // compute uncertainty travelTime1DUncertSec = slbm.getTravelTimeUncertainty1D(); // compute 1D uncertainty // print our results System.out.format("\n"); System.out.format("Java Example:\n"); System.out.format("--------------------------------\n"); System.out.format("Distance: %9.4f deg\n", distDeg); System.out.format("Travel Time: %9.4f sec\n", travelTimeSec); System.out.format("Uncertainty: %9.4f sec\n", travelTimeUncertSec); System.out.format("Uncertainty (1D): %9.4f sec\n", travelTime1DUncertSec); System.out.format("\n"); } // catch possible exceptions catch (SLBMException e) { // print info about the exception and exit e.printStackTrace(); System.exit(1); } // catch other exceptions catch (Exception e) { // print info about the exception and exit e.printStackTrace(); System.exit(1); } // return successfully System.exit(0); } }
#!/usr/bin/env python3 # first try and import rstt. if that fails, search the environment variables # for the appropriate path and try and import from there. try: import rstt # it looks like importing failed. try searching paths from environment variables for the module except ModuleNotFoundError: import os, sys # import some required modules for d in ('RSTT_ROOT', 'RSTT_HOME', 'SLBM_ROOT', 'SLBM_HOME'): # list of env vars to check, in order if os.getenv(d): # if the environmental var is set sys.path.append(os.getenv(d) + "/lib") # add to the start of the module search path # try and import rstt again try: import rstt # if it still fails, raise an exception with a helpful error message except ModuleNotFoundError as e: e.msg += ". Have you set $RSTT_ROOT, $SLBM_ROOT, or installed RSTT with pip?" raise e from None # main program if __name__ == "__main__": # wrap everything in a try-except block try: # declare the relative path to the model file we're going to be using modelPath = "../models/pdu202009Du.geotess" # choose an arbitrary phase (Pn, Pg, Sn, or Lg) phase = "Pn" # arbitrary source (Meteor Crater, AZ) srcLatDeg = 35.0274 # latitude (degrees) srcLonDeg = -111.0228 # longitude (degrees) srcDepKm = 1.2345 # depth (km) # arbitrary receiver (Albuquerque, NM) rcvLatDeg = 35.1053 # latitude (degrees) rcvLonDeg = -106.6294 # longitude (degrees) rcvDepKm = -1.6000 # depth (km) # convert lat/lon from degrees to radians srcLatRad = rstt.deg2rad(srcLatDeg) srcLonRad = rstt.deg2rad(srcLonDeg) rcvLatRad = rstt.deg2rad(rcvLatDeg) rcvLonRad = rstt.deg2rad(rcvLonDeg) # instantiate an RSTT object slbm = rstt.SlbmInterface() # load the velocity model slbm.loadVelocityModel(modelPath) # create a great circle from source to the receiver slbm.createGreatCircle(phase, srcLatRad, srcLonRad, srcDepKm, rcvLatRad, rcvLonRad, rcvDepKm) # get the distance and travel time from source --> receiver travelTimeSec = slbm.getTravelTime() # compute travel time (sec) distRad = slbm.getDistance() # compute distance (rad) distDeg = rstt.rad2deg(distRad) # convert radians --> degrees # get the travel time uncertainty travelTimeUncertSec = slbm.getTravelTimeUncertainty() # compute uncertainty travelTime1DUncertSec = slbm.getTravelTimeUncertainty1D() # compute 1D uncertainty # print our results print( "\n" + "Python Example\n" + "--------------------------------\n" + "Distance: {:7.4f} deg\n".format(distDeg) + "Travel Time: {:7.4f} sec\n".format(travelTimeSec) + "Uncertainty: {:7.4f} sec\n".format(travelTimeUncertSec) + "Uncertainty (1D): {:7.4f} sec\n".format(travelTime1DUncertSec) + "\n" ) # catch possible exceptions except Exception as e: # raise the error we just caught raise(e)