/* Steven Andrews, 1/28/97 */
/* Header for dynsys.c */
/* See documentation called dynsys doc */
/* Copyright 2003 by Steven Andrews.  Permission is granted
   for non-commercial use of and modifications to the code. */

#ifndef __dynsys2_h__
#define __dynsys2_h__

typedef struct odestruct {
	int maxdim;							// allocated system dimensionality
	int dim;								// actual system dimensionality
	int order;							// order of ODE integration (1=Euler)
	double *dtptr;					// pointer to dt
	double dtsugg;					// suggested time step for order 5
	double dtmax;						// maximum dt for order 5 integration
	double eps;							// maximum error for order 5 integration
	void *systemptr;				// pointer to system
	int (*eqm)(void *);			// function for equations of motion
	double **statenow;			// state at end of time step
	double **statewas;			// state at beginning of time step
  double **deriv;         // time derivative
	double *scale;					// scales errors for order 5 integration
	double *k1,*k2,*k3,*k4;	// scratch space for integrators
	} *odeptr;

odeptr dyns_AllocOde(int maxdim);
void dyns_FreeOde(odeptr ode);
int dyns_SetOrder(odeptr ode,int order);
int dyns_SetParamPtr(odeptr ode,char *param,void *value);
int dyns_SetParamDbl(odeptr ode,char *param,double value);
int dyns_AddStatePtr(odeptr ode,double *nowptr,double *wasptr,double *derivptr,double scale);
void dyns_ClearStatePtrs(odeptr ode);
int dyns_StepOde(odeptr ode);

// Example program
int dyns_ShoExample(void);

#endif


