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