1 /* libctl: flexible Guile-based control files for scientific software
2  * Copyright (C) 1998-2020 Massachusetts Institute of Technology and Steven G. Johnson
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA  02111-1307, USA.
18  *
19  * Steven G. Johnson can be contacted at stevenj@alum.mit.edu.
20  */
21 
22 /* just the non-Guile-based vector/matrix math routines in
23    libctl, for use in libctlgeom */
24 
25 #ifndef CTL_MATH_H
26 #define CTL_MATH_H
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif /* __cplusplus */
31 
32 /**************************************************************************/
33 
34 /* Basic types: */
35 
36 typedef int integer;
37 typedef double number;
38 typedef struct {
39   number re, im;
40 } cnumber; /* complex numbers! */
41 typedef short boolean;
42 typedef char *string;
43 
44 /* define vector3 as a structure, not an array, so that it can
45    be a function return value and so that simple assignment works. */
46 typedef struct {
47   number x, y, z;
48 } vector3;
49 
50 /* similarly for matrix3x3 */
51 typedef struct {
52   vector3 c0, c1, c2; /* the columns */
53 } matrix3x3;
54 
55 /* define complex equivalents: */
56 typedef struct {
57   cnumber x, y, z;
58 } cvector3;
59 typedef struct {
60   cvector3 c0, c1, c2; /* the columns */
61 } cmatrix3x3;
62 
63 /**************************************************************************/
64 
65 /* vector3 and matrix3x3 utilities: */
66 
67 extern number vector3_dot(vector3 v1, vector3 v2);
68 extern number vector3_norm(vector3 v);
69 extern vector3 vector3_scale(number s, vector3 v);
70 extern vector3 unit_vector3(vector3 v);
71 extern vector3 vector3_cross(vector3 v1, vector3 v2);
72 extern vector3 vector3_plus(vector3 v1, vector3 v2);
73 extern vector3 vector3_minus(vector3 v1, vector3 v2);
74 extern int vector3_equal(vector3 v1, vector3 v2);
75 
76 extern vector3 matrix3x3_vector3_mult(matrix3x3 m, vector3 v);
77 extern vector3 matrix3x3_transpose_vector3_mult(matrix3x3 m, vector3 v);
78 extern matrix3x3 matrix3x3_mult(matrix3x3 m1, matrix3x3 m2);
79 extern matrix3x3 matrix3x3_transpose(matrix3x3 m);
80 extern number matrix3x3_determinant(matrix3x3 m);
81 extern matrix3x3 matrix3x3_inverse(matrix3x3 m);
82 extern int matrix3x3_equal(matrix3x3 m1, matrix3x3 m2);
83 
84 extern vector3 matrix3x3_row1(matrix3x3 m);
85 extern vector3 matrix3x3_row2(matrix3x3 m);
86 extern vector3 matrix3x3_row3(matrix3x3 m);
87 
88 /**************************************************************************/
89 
90 /* complex number utilities */
91 
92 extern cnumber make_cnumber(number r, number i);
93 extern cnumber cnumber_conj(cnumber c);
94 extern int cnumber_equal(cnumber c1, cnumber c2);
95 #define cnumber_re(c) ((c).re)
96 #define cnumber_im(c) ((c).im)
97 
98 extern vector3 cvector3_re(cvector3 cv);
99 extern vector3 cvector3_im(cvector3 cv);
100 extern cvector3 make_cvector3(vector3 vr, vector3 vi);
101 extern int cvector3_equal(cvector3 v1, cvector3 v2);
102 
103 extern matrix3x3 cmatrix3x3_re(cmatrix3x3 cm);
104 extern matrix3x3 cmatrix3x3_im(cmatrix3x3 cm);
105 extern cmatrix3x3 make_cmatrix3x3(matrix3x3 mr, matrix3x3 mi);
106 cmatrix3x3 make_hermitian_cmatrix3x3(number m00, number m11, number m22, cnumber m01, cnumber m02,
107                                      cnumber m12);
108 extern int cmatrix3x3_equal(cmatrix3x3 m1, cmatrix3x3 m2);
109 
110 /**************************************************************************/
111 
112 /* multi-dimensional integration routines */
113 
114 typedef number (*multivar_func)(integer, number *, void *);
115 
116 extern number adaptive_integration(multivar_func f, number *xmin, number *xmax, integer n,
117                                    void *fdata, number abstol, number reltol, integer maxnfe,
118                                    number *esterr, integer *errflag);
119 
120 /**************************************************************************/
121 
122 #ifdef __cplusplus
123 } /* extern "C" */
124 #endif /* __cplusplus */
125 
126 #endif /* CTL_MATH_H */
127