(under construction--to be revised+formatted.)
/* SAMPLE PROGRAM CALLS ONE OF THE DE SOLVE FUNCTIONS IN SLATEC
ddeabm(....). Slatec documentation is in slatec/src/ddeabm.f . */
/* call ddeabm(&(df, neq, t, x, tout, info, rtol, atol, idid, rwork,
lrw, rpar))
df(time, X[], V[], dparams[],iparams[])
is the function representing the 1st order diff eqn
X[], and V[] are the positions and velocities at this time. */
#include <math.h>
#include <stdio.h>
#define DEBUG 0
#define neqn 2
#define firstCall 0
#define scalarTol 1
#define solveOnlyTout 2
#define canSurpassTout 3
#define ATOL .0005
#define RTOL .001
#define PTS 500
#define W0 1.
typedef void (*dedef)(double*,double*,double*,double*,int*);
/*typedef void (defun)(double* double*, double* double* int*); */
void df(double* t, double* X, double* V, double* dpar, int* ipar) {
double om, al, f,x,v;
om=dpar[0];
al=dpar[1];
f=dpar[2];
x=X[0];
v=X[1];
V[0]=X[1]; /* X[0] is position X[1] is velocity. */
V[1]=-W0*W0*sin(x)-al*v+cos(om*(*t));
} /* damped driven pendulum */
main() {
FILE *fp, *fq, *fo;
double par[3];
double omegao, alpha, fdriv, xo, vo,t, tout;
float f;
double d,dt;
int ipar[1];
int neq, lrw,liw,status,i,j,k;
int info[15];
double x[2];
double rtol,atol;
double rwork[172]; /* 130+21*neqn are required */
int iwork[100];
dedef F;
F=&df;
fp=fopen("p.dat","w"); /* open 3 data files to record: */
fq=fopen("q.dat","w"); /* x(t), v(t), v(x). */
fo=fopen("o.dat","w");
rtol=RTOL;atol=ATOL;
neq=neqn; lrw=172; liw=100;
puts("omega_o, alpha (dampening), xo (init pos/amplitude), vo, \n and f (force val; if applicable; set f=0 to automatic f=fstable) ?\n");
scanf("%f", &f); omegao=1.*f;
scanf("%f", &f); alpha=1.*f;
scanf("%f", &f); xo=1.*f;
scanf("%f", &f); vo=1.*f;
scanf("%f", &f); fdriv=1.*f;
if(fdriv==0.) {
/* find effective amplitude */
d=.5*omegao*omegao*xo*xo+.5*vo*vo;
d=sqrt(2.*d/omegao/omegao);
fdriv=omegao*omegao*d*alpha/2./3.14159;
};
printf("Fdriv:=%g \n", fdriv);
par[0]=omegao;
par[1]=alpha;
par[2]=fdriv;
x[0]=xo;
x[1]=vo;
puts("Final time? \n");
scanf("%f", &f); tout=1.*f;
t=0.;
dt=tout/PTS;
printf("Time interval is:(%g,%g)\n", t,tout);
info[firstCall]=0;
info[scalarTol]=0;
info[solveOnlyTout]=1;
info[canSurpassTout]=0;
ddeabm(F,&neq,&t,x,&tout,info,&rtol,&atol,&status,rwork,&lrw,iwork,&liw,par,ipar);
for(i=1,j=-1,k=0;(i<=1);j=k)
{ if (DEBUG) {printf(" S<%d",status);puts("XOX");}
k=(int) (t/dt);
if ((k-j)>0) {
fprintf(fo,"%g %g \n", x[0], x[1]);
fprintf(fq,"%g %g \n", t, x[0]);
fprintf(fp,"%g %g \n", t, x[1]);
}
i=status;
if (i==-2) info[firstCall]=1;
else if(i<0) {puts("Error happened. exiting.\n");break;}
if (i<=1)
ddeabm(F,&neq,&t,x,&tout,info,&rtol,&atol,&status,rwork,&lrw,iwork,&liw,par,ipar);
}
fclose(fp);
fclose(fq);
fclose(fo);
}