An operator object is a function that
accepts an input vector and
returns an output vector when its `Image()` function is invoked.
An operator knows about its domain and range, which are vector space objects.
Similar to vectors, complex operators can be built from simple ones.
The *Compound Operator* combines two operators so that the output of the
first operator is the input to the second.
Furthermore,
the *Block Operator* arranges operators into operator matrices.
For example, a Bock Operator organizes four operators
into an operator matrix

In many cases, the programmer
may be able to enhance the operator to compute additional information,
such as the adjoint or the derivative of the operator.
Since some solvers require such additional information, HCL
standardizes the invocations for these additional functions by
including additional derived operator classes,
such as a *linear operator* class,
or a *linear operator with adjoint* class.

A classic seismic example of an operator is the NMO process
and its adjoint:
The NMO operator is linear, and it is
fairly easy to implement its adjoint operator.
An NMO input vector is a CMP gather.
A CMP gather's two axes are offset, *h*,
and two-way traveltime, *t*.
The midpoint coordinates
of the CMP gather, and the description of the axes
are part of the CMP vector space object.
The operator's output vector is a stacked trace.
Its axis
samples time, .The NMO operator is best defined by its adjoint.
The adjoint of the NMO operator spreads an impulse in the stacked trace
along a hyperbola in the CMP gather.

11/11/1997