The vectmath.h macro package
provides a set of macros to handle
some elementary operations on two, three or general dimensional
vectors and matrices. The dimension
can be picked by providing the
package with a value for the preprocessor macro NDIM. If this is
not supplied, the presence of macros TWODIM and THREEDIM will
be checked, in which case NDIM is set to 2 or 3 respectively.
The default of NDIM
when all of the above are absent,
is 3. Of course, the macro NDIM must be provided before
vectmath.h is included to have any effect.
Resetting the value of NDIM after that,
if your compiler would allow it anyhow without an explicit #undef,
may produce unpredictable results.
There are also a few of the macro's which can be used as a regular C function, returning a real value, e.g. absv() for the length of a vector.
Operations such as SETV (copying a vector) are properly defined for every dimension, but CROSSVP (a vector cross product) has a different meaning in 2 and 3 dimensions, and is absent in higher dimensions.
It should be noted that the matrices used here are true C matrices, a pointer to an array of pointers (to 1D arrays), unlike FORTRAN arrays, which only occupy a solid 2D block of memory. C arrays take slightly more memory. For an example how to make C arrays and FORTRAN arrays work closely together see e.g. Numerical Recipes in C by Press et al. (MIT Press, 1988).
In the following example a 4 dimensional vector is cleared:
#define NDIM 4 #include <vectmath.h> nemo_main() { vector a; /* same as: double a[4] */ CLRV(a); }
some more examples here - taken from some snap code