mirror of
https://bitbucket.org/cosmicvoids/vide_public.git
synced 2025-07-05 07:41:11 +00:00
328 lines
6.9 KiB
C
328 lines
6.9 KiB
C
/*
|
|
* Copyright 1991 Michael S. Warren and John K. Salmon. All Rights Reserved.
|
|
*/
|
|
|
|
#ifndef NDIM
|
|
# error NDIM must be defined before reading this file.
|
|
#endif
|
|
|
|
#if (NDIM!=3) && (NDIM!=2)
|
|
#error NDIM must be either 2 or 3
|
|
#endif
|
|
|
|
#ifdef __STDC__
|
|
#define GLUE(a,b) a##b
|
|
#else
|
|
#define GLUE(a,b) a/**/b
|
|
#endif
|
|
|
|
/* UGLY, but you can use these for parentheses inside the VV macros! */
|
|
#define LPAREN (
|
|
#define RPAREN )
|
|
#define COMMA ,
|
|
#define Dot(a, b) (VVinfix(a, *b, +))
|
|
|
|
#if (NDIM==3)
|
|
|
|
#define Sinfix(s, op) s op s op s
|
|
#define Vinfix(a, op) a[0] op a[1] op a[2]
|
|
#define VVinfix(a, b, op) a[0] b[0] op a[1] b[1] op a[2] b[2]
|
|
/* Usage: printf(Sinfix("%g", " "), Vinfix(pos, COMMA)) */
|
|
|
|
#define VS(a, b) do { \
|
|
a[0] b; \
|
|
a[1] b; \
|
|
a[2] b; \
|
|
} while(0)
|
|
|
|
#define VV(a, b) do { \
|
|
a[0] b[0]; \
|
|
a[1] b[1]; \
|
|
a[2] b[2]; \
|
|
} while(0)
|
|
|
|
#define VVS(a, b, s) do { \
|
|
a[0] b[0] s; \
|
|
a[1] b[1] s; \
|
|
a[2] b[2] s; \
|
|
} while(0)
|
|
|
|
#define VVV(a, b, c) do { \
|
|
a[0] b[0] c[0]; \
|
|
a[1] b[1] c[1]; \
|
|
a[2] b[2] c[2]; \
|
|
} while(0)
|
|
|
|
#define VVVV(a, b, c, d) do { \
|
|
a[0] b[0] c[0] d[0]; \
|
|
a[1] b[1] c[1] d[1]; \
|
|
a[2] b[2] c[2] d[2]; \
|
|
} while(0)
|
|
|
|
|
|
#define VVVS(a, b, c, s) do { \
|
|
a[0] b[0] c[0] s; \
|
|
a[1] b[1] c[1] s; \
|
|
a[2] b[2] c[2] s; \
|
|
} while(0)
|
|
|
|
#define VVVVS(a, b, c, d, s) do { \
|
|
a[0] b[0] c[0] d[0] s; \
|
|
a[1] b[1] c[1] d[1] s; \
|
|
a[2] b[2] c[2] d[2] s; \
|
|
} while(0)
|
|
|
|
|
|
#define VVVVV(a, b, c, d, e) do { \
|
|
a[0] b[0] c[0] d[0] e[0]; \
|
|
a[1] b[1] c[1] d[1] e[1]; \
|
|
a[2] b[2] c[2] d[2] e[2]; \
|
|
} while(0)
|
|
|
|
#define VVVVVS(a, b, c, d, e, s) do { \
|
|
a[0] b[0] c[0] d[0] e[0] s; \
|
|
a[1] b[1] c[1] d[1] e[1] s; \
|
|
a[2] b[2] c[2] d[2] e[2] s; \
|
|
} while(0)
|
|
|
|
#define VVVVVV(a, b, c, d, e, f) do { \
|
|
a[0] b[0] c[0] d[0] e[0] f[0]; \
|
|
a[1] b[1] c[1] d[1] e[1] f[1]; \
|
|
a[2] b[2] c[2] d[2] e[2] f[2]; \
|
|
} while(0)
|
|
|
|
/* Eleven args! */
|
|
#define Velv(a, b, c, d, e, f, g, h, i, j, k) do { \
|
|
a[0] b[0] c[0] d[0] e[0] f[0] g[0] h[0] i[0] j[0] k[0]; \
|
|
a[1] b[1] c[1] d[1] e[1] f[1] g[1] h[1] i[1] j[1] k[1]; \
|
|
a[2] b[2] c[2] d[2] e[2] f[2] g[2] h[2] i[2] j[2] k[2]; \
|
|
} while(0)
|
|
|
|
/* And a couple of matrix operations to support gsw. */
|
|
#define MS(a, b) do { \
|
|
a[0][0] b; \
|
|
a[0][1] b; \
|
|
a[0][2] b; \
|
|
a[1][0] b; \
|
|
a[1][1] b; \
|
|
a[1][2] b; \
|
|
a[2][0] b; \
|
|
a[2][1] b; \
|
|
a[2][2] b; \
|
|
} while(0)
|
|
|
|
#define MVV(a, b, c) do { \
|
|
a[0][0] b[0] c[0]; \
|
|
a[0][1] b[0] c[1]; \
|
|
a[0][2] b[0] c[2]; \
|
|
a[1][0] b[1] c[0]; \
|
|
a[1][1] b[1] c[1]; \
|
|
a[1][2] b[1] c[2]; \
|
|
a[2][0] b[2] c[0]; \
|
|
a[2][1] b[2] c[1]; \
|
|
a[2][2] b[2] c[2]; \
|
|
} while(0)
|
|
|
|
#define Vdecl(type, v) type v[NDIM]
|
|
|
|
#define Dotx(a, b) \
|
|
(GLUE(a,0)*GLUE(b,0) + GLUE(a,1)*GLUE(b,1) + GLUE(a,2)*GLUE(b,2))
|
|
|
|
/* Use for declarations */
|
|
#define Vxd(a) \
|
|
GLUE(a,0); \
|
|
GLUE(a,1); \
|
|
GLUE(a,2)
|
|
|
|
/* Use in prototypes */
|
|
#define Vxp(a) \
|
|
GLUE(a,0), \
|
|
GLUE(a,1), \
|
|
GLUE(a,2)
|
|
|
|
#define VxS(a, b) do { \
|
|
GLUE(a,0) b; \
|
|
GLUE(a,1) b; \
|
|
GLUE(a,2) b; \
|
|
} while(0)
|
|
|
|
#define VxV(a, b) do { \
|
|
GLUE(a,0) b[0]; \
|
|
GLUE(a,1) b[1]; \
|
|
GLUE(a,2) b[2]; \
|
|
} while(0)
|
|
|
|
#define VxdV(a, b) \
|
|
GLUE(a,0) b[0]; \
|
|
GLUE(a,1) b[1]; \
|
|
GLUE(a,2) b[2]
|
|
|
|
#define VVx(a, b) do { \
|
|
a[0] GLUE(b,0); \
|
|
a[1] GLUE(b,1); \
|
|
a[2] GLUE(b,2); \
|
|
} while(0)
|
|
|
|
#define VxVx(a, b) do { \
|
|
GLUE(a,0) GLUE(b,0); \
|
|
GLUE(a,1) GLUE(b,1); \
|
|
GLUE(a,2) GLUE(b,2); \
|
|
} while(0)
|
|
|
|
|
|
#define VxVV(a, b, c) do { \
|
|
GLUE(a,0) b[0] c[0]; \
|
|
GLUE(a,1) b[1] c[1]; \
|
|
GLUE(a,2) b[2] c[2]; \
|
|
} while(0)
|
|
|
|
#define VxVVS(a, b, c, s) do { \
|
|
GLUE(a,0) b[0] c[0] s; \
|
|
GLUE(a,1) b[1] c[1] s; \
|
|
GLUE(a,2) b[2] c[2] s; \
|
|
} while(0)
|
|
|
|
#define VxVVx(a, b, c) do { \
|
|
GLUE(a,0) b[0] GLUE(c,0); \
|
|
GLUE(a,1) b[1] GLUE(c,1); \
|
|
GLUE(a,2) b[2] GLUE(c,2); \
|
|
} while(0)
|
|
|
|
#define VxVxV(a, b, c) do { \
|
|
GLUE(a,0) GLUE(b,0) c[0]; \
|
|
GLUE(a,1) GLUE(b,1) c[1]; \
|
|
GLUE(a,2) GLUE(b,2) c[2]; \
|
|
} while(0)
|
|
|
|
#define VxVxVx(a, b, c) do { \
|
|
GLUE(a,0) GLUE(b,0) GLUE(c,0); \
|
|
GLUE(a,1) GLUE(b,1) GLUE(c,1); \
|
|
GLUE(a,2) GLUE(b,2) GLUE(c,2); \
|
|
} while(0)
|
|
|
|
#define VVxVx(a, b, c) do{ \
|
|
a[0] GLUE(b,0) GLUE(c,0); \
|
|
a[1] GLUE(b,1) GLUE(c,1); \
|
|
a[2] GLUE(b,2) GLUE(c,2); \
|
|
} while(0)
|
|
|
|
#endif /* NDIM == 3 */
|
|
|
|
#if (NDIM==2)
|
|
|
|
#define Sinfix(s, op) s op s
|
|
#define Vinfix(a, op) a[0] op a[1]
|
|
#define VVinfix(a, b, op) a[0] b[0] op a[1] b[1]
|
|
/* Usage: printf(Sinfix("%g", " "), Vinfix(pos, COMMA)) */
|
|
|
|
#define VS(a, b) do { \
|
|
a[0] b; \
|
|
a[1] b; \
|
|
} while(0)
|
|
|
|
#define VV(a, b) do { \
|
|
a[0] b[0]; \
|
|
a[1] b[1]; \
|
|
} while(0)
|
|
|
|
#define VVS(a, b, s) do { \
|
|
a[0] b[0] s; \
|
|
a[1] b[1] s; \
|
|
a[2] b[2] s; \
|
|
} while(0)
|
|
|
|
#define VVV(a, b, c) do { \
|
|
a[0] b[0] c[0]; \
|
|
a[1] b[1] c[1]; \
|
|
} while(0)
|
|
|
|
#define VVVS(a, b, c, s) do { \
|
|
a[0] b[0] c[0] s; \
|
|
a[1] b[1] c[1] s; \
|
|
} while(0)
|
|
|
|
#define VVVVS(a, b, c, d, s) do { \
|
|
a[0] b[0] c[0] d[0] s; \
|
|
a[1] b[1] c[1] d[1] s; \
|
|
} while(0)
|
|
|
|
#define VVVV(a, b, c, d) do { \
|
|
a[0] b[0] c[0] d[0]; \
|
|
a[1] b[1] c[1] d[1]; \
|
|
} while(0)
|
|
|
|
#define VVVVV(a, b, c, d, e) do { \
|
|
a[0] b[0] c[0] d[0] e[0]; \
|
|
a[1] b[1] c[1] d[1] e[1]; \
|
|
} while(0)
|
|
|
|
#define Vdecl(type, v) type v[NDIM]
|
|
|
|
#define Dotx(a, b) \
|
|
(GLUE(a,0)*GLUE(b,0) + GLUE(a,1)*GLUE(b,1))
|
|
|
|
#define Vxd(a) \
|
|
GLUE(a,0); \
|
|
GLUE(a,1)
|
|
|
|
#define VxS(a, b) do { \
|
|
GLUE(a,0) b; \
|
|
GLUE(a,1) b; \
|
|
} while(0)
|
|
|
|
#define VxV(a, b) do { \
|
|
GLUE(a,0) b[0]; \
|
|
GLUE(a,1) b[1]; \
|
|
} while(0)
|
|
|
|
#define VxdV(a, b) \
|
|
GLUE(a,0) b[0]; \
|
|
GLUE(a,1) b[1]
|
|
|
|
#define VVx(a, b) do { \
|
|
a[0] GLUE(b,0); \
|
|
a[1] GLUE(b,1); \
|
|
} while(0)
|
|
|
|
#define VxVx(a, b) do { \
|
|
GLUE(a,0) GLUE(b,0); \
|
|
GLUE(a,1) GLUE(b,1); \
|
|
} while(0)
|
|
|
|
|
|
#define VxVV(a, b, c) do { \
|
|
GLUE(a,0) b[0] c[0]; \
|
|
GLUE(a,1) b[1] c[1]; \
|
|
} while(0)
|
|
|
|
#define VxVVS(a, b, c, s) do { \
|
|
GLUE(a,0) b[0] c[0] s; \
|
|
GLUE(a,1) b[1] c[1] s; \
|
|
} while(0)
|
|
|
|
#define VxVVx(a, b, c) do { \
|
|
GLUE(a,0) b[0] GLUE(c,0); \
|
|
GLUE(a,1) b[1] GLUE(c,1); \
|
|
} while(0)
|
|
|
|
#define VxVVS(a, b, c, s) do { \
|
|
GLUE(a,0) b[0] c[0] s; \
|
|
GLUE(a,1) b[1] c[1] s; \
|
|
} while(0)
|
|
|
|
#define VVxVx(a, b, c) do{ \
|
|
a[0] GLUE(b,0) GLUE(c,0); \
|
|
a[1] GLUE(b,1) GLUE(c,1); \
|
|
} while(0)
|
|
|
|
#define VxVxV(a, b, c) do { \
|
|
GLUE(a,0) GLUE(b,0) c[0]; \
|
|
GLUE(a,1) GLUE(b,1) c[1]; \
|
|
} while(0)
|
|
|
|
#define VxVxVx(a, b, c) do { \
|
|
GLUE(a,0) GLUE(b,0) GLUE(c,0); \
|
|
GLUE(a,1) GLUE(b,1) GLUE(c,1); \
|
|
} while(0)
|
|
|
|
#endif /* NDIM == 2 */
|