1
/* libctl: flexible Guile-based control files for scientific software
2
* Copyright (C) 1998, 1999, 2000, 2001, 2002, Steven G. Johnson
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.
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.
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.
19
* Steven G. Johnson can be contacted at stevenj@alum.mit.edu.
29
#endif /* __cplusplus */
31
/**************************************************************************/
32
/* Configuration options (guessed by configure).
33
We have to put them here, rather than in a private config.h file,
34
because they need to be known by user ctl-io.c and main.c files. */
36
/* set to version string */
39
/* Define if you have gh_load */
42
/* Define if you have gh_bool2scm */
43
#undef HAVE_GH_BOOL2SCM
45
/* Define if you have gh_vector_ref */
46
#undef HAVE_GH_VECTOR_REF
48
/* Define if you have gh_list_ref */
49
#undef HAVE_GH_LIST_REF
51
/* Define if you have gh_length */
54
/* define if you have scm_flush_all_ports() */
55
#undef HAVE_SCM_FLUSH_ALL_PORTS
57
/* Define if gh_lookup is not broken */
60
/**************************************************************************/
65
typedef double number;
66
typedef struct { number re, im; } cnumber; /* complex numbers! */
67
typedef short boolean;
73
/* define vector3 as a structure, not an array, so that it can
74
be a function return value and so that simple assignment works. */
75
typedef struct { number x,y,z; } vector3;
77
/* similarly for matrix3x3 */
78
typedef struct { vector3 c0, c1, c2; /* the columns */ } matrix3x3;
80
/* define complex equivalents: */
81
typedef struct { cnumber x,y,z; } cvector3;
82
typedef struct { cvector3 c0, c1, c2; /* the columns */ } cmatrix3x3;
84
/**************************************************************************/
87
# define gh_lookup scm_symbol_value0
91
# define gh_load gh_eval_file
94
extern void ctl_include(char *filename);
95
extern char *ctl_fix_path(const char *path);
97
/**************************************************************************/
99
/* vector3 and matrix3x3 utilities: */
101
extern number vector3_dot(vector3 v1,vector3 v2);
102
extern number vector3_norm(vector3 v);
103
extern vector3 vector3_scale(number s, vector3 v);
104
extern vector3 unit_vector3(vector3 v);
105
extern vector3 vector3_cross(vector3 v1,vector3 v2);
106
extern vector3 vector3_plus(vector3 v1,vector3 v2);
107
extern vector3 vector3_minus(vector3 v1,vector3 v2);
109
extern vector3 matrix3x3_vector3_mult(matrix3x3 m, vector3 v);
110
extern matrix3x3 matrix3x3_mult(matrix3x3 m1, matrix3x3 m2);
111
extern matrix3x3 matrix3x3_transpose(matrix3x3 m);
112
extern number matrix3x3_determinant(matrix3x3 m);
113
extern matrix3x3 matrix3x3_inverse(matrix3x3 m);
115
/**************************************************************************/
117
/* complex number utilities */
120
extern cnumber make_cnumber(number r, number i);
121
extern cnumber cnumber_conj(cnumber c);
122
#define cnumber_re(c) ((c).re)
123
#define cnumber_im(c) ((c).im)
125
extern vector3 cvector3_re(cvector3 cv);
126
extern vector3 cvector3_im(cvector3 cv);
127
extern cvector3 make_cvector3(vector3 vr, vector3 vi);
129
extern matrix3x3 cmatrix3x3_re(cmatrix3x3 cm);
130
extern matrix3x3 cmatrix3x3_im(cmatrix3x3 cm);
131
extern cmatrix3x3 make_cmatrix3x3(matrix3x3 mr, matrix3x3 mi);
132
cmatrix3x3 make_hermitian_cmatrix3x3(number m00, number m11, number m22,
133
cnumber m01, cnumber m02, cnumber m12);
135
/**************************************************************************/
137
/* type conversion */
139
#ifndef HAVE_GH_BOOL2SCM
140
/* Guile 1.2 is missing gh_bool2scm for some reason; redefine: */
141
extern SCM bool2scm(boolean);
142
#define gh_bool2scm bool2scm
145
extern vector3 scm2vector3(SCM sv);
146
extern SCM vector32scm(vector3 v);
147
extern matrix3x3 scm2matrix3x3(SCM sm);
148
extern SCM matrix3x32scm(matrix3x3 m);
150
extern cnumber scm2cnumber(SCM sx);
151
extern SCM cnumber2scm(cnumber x);
152
extern cvector3 scm2cvector3(SCM sv);
153
extern SCM cvector32scm(cvector3 v);
154
extern cmatrix3x3 scm2cmatrix3x3(SCM sm);
155
extern SCM cmatrix3x32scm(cmatrix3x3 m);
157
#define ctl_convert_number_to_scm(x) gh_double2scm(x)
158
#define ctl_convert_cnumber_to_scm(x) cnumber2scm(x)
159
#define ctl_convert_integer_to_scm(x) gh_int2scm(x)
160
#define ctl_convert_string_to_scm(x) gh_str02scm(x)
161
#define ctl_convert_boolean_to_scm(x) gh_bool2scm(x)
162
#define ctl_convert_vector3_to_scm(x) vector32scm(x)
163
#define ctl_convert_matrix3x3_to_scm(x) matrix3x32scm(x)
164
#define ctl_convert_cvector3_to_scm(x) cvector32scm(x)
165
#define ctl_convert_cmatrix3x3_to_scm(x) cmatrix3x32scm(x)
166
#define ctl_convert_SCM_to_scm(x) (x)
167
#define ctl_convert_function_to_scm(x) (x)
168
#define ctl_convert_object_to_scm(x) (x)
169
#define ctl_convert_list_to_scm(x) (x)
171
#define ctl_convert_number_to_c(x) gh_scm2double(x)
172
#define ctl_convert_cnumber_to_c(x) scm2cnumber(x)
173
#define ctl_convert_integer_to_c(x) gh_scm2int(x)
174
#define ctl_convert_string_to_c(x) gh_scm2newstr(x, 0)
175
#define ctl_convert_boolean_to_c(x) gh_scm2bool(x)
176
#define ctl_convert_vector3_to_c(x) scm2vector3(x)
177
#define ctl_convert_matrix3x3_to_c(x) scm2matrix3x3(x)
178
#define ctl_convert_cvector3_to_c(x) scm2cvector3(x)
179
#define ctl_convert_cmatrix3x3_to_c(x) scm2cmatrix3x3(x)
180
#define ctl_convert_SCM_to_c(x) (x)
181
#define ctl_convert_function_to_c(x) (x)
182
#define ctl_convert_object_to_c(x) (x)
183
#define ctl_convert_list_to_c(x) (x)
185
/**************************************************************************/
187
/* variable get/set functions */
189
extern integer ctl_get_integer(char *identifier);
190
extern number ctl_get_number(char *identifier);
191
extern cnumber ctl_get_cnumber(char *identifier);
192
extern boolean ctl_get_boolean(char *identifier);
193
extern char* ctl_get_string(char *identifier);
194
extern vector3 ctl_get_vector3(char *identifier);
195
extern matrix3x3 ctl_get_matrix3x3(char *identifier);
196
extern cvector3 ctl_get_cvector3(char *identifier);
197
extern cmatrix3x3 ctl_get_cmatrix3x3(char *identifier);
198
extern list ctl_get_list(char *identifier);
199
extern object ctl_get_object(char *identifier);
200
extern function ctl_get_function(char *identifier);
202
extern void ctl_set_integer(char *identifier, integer value);
203
extern void ctl_set_number(char *identifier, number value);
204
extern void ctl_set_cnumber(char *identifier, cnumber value);
205
extern void ctl_set_boolean(char *identifier, boolean value);
206
extern void ctl_set_string(char *identifier, char *value);
207
extern void ctl_set_vector3(char *identifier, vector3 value);
208
extern void ctl_set_matrix3x3(char *identifier, matrix3x3 value);
209
extern void ctl_set_cvector3(char *identifier, cvector3 value);
210
extern void ctl_set_cmatrix3x3(char *identifier, cmatrix3x3 value);
211
extern void ctl_set_list(char *identifier, list value);
212
extern void ctl_set_object(char *identifier, object value);
213
extern void ctl_set_function(char *identifier, function value);
215
/**************************************************************************/
219
extern int list_length(list l);
220
extern integer integer_list_ref(list l, int index);
221
extern number number_list_ref(list l, int index);
222
extern cnumber cnumber_list_ref(list l, int index);
223
extern boolean boolean_list_ref(list l, int index);
224
extern char* string_list_ref(list l, int index);
225
extern vector3 vector3_list_ref(list l, int index);
226
extern matrix3x3 matrix3x3_list_ref(list l, int index);
227
extern cvector3 cvector3_list_ref(list l, int index);
228
extern cmatrix3x3 cmatrix3x3_list_ref(list l, int index);
229
extern list list_list_ref(list l, int index);
230
extern object object_list_ref(list l, int index);
231
extern function function_list_ref(list l, int index);
233
/**************************************************************************/
237
extern list make_integer_list(int num_items, integer *items);
238
extern list make_number_list(int num_items, number *items);
239
extern list make_cnumber_list(int num_items, cnumber *items);
240
extern list make_boolean_list(int num_items, boolean *items);
241
extern list make_string_list(int num_items, char **items);
242
extern list make_vector3_list(int num_items, vector3 *items);
243
extern list make_matrix3x3_list(int num_items, matrix3x3 *items);
244
extern list make_cvector3_list(int num_items, cvector3 *items);
245
extern list make_cmatrix3x3_list(int num_items, cmatrix3x3 *items);
246
extern list make_list_list(int num_items, list *items);
247
extern list make_object_list(int num_items, object *items);
248
extern list make_function_list(int num_items, function *items);
250
/**************************************************************************/
252
/* object properties */
254
boolean object_is_member(char *type_name, object o);
256
extern integer integer_object_property(object o, char *property_name);
257
extern number number_object_property(object o, char *property_name);
258
extern cnumber cnumber_object_property(object o, char *property_name);
259
extern boolean boolean_object_property(object o, char *property_name);
260
extern char* string_object_property(object o, char *property_name);
261
extern vector3 vector3_object_property(object o, char *property_name);
262
extern matrix3x3 matrix3x3_object_property(object o, char *property_name);
263
extern cvector3 cvector3_object_property(object o, char *property_name);
264
extern cmatrix3x3 cmatrix3x3_object_property(object o, char *property_name);
265
extern list list_object_property(object o, char *property_name);
266
extern object object_object_property(object o, char *property_name);
267
extern object function_object_property(object o, char *property_name);
269
/**************************************************************************/
271
/* main() hook functions. These are prototypes of functions
272
defined by the USER and called just before the program starts
273
and just before it ends, respectively. If you want to define
274
them, you should also define HAVE_CTL_HOOKS when compiling main.c.
276
Note that due to the behavior of the Guile interactive mode,
277
ctl_stop_hook will only get called in non-interactive mode. Sigh. */
279
extern void ctl_start_hook(int *argc, char ***argv);
280
extern void ctl_stop_hook(void);
282
/**************************************************************************/
284
/* subplex multi-dimensional minimization routines: */
286
typedef number (*subplex_func) (integer, number *, void *);
288
extern number subplex(subplex_func f, number *x, integer n, void *fdata,
289
number tol, integer maxnfe,
290
number fmin, boolean use_fmin,
292
integer *nfe, integer *errflag);
293
extern SCM subplex_scm(SCM f_scm, SCM x_scm,
294
SCM tol_scm, SCM maxnfe_scm,
295
SCM fmin_scm, SCM use_fmin_scm,
298
/**************************************************************************/
302
#endif /* __cplusplus */