Will wrote:
Here are the relevant alien definitions.
;; These are C functions called from the Lisp system of equations
function.
(def-alien-routine get_sysvar_n int)
(def-alien-routine get_sysvar_val double (i int))
(def-alien-routine get_sysvar_dotval double (i int))
(def-alien-routine set_sysvar_val void (i int) (x double))
(def-alien-routine set_sysvar_dotval void (i int) (x double))
Alien routines should be declared inline to reduce/eliminate consing,
according to the manual.
;; this builds a part of the equations that calls C from
;; Lisp: get_sysvar_val(i), is a simple function that lets
;; Lisp access an array stored in C.
(defun cvode-assign-sys-vars ()
(let ((syslst))
(dotimes (i (length *system-variables*) syslst)
(push `(setf (aref *system-variables* ,i)
(get_sysvar_val ,i))
syslst))))
;; here's the declaration of get_sysvar_val from above
double get_sysvar_val(int i) {return sys_var.vals[i];}
You could, if desired, declare the alien structure in Lisp and access
them directly. But the alien interface should work fine too.
;; i call this function once for each of n variables for each
;; explicit time step passed to the solver. so, for one full
;; simulation, this function could be called hundreds of
;; times.
Which function are you talking about? get_sysvar_val? If so, declaring
inline should help.
(DEF-CALLBACK MS_MODEL
(VOID
(TIME
DOUBLE))
(DECLARE (OPTIMIZE (SPEED 3) (SAFETY 0)))
(SETF (AREF *SYSTEM-VARIABLES* 1) (GET_SYSVAR_VAL 1))
(SETF (AREF *SYSTEM-VARIABLES* 0) (GET_SYSVAR_VAL 0))
Is *system-variables* declared to be an array of double-floats? That
will reduce consing.
(SET_SYSVAR_DOTVAL 1
(EQUATION-AGGREGATOR
EQUATION-AGGREGATOR will also cons. That seems unavoidable unless you
make it a local function , inline it, or use block compilation.
It's not quite clear to me, but is ms_model generated once and solved?
Then a new ms_model is generated and solved again for a different problem?
To reduce consing, I think the defcallback needs to be compiled too.
That's all I can think of right now, after looking at your code for a
few minutes,
Ray