chiark / gitweb /
actually do precomputations!
[moebius2.git] / common.c
1 /*
2  * Generally useful stuff.
3  */
4
5 #include "common.h"
6
7 double magnD(const double pq[D3]) {
8   return sqrt(magnD2(pq));
9 }
10
11 double magnD2(const double pq[D3]) {
12   int k;
13   double d2= 0;
14   
15   K d2= ffsqa(pq[k], d2);
16   return d2;
17 }
18
19 double hypotD(const double p[D3], const double q[D3]) {
20   int k;
21   double pq[D3];
22
23   K pq[k]= p[k] - q[k];
24   return magnD(pq);
25 }
26
27 double hypotD2(const double p[D3], const double q[D3]) {
28   int k;
29   double d2= 0;
30   
31   K d2= ffsqa(p[k] - q[k], d2);
32   return d2;
33 }
34
35 double hypotD2plus(const double p[D3], const double q[D3], double d2) {
36   int k;
37   K d2= ffsqa(p[k] - q[k], d2);
38   return d2;
39 }
40
41 void xprod(double r[D3], const double a[D3], const double b[D3]) {
42   r[0]= a[1]*b[2] - a[2]*b[1];
43   r[1]= a[2]*b[0] - a[0]*b[2];
44   r[2]= a[0]*b[1] - a[1]*b[0];
45 }
46
47 void normalise(double v[D3], double one, double absepsilon) {
48   int k;
49   double multby= one/(magnD(v) + absepsilon);
50   K v[k] *= multby;
51 }
52
53 void xprod_norm(double r[D3], const double a[D3], const double b[D3],
54                 double one, double absepsilon) {
55   xprod(r,a,b);
56   normalise(r, absepsilon, one);
57 }
58
59 double dotprod(const double a[D3], const double b[D3]) {
60   int k;
61   double result= 0;
62   K result += a[k] * b[k];
63   return result;
64 }
65
66 void libdie(const char *lib, int l, const char *str) {
67   fprintf(stderr,"%s library call failed, line %d: %s\n", lib, l, str);
68 }
69
70 void gsldie(int l, const char *what, int status) {
71   fprintf(stderr,"gsl function failed, line %d: %s: %s\n",
72           l, what, gsl_strerror(status));
73   exit(-1);
74 }
75
76 void diee(const char *what) { perror(what); exit(16); }
77 void fail(const char *emsg) { fputs(emsg,stderr); exit(12); }
78 void flushoutput(void) { if (ferror(stdout)||fflush(stdout)) diee("stdout"); }