Jon Claerbout's books Processing versus Inversion 1992b and Three-dimensional Filtering 1994 list normal moveout (NMO) among the basic linear operators. Indeed, the NMO transformation plays a kernel role in many applications of geophysical data processing, from simple CMP stacking to prestack migration and velocity analysis. The importance of this role increases with the development of 3-D processing tools, since the so-called Kirchhoff method, based essentially on the NMO transformation, proved to be successful for irregular 3-D acquisition geometries.
In the most general terms, one can describe the NMO transform as a mapping, controlled by the traveltime transformation function and the assigned amplitude function. In the most common application, the traveltime function is a hyperbola. In other application, it may take the form of a linear function (slant stack), ellipsoid (DMO), etc. It can even be the result of an expensive ray tracing computation, as in the case of depth migration.
Because NMO is an operator central to many widely-varied processing and inversion schemes, and has a large space of implementation details which may affect its performance in an application-dependent manner, we seek to design a moveout operator (and more generally, a family of operators) which is easily adaptable to a particular research application. We use Fortran 90's modularity to separate such implementation details as input-orientation vs. output orientation and nearest neighbor interpolation vs. linear interpolation, from the definition of the normal moveout mapping. Coding in object-oriented style brings us reusable code: many different applications can be generated from a single source. It means that improving one part of the implementation (traveltime computation, amplitude computation, etc.) doesn't require rewriting the major library routines, and that one can easily compare different implementations with each other. Object-orientation also facilitates a cooperative code sharing among researchers. In this paper, we explain and illustrate these ideas with Fortran 90 programs.
We start with defining the relationship between the NMO transformation and the interpolation problem. We show how this relationship is affected by the choice of the ``pull'' or ``push'' implementation, and carry out generic NMO as a trace-by-trace transformation. Finally, we assemble a program for operations on irregular geometries defined by the Seplib90 data structure. The program is illustrated with a simple example.