Software Development

C++ libraries:

My research is intimately linked with scientific computing.  As a result I've been involved in a great deal of software development over the years.  This page is aimed to direct you at web pages related to these developments.

Since 2002 most of my work has utilized the C++ language.  I am not an evangelist, but was unquestionably a convert to object oriented programming at that time as all my recent work has utilized object-oriented methods as I judged them appropriate.    Objects are not described well by conventional, linear documentations like Unix man pages, but are more readily documented with hypertext.  The following are hypertext documents of current elements of my C++ library.

C++ Seismic Processing Library (SEISPP)

 SEISPP  is my SEISmic C++ (PP) library.  It contains API definitions for an extensive list of seismology-oriented data objects.    Some ones worth highlighting are;   TimeSeries,   TimeSeriesEnsemble,   ThreeComponentSeismogram,  and   ThreeComponentEnsemble.   These define a general API for working with seismic data.  All make extensive use (through inheritance) of another, common concept in seismic process:  auxiliary data attributes commonly stored in fixed header fields.  Here I have generalized this concept to a object I call  Metadata.   This object provides methods to access an arbitrary, variable length set of header parameters.  These parameters can be loaded by different methods in constructors for each of the seismic data types.   The library is evolving with more specialized objects that do specific things to seismic data.  Two important recent developments are a generalized stacker defined the  Stack  object and the  MultichannelCorrelator object that generalizes the concept of cross-correlation of an ensemble of single-channel seismogram (TimeSeries objects held in a TimeSeriesEnsemble).

 The one-dimensional interpolator library (INTERPOLATOR1D)  is a procedural library of a collection one-dimensional interpolations routines.  It is intended to easily convert between regular and irregular grids.   There are overloaded functions to take care of different ways of storing vectors of the dependent and independent variables.  The core of this library was blatantly stolen from Igor Mirozov.

GCLgrid library

The  GCLgrid library is an object-oriented implementation of 2D and 3D georeferenced grids.  I use this library extensively in a plane wave migration code I plan to release when I believe it is stable and in the pmelgrid 3d location program.  It has a lot of other potential applications included a planned development for storing 3D travel time tables.  The concepts behind the algorithm are described in the following recent publication:

Fan, C., G. L. Pavlis, and K. Tuncay (2006).  GCLGRID:  A three-dimensional geographical curvilinear grid library for computational seismology,  Computers in Geosciences, 32, pp. 371-381.

The  dmatrix  library is a lightweight, simple object for working with dense matrices.  There are numerous comparable implementation of this on the web that could be used as alternatives, but I use this one extensively.  It is used, for example, to store data in the  ThreeComponentSeismogram  object as a 3 by Nsample matrix.

geocoords library

During development of some modeling codes for USArray and work on the STEEP project in Alaska I developed suite of general C++ objects for handling geographically referenced objects other beyond the grid objects that were the core of the GCLgrid library.   The documentation for these objects is admittedly incomplete but pages produced by Doxygen can be found here.   Some things you will find there are implementations for a masked GCLgrid object, general polygonal surfaces in 3D, some special C++ classes for plate motion models, and a C++ API to Crust1.0.  

multiwavelet library

In the 1990s Lorie Bear developed a series of processing methods based on the concept of multiwavelets.   I implemented pieces of her work and extended some of her ideas in some nasty C code I developed in the early 2000s.   Starting in late 2015 I realized that much of that old C code could be made more approachable through a C++ API.   The multiwavelet library is an attempt to do that.   One of the novel concepts in that library is the idea of a particle motion time series (PMTimeSeries).   The Doxygen pages for this library can be found here.

Application Program Manuals

I am developing some manuals for applications programs I have developed.  Here is the current list:

Antelope User Group:

Most of the above libraries are distributed through the Antelope User's Group as part of antelope's contrib area.  Most of the libraries above have dependencies because the implementations details make extensive use of their software libraries. Go to the git repository for antelope contrib to download the SEISPP and related software.   At that site you can browse the source code for the libraries described above