Craig's Free, Open Source Software


I distribute several software packages: GEMMW, SMMP, Madpack, and MpiMG. They are stored in a format known as gzipped tar format. A discussion of how to unpack them is in this hyperlink. This format is quite common on UNIX systems, but less common on Windows systems.

All of these packages are free to use as long as the authors are given credit for them. If you use any of them in a for profit package, please contact me first.


GEMMW is a Winograd variant of Strassen's fast matrix-matrix multiplication algorithm. It is written in C, uses a minimum amount of extra storage (which can be allocated dynamically or passed to the program), and uses a minimal number of program steps. It uses tricks not found in commercial competitors (IBM and Cray primarily). These tricks are described in detail in the paper,

This is joint work with the other authors listed above. It is available as gemmw.tgz.


Madpack stands for Multilevel, Aggregation, Disaggregation Package. Version 1 was released in May, 1986. It superceded a long line of multigrid solvers (KLEV) that I distributed from 1978 to 1986. Versions 2, 4, and 5 of Madpack are described in the paper,

Version 2 comes in 3 flavors: all C, almost all Fortran-77, and almost all Ratfor (which translates into Fortran-77). This is a very small package, with sparse matrix iterative and direct solvers. It assumes that everything can be described in terms of matrix operations, including interpolation between solution spaces. Version 2 is a small, easy to learn package that can solve problems conveniently in 1-3 dimensions.

Version 5 is a mixture of C and Fortran+m4 (m4 is a preprocessor that comes with most UNIX systems and there is a GNU m4 that works on everything). This is an object oriented multilevel package. The entire data structure needed by the abstract multilevel solvers is built for the user transparently. Memory is dynamically allocated and freed in an efficient manner. Serial and parallel computers can be used. Matrix free operations are supported. Version 5 requires a small learning curve. Once mastered, it can solve problems conveniently in 1-3 dimensions.


MpiMG is a parallel multigrid package for solving elliptic boundary value problems in 2 and 3 dimensions. Constant and variable coefficient codes are included. Domain decomposition techniques are used liberally. Parallel iterative solvers for Gauss-Seidel, ADI, and ADG are provided. ADG is a novel ADI-like method which does not require a transpose or more than 1 communication between processors in m iterations, where m is small (m is bigger than would be used normally in a multigrid code). Communication between processors uses MPI. MpiMG is written in Fortran+m4 (m4 is a preprocessor that comes with most UNIX systems and there is a GNU m4 that works on everything).

This is joint work with Sachit Malhotra. It is available as mpimg.tgz.


Parlib is an interface to parallel communications libraries like MPI.

This is joint work with Derrick Cerwinsky and grew out of classes at the University of Wyoming and mini-courses at the King Abdullah University of Science & Technology (KAUST). It is available as either parlib.tgz or Documentation is in parlib.doc.


SMMP is a sparse matrix-sparse matrix multiplication code. It symbolically determines the product matrix' sparsity pattern, then numerically does the calculation. It is written in Fortran. This package is described in detail in the paper,

This is joint work with Randy Bank. It is available as smmp.tgz.

Craig C. Douglas

Last modified: