Merge branch 'leadoff'
[physik/posic.git] / math / math.h
1 /*
2  * math.h - basic vector calculations
3  *
4  * author: Frank Zirkelbach <frank.zirkelbach@physik.uni-augsburg.de>
5  *
6  */
7
8 #ifndef MATH_H
9 #define MATH_H
10
11 #include <string.h>
12 #include <math.h>
13
14 /* datatypes */
15
16 typedef struct s_3dvec {
17         double x;
18         double y;
19         double z;
20 } t_3dvec;
21
22 /* function prototypes */
23
24 static inline int v3_add(t_3dvec *sum,t_3dvec *a,t_3dvec *b) __attribute__((always_inline));
25 static inline int v3_sub(t_3dvec *sum,t_3dvec *a,t_3dvec *b) __attribute__((always_inline));
26 static inline int v3_scale(t_3dvec *result,t_3dvec *a,double s) __attribute__((always_inline));
27 static inline int v3_zero(t_3dvec *vec) __attribute__((always_inline));
28 static inline int v3_set(t_3dvec *vec,double *ptr) __attribute__((always_inline));
29 static inline int v3_copy(t_3dvec *trg,t_3dvec *src) __attribute__((always_inline));
30 static inline int v3_cmp(t_3dvec *a,t_3dvec *b) __attribute__((always_inline));
31 static inline double v3_scalar_product(t_3dvec *a,t_3dvec *b) __attribute__((always_inline));
32 static inline double v3_absolute_square(t_3dvec *a) __attribute__((always_inline));
33 static inline double v3_norm(t_3dvec *a) __attribute__((always_inline));
34 static inline int v3_per_bound(t_3dvec *a,t_3dvec *dim) __attribute__((always_inline));
35
36 /* function definitions */
37
38 static inline int v3_add(t_3dvec *sum,t_3dvec *a,t_3dvec *b) {
39
40         sum->x=a->x+b->x;
41         sum->y=a->y+b->y;
42         sum->z=a->z+b->z;
43
44         return 0;
45 }
46
47 static inline int v3_sub(t_3dvec *sum,t_3dvec *a,t_3dvec *b) {
48
49         sum->x=a->x-b->x;
50         sum->y=a->y-b->y;
51         sum->z=a->z-b->z;
52
53         return 0;
54 }
55
56 static inline int v3_scale(t_3dvec *result,t_3dvec *a,double s) {
57
58         result->x=s*a->x;
59         result->y=s*a->y;
60         result->z=s*a->z;
61
62         return 0;
63 }
64
65 static inline int v3_zero(t_3dvec *vec) {
66
67         vec->x=.0;
68         vec->y=.0;
69         vec->z=.0;
70
71         return 0;
72 }
73
74 static inline int v3_set(t_3dvec *vec,double *ptr) {
75
76         memcpy(vec,ptr,sizeof(t_3dvec));
77
78         return 0;
79 }
80
81 static inline int v3_copy(t_3dvec *trg,t_3dvec *src) {
82
83         //memcpy(trg,src,sizeof(t_3dvec));
84
85         /* faster this way? */
86         trg->x=src->x;
87         trg->y=src->y;
88         trg->z=src->z;
89
90         return 0;
91 }
92
93 static inline int v3_cmp(t_3dvec *a,t_3dvec *b) {
94
95         return(memcmp(a,b,sizeof(t_3dvec)));
96 }
97
98 static inline double v3_scalar_product(t_3dvec *a,t_3dvec *b) {
99
100         return(a->x*b->x+a->y*b->y+a->z*b->z);
101 }
102
103 static double v3_absolute_square(t_3dvec *a) {
104
105         return(a->x*a->x+a->y*a->y+a->z*a->z);
106 }
107
108 static inline double v3_norm(t_3dvec *a) {
109
110         return(sqrt(a->x*a->x+a->y*a->y+a->z*a->z));
111 }
112
113 static inline int v3_per_bound(t_3dvec *a,t_3dvec *dim) {
114
115         double x,y,z;
116
117         x=0.5*dim->x;
118         y=0.5*dim->y;
119         z=0.5*dim->z;
120
121         if(a->x>=x) a->x-=dim->x;
122         else if(-a->x>x) a->x+=dim->x;
123         if(a->y>=y) a->y-=dim->y;
124         else if(-a->y>y) a->y+=dim->y;
125         if(a->z>=z) a->z-=dim->z;
126         else if(-a->z>z) a->z+=dim->z;
127
128         return 0;
129 }
130
131 #endif