source: proiecte/NBody/Tree codes/vectmath.h @ 170

Last change on this file since 170 was 170, checked in by (none), 14 years ago
File size: 15.0 KB
Line 
1/****************************************************************************/
2/* VECTMATH.H: include file for vector/matrix operations.                   */
3/* Copyright (c) 1999 by Joshua E. Barnes, Tokyo, JAPAN.                    */
4/****************************************************************************/
5
6#ifndef _vectmath_h
7#define _vectmath_h
8
9#include "vectdefs.h"
10
11/*
12 * Vector operations.
13 */
14
15#define CLRV(v)                 /* CLeaR Vector */                      \
16{                                                                       \
17    int _i;                                                             \
18    for (_i = 0; _i < NDIM; _i++)                                       \
19        (v)[_i] = 0.0;                                                  \
20}
21
22#define UNITV(v,j)              /* UNIT Vector */                       \
23{                                                                       \
24    int _i;                                                             \
25    for (_i = 0; _i < NDIM; _i++)                                       \
26        (v)[_i] = (_i == (j) ? 1.0 : 0.0);                              \
27}
28
29#define SETV(v,u)               /* SET Vector */                        \
30{                                                                       \
31    int _i;                                                             \
32    for (_i = 0; _i < NDIM; _i++)                                       \
33        (v)[_i] = (u)[_i];                                              \
34}
35
36#if defined(THREEDIM)
37
38#define ADDV(v,u,w)             /* ADD Vector */                        \
39{                                                                       \
40    (v)[0] = (u)[0] + (w)[0];                                           \
41    (v)[1] = (u)[1] + (w)[1];                                           \
42    (v)[2] = (u)[2] + (w)[2];                                           \
43}
44
45#define SUBV(v,u,w)             /* SUBtract Vector */                   \
46{                                                                       \
47    (v)[0] = (u)[0] - (w)[0];                                           \
48    (v)[1] = (u)[1] - (w)[1];                                           \
49    (v)[2] = (u)[2] - (w)[2];                                           \
50}
51
52#define MULVS(v,u,s)            /* MULtiply Vector by Scalar */         \
53{                                                                       \
54    (v)[0] = (u)[0] * s;                                                \
55    (v)[1] = (u)[1] * s;                                                \
56    (v)[2] = (u)[2] * s;                                                \
57}
58
59#else
60
61#define ADDV(v,u,w)             /* ADD Vector */                        \
62{                                                                       \
63    int _i;                                                             \
64    for (_i = 0; _i < NDIM; _i++)                                       \
65        (v)[_i] = (u)[_i] + (w)[_i];                                    \
66}
67
68#define SUBV(v,u,w)             /* SUBtract Vector */                   \
69{                                                                       \
70    int _i;                                                             \
71    for (_i = 0; _i < NDIM; _i++)                                       \
72        (v)[_i] = (u)[_i] - (w)[_i];                                    \
73}
74
75#define MULVS(v,u,s)            /* MULtiply Vector by Scalar */         \
76{                                                                       \
77    int _i;                                                             \
78    for (_i = 0; _i < NDIM; _i++)                                       \
79        (v)[_i] = (u)[_i] * (s);                                        \
80}
81
82#endif
83
84#define DIVVS(v,u,s)            /* DIVide Vector by Scalar */           \
85{                                                                       \
86    int _i;                                                             \
87    for (_i = 0; _i < NDIM; _i++)                                       \
88        (v)[_i] = (u)[_i] / (s);                                        \
89}
90
91#if defined(THREEDIM)
92
93#define DOTVP(s,v,u)            /* DOT Vector Product */                \
94{                                                                       \
95    (s) = (v)[0]*(u)[0] + (v)[1]*(u)[1] + (v)[2]*(u)[2];                \
96}
97
98#else
99
100#define DOTVP(s,v,u)            /* DOT Vector Product */                \
101{                                                                       \
102    int _i;                                                             \
103    (s) = 0.0;                                                          \
104    for (_i = 0; _i < NDIM; _i++)                                       \
105        (s) += (v)[_i] * (u)[_i];                                       \
106}
107
108#endif
109
110#define ABSV(s,v)               /* ABSolute value of a Vector */        \
111{                                                                       \
112    real _tmp;                                                          \
113    int _i;                                                             \
114    _tmp = 0.0;                                                         \
115    for (_i = 0; _i < NDIM; _i++)                                       \
116        _tmp += (v)[_i] * (v)[_i];                                      \
117    (s) = rsqrt(_tmp);                                                  \
118}
119
120#define DISTV(s,u,v)            /* DISTance between Vectors */          \
121{                                                                       \
122    real _tmp;                                                          \
123    int _i;                                                             \
124    _tmp = 0.0;                                                         \
125    for (_i = 0; _i < NDIM; _i++)                                       \
126        _tmp += ((u)[_i]-(v)[_i]) * ((u)[_i]-(v)[_i]);                  \
127    (s) = rsqrt(_tmp);                                                  \
128}
129
130#if defined(TWODIM)
131
132#define CROSSVP(s,v,u)          /* CROSS Vector Product */              \
133{                                                                       \
134    (s) = (v)[0]*(u)[1] - (v)[1]*(u)[0];                                \
135}
136
137#endif
138
139#if defined(THREEDIM)
140
141#define CROSSVP(v,u,w)          /* CROSS Vector Product */              \
142{                                                                       \
143    (v)[0] = (u)[1]*(w)[2] - (u)[2]*(w)[1];                             \
144    (v)[1] = (u)[2]*(w)[0] - (u)[0]*(w)[2];                             \
145    (v)[2] = (u)[0]*(w)[1] - (u)[1]*(w)[0];                             \
146}
147
148#endif
149
150/*
151 * Matrix operations.
152 */
153
154#define CLRM(p)                 /* CLeaR Matrix */                      \
155{                                                                       \
156    int _i, _j;                                                         \
157    for (_i = 0; _i < NDIM; _i++)                                       \
158        for (_j = 0; _j < NDIM; _j++)                                   \
159            (p)[_i][_j] = 0.0;                                          \
160}
161
162#define SETMI(p)                /* SET Matrix to Identity */            \
163{                                                                       \
164    int _i, _j;                                                         \
165    for (_i = 0; _i < NDIM; _i++)                                       \
166        for (_j = 0; _j < NDIM; _j++)                                   \
167            (p)[_i][_j] = (_i == _j ? 1.0 : 0.0);                       \
168}
169
170#define SETM(p,q)               /* SET Matrix */                        \
171{                                                                       \
172    int _i, _j;                                                         \
173    for (_i = 0; _i < NDIM; _i++)                                       \
174        for (_j = 0; _j < NDIM; _j++)                                   \
175            (p)[_i][_j] = (q)[_i][_j];                                  \
176}
177
178#define TRANM(p,q)              /* TRANspose Matrix */                  \
179{                                                                       \
180    int _i, _j;                                                         \
181    for (_i = 0; _i < NDIM; _i++)                                       \
182        for (_j = 0; _j < NDIM; _j++)                                   \
183            (p)[_i][_j] = (q)[_j][_i];                                  \
184}
185
186#define ADDM(p,q,r)             /* ADD Matrix */                        \
187{                                                                       \
188    int _i, _j;                                                         \
189    for (_i = 0; _i < NDIM; _i++)                                       \
190        for (_j = 0; _j < NDIM; _j++)                                   \
191            (p)[_i][_j] = (q)[_i][_j] + (r)[_i][_j];                    \
192}
193
194#define SUBM(p,q,r)             /* SUBtract Matrix */                   \
195{                                                                       \
196    int _i, _j;                                                         \
197    for (_i = 0; _i < NDIM; _i++)                                       \
198        for (_j = 0; _j < NDIM; _j++)                                   \
199            (p)[_i][_j] = (q)[_i][_j] - (r)[_i][_j];                    \
200}
201
202#define MULM(p,q,r)             /* Multiply Matrix */                   \
203{                                                                       \
204    int _i, _j, _k;                                                     \
205    for (_i = 0; _i < NDIM; _i++)                                       \
206        for (_j = 0; _j < NDIM; _j++) {                                 \
207            (p)[_i][_j] = 0.0;                                          \
208            for (_k = 0; _k < NDIM; _k++)                               \
209                (p)[_i][_j] += (q)[_i][_k] * (r)[_k][_j];               \
210        }                                                               \
211}
212
213#define MULMS(p,q,s)            /* MULtiply Matrix by Scalar */         \
214{                                                                       \
215    int _i, _j;                                                         \
216    for (_i = 0; _i < NDIM; _i++)                                       \
217        for (_j = 0; _j < NDIM; _j++)                                   \
218            (p)[_i][_j] = (q)[_i][_j] * (s);                            \
219}
220
221#define DIVMS(p,q,s)            /* DIVide Matrix by Scalar */           \
222{                                                                       \
223    int _i, _j;                                                         \
224    for (_i = 0; _i < NDIM; _i++)                                       \
225        for (_j = 0; _j < NDIM; _j++)                                   \
226            (p)[_i][_j] = (q)[_i][_j] / (s);                            \
227}
228
229#define MULMV(v,p,u)            /* MULtiply Matrix by Vector */         \
230{                                                                       \
231    int _i, _j;                                                         \
232    for (_i = 0; _i < NDIM; _i++) {                                     \
233        (v)[_i] = 0.0;                                                  \
234        for (_j = 0; _j < NDIM; _j++)                                   \
235            (v)[_i] += (p)[_i][_j] * (u)[_j];                           \
236    }                                                                   \
237}
238
239#define OUTVP(p,v,u)            /* OUTer Vector Product */              \
240{                                                                       \
241    int _i, _j;                                                         \
242    for (_i = 0; _i < NDIM; _i++)                                       \
243        for (_j = 0; _j < NDIM; _j++)                                   \
244            (p)[_i][_j] = (v)[_i] * (u)[_j];                            \
245}
246
247#define TRACEM(s,p)             /* TRACE of Matrix */                   \
248{                                                                       \
249    int _i;                                                             \
250    (s) = 0.0;                                                          \
251    for (_i = 0.0; _i < NDIM; _i++)                                     \
252        (s) += (p)[_i][_i];                                             \
253}
254
255/*
256 * Enhancements for tree codes.
257 */
258
259#if defined(THREEDIM)
260
261#define DOTPSUBV(s,v,u,w)       /* SUB Vectors, form DOT Prod */        \
262{                                                                       \
263    (v)[0] = (u)[0] - (w)[0];    (s)  = (v)[0] * (v)[0];                \
264    (v)[1] = (u)[1] - (w)[1];    (s) += (v)[1] * (v)[1];                \
265    (v)[2] = (u)[2] - (w)[2];    (s) += (v)[2] * (v)[2];                \
266}
267
268#define DOTPMULMV(s,v,p,u)      /* MUL Mat by Vect, form DOT Prod */    \
269{                                                                       \
270    DOTVP(v[0], p[0], u);    (s)  = (v)[0] * (u)[0];                    \
271    DOTVP(v[1], p[1], u);    (s) += (v)[1] * (u)[1];                    \
272    DOTVP(v[2], p[2], u);    (s) += (v)[2] * (u)[2];                    \
273}
274
275#define ADDMULVS(v,u,s)         /* MUL Vect by Scalar, ADD to vect */   \
276{                                                                       \
277    (v)[0] += (u)[0] * (s);                                             \
278    (v)[1] += (u)[1] * (s);                                             \
279    (v)[2] += (u)[2] * (s);                                             \
280}
281
282#define ADDMULVS2(v,u,s,w,r)    /* 2 times MUL V by S, ADD to vect */   \
283{                                                                       \
284    (v)[0] += (u)[0] * (s) + (w)[0] * (r);                              \
285    (v)[1] += (u)[1] * (s) + (w)[1] * (r);                              \
286    (v)[2] += (u)[2] * (s) + (w)[2] * (r);                              \
287}
288
289#endif
290
291/*
292 * Misc. impure operations.
293 */
294
295#define SETVS(v,s)              /* SET Vector to Scalar */              \
296{                                                                       \
297    int _i;                                                             \
298    for (_i = 0; _i < NDIM; _i++)                                       \
299        (v)[_i] = (s);                                                  \
300}
301
302#define ADDVS(v,u,s)            /* ADD Vector and Scalar */             \
303{                                                                       \
304    int _i;                                                             \
305    for (_i = 0; _i < NDIM; _i++)                                       \
306        (v)[_i] = (u)[_i] + (s);                                        \
307}
308
309#define SETMS(p,s)              /* SET Matrix to Scalar */              \
310{                                                                       \
311    int _i, _j;                                                         \
312    for (_i = 0; _i < NDIM; _i++)                                       \
313        for (_j = 0; _j < NDIM; _j++)                                   \
314            (p)[_i][_j] = (s);                                          \
315}
316
317#endif  /* ! _vectmath_h */
Note: See TracBrowser for help on using the repository browser.