# CWEB programs

In this section a set of the CWEB programs I have written over the years can be found. CWEB is a dialect of literate programming which I find very convenient for the writing of my more complex programs, as it allows me to write a neatly documented record of the algorithms in plain TeX meanwhile also implementing them using my favourite programming language, ANSI-C. Unless you are already familiar with the concept of literate programming, you may benefit from reading the introduction first.

### Estimating the fractal (Hausdorff) dimension of curves in the plane

The BoxCount computer program
calculates box-counting estimates of the fractal dimension of curves in
the two-dimensional plane. In the box-counting estimate to the fractal
dimension of a curve in the domain
{*x*, *y* :
*x*_{min} ≤ *x* ≤ *x*_{max}, *y*_{min} ≤ *y* ≤ *y*_{max}},
a grid of squares, each of horizontal dimension
(*x*_{max} - *x*_{min}) / 2^{m}
and vertical dimension
(*y*_{max} - *y*_{min}) / 2^{m},
is superimposed onto the graph for integer numbers *m*.
By counting the total number of such squares *N*_{m}
needed to cover the entire graph at a given *m* (hence the term
»box counting»), an estimate *D*_{m} to the
fractal dimension *D* (or *Hausdorff dimension*) is obtained as
*D*_{m} = ln(*N*_{m})/ln(2^{m}).
This procedure may be repeated many times, with
*D*_{m} → *D* as
*m*→∞ for real fractal sets. However, for finite-depth
fractals (as generated by a computer), some limit on *m* is necessary
in order to prevent trivial convergence towards
*D*_{m} → 1.
In addition to mere numerical calculation, the
BoxCount program also generates graphs
of the box distributions, in form of
MetaPost
code which can be post-processed by other programs.

### Simulating the electrodynamics of nonlinear magneto-optical Bragg gratings

The MagBragg computer program
calculates reflection and transmission spectra of nonlinear magneto-optical
Bragg gratings, in a stratified geometry where the material parameters vary
only in one Cartesian coordinate.
The MagBragg program also
simulates the propagation of the electromagnetic field of an optical wave
as it traverses a magneto-optical Bragg grating, giving the intra-grating
spatial distribution of the optical fields in linear as well as nonlinear
optical regimes.
The MagBragg program forms the core behind the semi-analytical algorithm
that in 2006 was published in
Phys. Rev. Lett. **96**,
063902 (2006).
The MagBragg program is written in
CWEB.

### Simulating the Wiener process in *D* dimensions.

The WIENER program computes a series
of floating-point numbers corresponding to a
Wiener process
in *D* dimensions.
The program relies on the random number generator as proposed by Donald Knuth
in *The Art
of Computer Programming,* Volume 1 – Fundamental Algorithms,
(Addison-Wesley, Boston, 1998), generating numbers which are fed
into the
Box–Muller transform to generate the normal distribution
associated with the Wiener process.
Besides providing a simulator of the Wiener process, the WIENER program
can also be used in a "lock-in" mode with zero expectation value for each
data point, providing a pretty good random number generator for large series
of stochastic data, not relying on the (rather poor) generators available in
standard C libraries.
The WIENER program does not solve any problem *per se*, but is merely
to be considered as a generator of statistical data to be used by other
applications in modeling of physical, chemical or financial processes.

### The Savitzky-Golay smoothing filter

The SGFilter computer program provides a stand-alone implementation of the Savitzky-Golay smoothing filter. This filter was originally proposed in 1964 by Abraham Savitzky and Marcel Golay as an algorithm of recovering feature characteristics from noisy spectra, overcoming the drawbacks of simpler noise-reduction techniques such as running averages. The work-around presented by Savitzky and Golay for avoiding distortion of peaks or features in their spectral data is essentially based on the idea to perform a linear regression of some polynomial individually for each sample, followed by the evaluation of that polynomial exactly at the very position of the sample. While this may seem a plausible idea, the actual task of performing a separate regression for each point easily becomes a very time-consuming task. However (and this is the key point in the Savitzky-Golay algorithm), the coefficients involved in the actual regression may be computed once and for all in an early stage, followed by performing a convolution of the discretely sampled input data with the coefficient vector.

### Creating Encapsulated PostScript (EPS) images of arrayed data

Given a matrix of floating-point numbers stored in a regular ASCII text file,
the EpsImg program creates a
grey-scale Encapsulated PostScript (EPS) image of the matrix using its
elements as specification of the brightness of the corresponding pixels
in the image.
Of course, there are other ways of generating Encapsulated PostScript images
of sampled of simulated data, as for example using the `image()`
function of MATLAB. However, an advantage with using a stand-alone program
is that it is easily incorporated in scripts for batch processing.
In addition, the EpsImg program is provided free of charge.
The EpsImg
program is written in the CWEB programming language; however, as it is
targeted towards generation of Encapsulated PostScript, the main entry for
this program is under the PostScript
programs section.

### Generating TeX source code for the typesetting of labels for digital video tapes

The DvLabel computer program
generates plain TeX source code for
typesetting of labels for digital video tapes (DV format, typically used
for hand-held video camera recorders).
The DvLabel program is primarily
designed to run in interactive mode, but via command-line supplied
parameters it also supports batch-mode operation.
I got the idea of creating this program from the
`audio-tape.ps`
PostScript code by Jamie Zawinski.
The `audio-tape.ps` code is a splendid example of how one can
write a simple PostScript program with the help of a regular ASCII editor,
and by sending the PostScript program to the printer one gets a neat
printout to be used for tape cassette labels, DAT, or video tapes.
However, whenever one has a new cassette to be labeled, one has to edit
the PostScript source, and for a rookie on PostScript programming this
task is for sure somewhat inconvenient. (Believe me.)
The DvLabel program is written
in CWEB.