Changed InterpolatedProfile and all derived classes so that they no longer have to call new to create the data arrays. This involved changing from vector to double[] arrays in many places. Resulted in factor of 3 improvement in execution speed.

Fixed bug that prevented SLBM from exiting gracefully when invalid file specified in Grid::loadVelocityModel().

Added the following methods to all interfaces:

  • saveVelocityModel() – save earth model currently in memory to file.
  • getHeadwaveDistanceKm() – Retrieve horizontal distance traveled by the ray below the headwave interface, in km.
  • getHeadwaveDistance() – Retrieve angular distance traveled by the ray below the headwave interface.
  • getSourceDistance() – returns horizontal offset below the source.
  • getReceiverDistance() – returns horizontal offset below the receiver.
  • getWeightsSource() – Retrieve the node IDs and the interpolation coefficients for the source CrustalProfile.
  • getWeightsReceiver() – Retrieve the node IDs and the interpolation coefficients for the receiver CrustalProfile.

Fixed many issues with the Fortran interface.

Updated all of the html documentation files.

Added a mode of operation to SLBM_test_Java wherein two parameters are specified on the command line. The first is interpreted as the name of the file containing the earth model and the second is interpreted to be the name of a file containing a bunch of source and receiver locations. SLBM_test_Java will compute the total travel time and spew the results to standard out. The input file should contain the following information on each record, separated by spaces:

  • phase – one of the following strings: Pn, Sn, Pg or Lg
  • sourceLat – source latitude in degrees.
  • sourceLon – source longitude in degrees.
  • sourceDepth – source depth in km.
  • receiverLat – receiver latitude in degrees.
  • receiverLon – receiver longitude in degrees.
  • receiverDepth – receiver depth (negative elevation) in km.


Changed the model input file (unified_SLBM.txt) in two ways: (a) the constraint that gradients cannot be negative has been removed from the model input file and is now being imposed in the code. There can now be substantial negative gradients in the input file. (b) There are now 9 layers in the model where there were previously only 8. The 9 layers are:


The change is that there are now two versions of the MIDDLE_CRUST. MIDDLE_CRUST_N is the same as the previous MIDDLE_CRUST. MIDDLE_CRUST_G is a new layer that has the same depth as MIDDLE_CRUST_N but with P wave velocity 6.2 km/sec and S wave velocity of 3.5 km/sec. There are if statements in the code that select MIDDLE_CRUST_N for phases Pn and Sn and select MIDDLE_CRUST_G for Pg and Lg.

Implemented the LANL modification to the Zhao method that calculates travel times for mantle events.


Fixed some bugs having to do with the valid range of the Pn travel time for mantle events.

Changed the algorithm for computing Pg/Lg travel times. Code now returns Pg/Lg travel times for events at any depth in the crust, even events below the top of the middle crust.

Added new SLBMInterface constructors that take an earth radius in km. When the constructors with no parameters are called, the radius of the earth is assumed to vary as a function of latitude, as described by a GRS80 ellipsoid. When the earth radius is specified in the SLBMInterface constructor, then earth radius is assumed constant at the specified value. Geographic latitudes are still converted to geocentric latitudes, using GRS80 ellipsoid.

Modified the IASPI91_SLBM.txt model file to have 9 layers instead of 8.


Modified the method where Pn/Sn travel times are computed for mantle events. Basically made the convergence behavior more robust and imposed a criterion that C * H < 0.2 where C is the Zhao C parameter and H is the depth of the ray turning point below the Moho.

Removed criterion that mantle gradients had to be >= 0 and replaced it with criterion that C and Cm have to be greater than 1e-6.

Added 5 accessor methods to SlbmInterface (in all 4 languages):

getZhaoParameter() returns several parameters computed during calculation of Pn/Sn travel times, including C, Cm, Vm, H and udSign (see documentation for definitions of these parameters).

getGridLatMin(), getGridLatMax(), getGridLonMin() and getGridLonMax() return the valid range of the Earth model loaded with the loadVelocityModel() call.

Fixed a very subtle bug in QueryProfile. It used to be that interpolation was done on the basis of depth of surrounding grid nodes. Changed so that interpolation is done on the basis of radius, which makes a small difference when the GRS80 ellipsoid is used and Earth radius depends on latitude.


Fixed a bug in the part of the code that computes Pn/Sn travel times for mantle events. The bug caused the code to hang for events just below the Moho and close to the receiver. The test events seemed to return very similar travel times for very small differences in ray parameter. The bug was fixed by simply adding a counter that caused the loop to quit after a specified number of iterations.

Removed a spurious debug print statement that was inadvertently left in the Fortran shell interface.

Added tests for ellipticity corrections and elevation corrections. The results of these tests had been distributed previously, but are now part of the official release.

Version 2.0.0 Beta – 2007/6/25

Changed the grid from the deformed grid to the global tessellated grid.

Added method getVersion() to all the interfaces.

Added the following methods to SlbmInterface to support regularization for tomography applications. See html documentation for more information:

  •  void getNodeNeighbors(const int& nid, int neighbors[], int& nNeighbors)
  •  void getNodeNeighbors(const int& nid, vector& neighbors)
  •  void getNodeNeighborInfo(const int& nid, int neighbors[], double distance[], double azimuth[], int& nNeighbors)
  •  void getNodeSeparation(const int& node1, const int& node2, double& distance)
  •  void getNodeAzimuth(const int& node1, const int& node2, double& azimuth)
  •  void initializeActiveNodes(const double& latmin, const double& lonmin, const double& latmax, const double& lonmax);
  •  void nextActiveNode(int& nodeId)
  •  void getNodeHitCount(const int& nodeId, int& hitCount)

Version 2.2.0 Beta – 2007/8/14

Converted the model files from ascii to binary format. The binary format is the one specified by AFTAC/QTSI. This change has resulted in a dramatic reduction in the time required to load the velocity models into memory.

The ascii format is still supported but support for ascii will be removed in the next release.

Added setters and getters for CHMax and average mantle velocities. Added getTessId() to retrieve tesselation ID of the model in memory. Refer to HTML documentation for further details.


Modified PGL TauP and SLBM code to utilize identical object definitions. This included: a) modifications to SLBM to wrap all of its objects into the single namespace “SLBM”; b) modifications to PGL/SLBM to wrap all TauP objects into a new namespace “taup”; c) modifications to PGL/SLBM to wrap all utility objects used by both applications into a new namespace “util”; d) renaming of the SLBM BaseObject.h include file in SLBM to BaseGlobals.h; e) splitting of the BaseGlobals.h class into a non-namespaced basic definition which keeps the BaseGlobals name and a new SLBMGlobals.h file containing the specific definitions required by SLBM; f) the renaming of the PGL StandardDefines.h file to PGLGlobals.h; g) the removal of base definitions from PGLGlobals.h and the inclusion of BaseGlobals.h in PGL; h) a new TauPGlobals.h file used by the “taup” namespace; i) and a new UtilGlobals.h used by the “util” namespace.

Each specific XXGlobal.h file contains a windows definition for the DLL import/export tag along with any specific defintions (beyond BaseGlobals.h) required by the namespace.

The “taup” namespace now includes the objects TPVelocityModels, TauPSiteFunctionals, TauPSite, and TauPModel (used by PGL only). The “util” namespace now includes MD50, Brents, and IntegrateFunction objects. Once the DataBuffer object in PGL is split into a new DataBufferDB object and the base functionality included in the SLBM DataBuffer object, then the low level DataBuffer object will also become part of the “util” namespace.


Fixed the constructor in GreatCircle_Xg.cc during the TauPSite initialization to set the TauPSite planet radius before setting the receiver depth.