~ubuntu-branches/ubuntu/feisty/libctl/feisty

« back to all changes in this revision

Viewing changes to base/ctl.h.in

  • Committer: Bazaar Package Importer
  • Author(s): Josselin Mouette
  • Date: 2002-04-17 10:36:45 UTC
  • Revision ID: james.westby@ubuntu.com-20020417103645-29vomjspk4yf4olw
Tags: upstream-2.1
ImportĀ upstreamĀ versionĀ 2.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* libctl: flexible Guile-based control files for scientific software 
 
2
 * Copyright (C) 1998, 1999, 2000, 2001, 2002, 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
#ifndef CTL_H
 
23
#define CTL_H
 
24
 
 
25
#include <guile/gh.h>
 
26
 
 
27
#ifdef __cplusplus
 
28
extern "C" {
 
29
#endif                          /* __cplusplus */
 
30
 
 
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. */
 
35
 
 
36
/* set to version string */
 
37
#undef LIBCTL_VERSION
 
38
 
 
39
/* Define if you have gh_load */
 
40
#undef HAVE_GH_LOAD
 
41
 
 
42
/* Define if you have gh_bool2scm */
 
43
#undef HAVE_GH_BOOL2SCM
 
44
 
 
45
/* Define if you have gh_vector_ref */
 
46
#undef HAVE_GH_VECTOR_REF
 
47
 
 
48
/* Define if you have gh_list_ref */
 
49
#undef HAVE_GH_LIST_REF
 
50
 
 
51
/* Define if you have gh_length */
 
52
#undef HAVE_GH_LENGTH
 
53
 
 
54
/* define if you have scm_flush_all_ports() */
 
55
#undef HAVE_SCM_FLUSH_ALL_PORTS
 
56
 
 
57
/* Define if gh_lookup is not broken */
 
58
#undef GH_LOOKUP_OK
 
59
 
 
60
/**************************************************************************/
 
61
 
 
62
  /* Basic types: */
 
63
 
 
64
typedef int integer;
 
65
typedef double number;
 
66
typedef struct { number re, im; } cnumber; /* complex numbers! */
 
67
typedef short boolean;
 
68
typedef char *string;
 
69
typedef SCM list;
 
70
typedef SCM function;
 
71
typedef SCM object;
 
72
 
 
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;
 
76
 
 
77
  /* similarly for matrix3x3 */
 
78
typedef struct { vector3 c0, c1, c2; /* the columns */ } matrix3x3;
 
79
 
 
80
/* define complex equivalents: */
 
81
typedef struct { cnumber x,y,z; } cvector3;
 
82
typedef struct { cvector3 c0, c1, c2; /* the columns */ } cmatrix3x3;
 
83
 
 
84
/**************************************************************************/
 
85
 
 
86
#ifndef GH_LOOKUP_OK
 
87
#  define gh_lookup scm_symbol_value0
 
88
#endif
 
89
 
 
90
#ifndef HAVE_GH_LOAD
 
91
#  define gh_load gh_eval_file 
 
92
#endif
 
93
 
 
94
extern void ctl_include(char *filename);
 
95
extern char *ctl_fix_path(const char *path);
 
96
 
 
97
/**************************************************************************/
 
98
 
 
99
  /* vector3 and matrix3x3 utilities: */
 
100
 
 
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);
 
108
 
 
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);
 
114
 
 
115
/**************************************************************************/
 
116
 
 
117
  /* complex number utilities */
 
118
 
 
119
 
 
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)
 
124
 
 
125
extern vector3 cvector3_re(cvector3 cv);
 
126
extern vector3 cvector3_im(cvector3 cv);
 
127
extern cvector3 make_cvector3(vector3 vr, vector3 vi);
 
128
 
 
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);
 
134
 
 
135
/**************************************************************************/
 
136
 
 
137
  /* type conversion */
 
138
 
 
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
 
143
#endif
 
144
 
 
145
extern vector3 scm2vector3(SCM sv);
 
146
extern SCM vector32scm(vector3 v);
 
147
extern matrix3x3 scm2matrix3x3(SCM sm);
 
148
extern SCM matrix3x32scm(matrix3x3 m);
 
149
 
 
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);
 
156
 
 
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)
 
170
 
 
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)
 
184
 
 
185
/**************************************************************************/
 
186
 
 
187
  /* variable get/set functions */
 
188
 
 
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);
 
201
 
 
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);
 
214
 
 
215
/**************************************************************************/
 
216
 
 
217
  /* list traversal */
 
218
 
 
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);
 
232
 
 
233
/**************************************************************************/
 
234
 
 
235
  /* list creation */
 
236
 
 
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);
 
249
 
 
250
/**************************************************************************/
 
251
 
 
252
  /* object properties */
 
253
 
 
254
boolean object_is_member(char *type_name, object o);
 
255
 
 
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);
 
268
 
 
269
/**************************************************************************/
 
270
 
 
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.
 
275
   
 
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. */
 
278
 
 
279
extern void ctl_start_hook(int *argc, char ***argv);
 
280
extern void ctl_stop_hook(void);
 
281
 
 
282
/**************************************************************************/
 
283
 
 
284
  /* subplex multi-dimensional minimization routines: */
 
285
 
 
286
typedef number (*subplex_func) (integer, number *, void *);
 
287
 
 
288
extern number subplex(subplex_func f, number *x, integer n, void *fdata,
 
289
                      number tol, integer maxnfe,       
 
290
                      number fmin, boolean use_fmin,
 
291
                      number *scale,    
 
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,
 
296
                       SCM scale_scm);
 
297
 
 
298
/**************************************************************************/
 
299
 
 
300
#ifdef __cplusplus
 
301
           }                               /* extern "C" */
 
302
#endif                          /* __cplusplus */
 
303
 
 
304
#endif /* CTL_H */