/* 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 __dynsys_h__
#define __dynsys_h__

typedef struct phpt	{
	int sp;
	float *sa;
	int fp;
	int fs;
	float *fa; } *phptr;

#define MaxIntPar 10

int ODEeuler(void (*eqm)(float *,float *,float *),float *k,int p,float *u,float tf,float dt,int (*trackfn)(float,int,float *));
int ODErk4(void (*eqm)(float *,float *,float *),float *k,int p,float *u,float tf,float dt,int (*trackfn)(float,int,float *));
int ODErkas(void (*eqm)(float *,float *,float *),float *k,int p,float *u,float tf,float dt,int (*trackfn)(float,int,float *));
void EQMsho(float *u,float *k,float *dudt);
void EQMlorenz(float *u,float *k,float *dudt);

phptr phptalloc(int sp,int fp,int fs);
void phptfree(phptr u);
int phptsave(phptr u,char *fnames,char *fnamef);
phptr phptload(char *fnames,char *fnamef);
int ODEFeuler(void (*eqm)(phptr,void *,phptr),void *k,phptr u,float *Dt,float intpar[],int (*trackfn)(float,phptr,void *),void *trackptr);
int ODEFrk4(void (*eqm)(phptr,void *,phptr),void *k,phptr u,float *Dt,float intpar[],int (*trackfn)(float,phptr,void *),void *trackptr);
int ODEFrkas(void (*eqm)(phptr,void *,phptr),void *k,phptr u,float *Dt,float intpar[],int (*trackfn)(float,phptr,void *),void *trackptr);
void EQMFzero(phptr u,void *k,phptr dudt);
void EQMFsho(phptr u,void *k,phptr dudt);
void EQMFdiff(phptr u,void *k,phptr dudt);
void EQMFwave(phptr u,void *k,phptr dudt);
int TKFticker(float t,phptr u,void *tkptr);
int TKFtimeplot(float t,phptr u,void *tkptr);
int TKFshowfield(float t,phptr u,void *tkptr);

/* start of 2004 version */

typedef struct odestruct {
	int dim;
	int order;
	float *dtptr;
	float dtsugg;
	float dtmax;
	float eps;
	void *systemptr;
	int (*eqm)(void *);
	float **state0;
	float **state1;
	float *scale;
	float *k1,*k2,*k3,*k4; } *odeptr;

odeptr allocodestruct(int dim,int order,float *dtptr,void *systemptr,int (*eqm)(void *));
void freeodestruct(odeptr ode);
int runodestruct(odeptr ode);
int odestructexample(void);

/* end of 2004 version */

#endif