zsample.c
/* file: zsample.c */
#include <stdio.h>
#include "zeros.c"
/* Sample program.
Uses DFZERO + zeros.c interval zero finder.
Solve zeros for a boundary value problem:
The sample program calculates the energies and states for a particle in the
following potential: output for the states is in Mathematica format.
V(x)
~~~^ ^~~~~~ inf
| |
| |
| _______| Vo
|
|________
a --->x
output file: zsample.out
*/
FILE *fp;
double VV=0.;
double MM, AA,HH;
double gke(double *e) { /* function whose zeros we to find */
double k,E,ka, kk_sin_ka, cos_ka;
E=*e;
k=sqrt(2*MM*E)/HH;
ka=sqrt(2*MM*(VV-E))/HH;
kk_sin_ka=(ka/k)*sin(k*AA);
cos_ka=cos(k*AA);
E=exp(2*ka*AA)*(kk_sin_ka+cos_ka)+(kk_sin_ka-cos_ka);
return(E);
}
int SampleQP() { /* A SAMPLE PROGRAM FOR DFZERO */
float f;
double a,b,re,ae,k,ka,E,A,B,ex;
int i,j=0;
zeroLink *Z;
ddfortran* Fun;
Fun=&gke;
re=.00001; ae=.00001;
HH=1.;
MM=1.;
if (VV==0.) VV=4;
printf("System is h/2pi=%g m=%g V=%g . Half length of the box, a= ?\n",HH,MM,VV);
scanf("%f",&f);
AA=1.*f;
a=0.0001;
b=VV-.0001;
puts("Calling zero finder\n");
Z=getPointsInterval(Fun, a,b, re,ae);
if (Z==0) {
puts("NO E<V energy found for this well. Try another.\n");
return(SampleQP());
}
fprintf(fp,"System is h/2pi=%g m=%g V=%g a=%g\n",HH,MM,VV,AA);
fprintf(fp,"Found(energies):\n");
puts("Found(energies):\n");
if (Z) for(;Z->next;Z=Z->next) {
printf("(%22.20g,%d) \n",Z->val,Z->isZero);
fprintf(fp,"(%22.20g,%d) \n",Z->val,Z->isZero);
}
if (Z) {
printf("(%22.20g,%d) ",Z->val,Z->isZero);
fprintf(fp,"(%22.20g,%d) ",Z->val,Z->isZero);
}
puts("\nThe wavefunctions are:\n");
fprintf(fp,"\nThe wavefunctions are:\n");
Z=firstLink(Z);
if (Z) for(;Z->next;Z=Z->next,j++)
{ LABEL:
E=Z->val;
k=sqrt(2*MM*E)/HH;
ka=sqrt(2*MM*(VV-E))/HH;
ex=exp(ka*AA);
A=1000000/ka*k*cos(k*AA)/ex/(1.+ex*ex);
B=-1.00000*k/ka*cos(k*AA)*ex*ex/(ex+1./ex);
printf("psi%d[x_]:=Sin[%22.20f x] /; x<=%g \n",j,k,AA);
printf("psi%d[x_]:=%22.20f*10^-6 Exp[%22.20f x]+ %22.20f Exp[%22.20f x] /; x>%g \n",
j,A,ka,B,-ka,AA);
fprintf(fp,"psi%d[x_]:=Sin[%22.20f x] /; x<=%g \n",j,k,AA);
fprintf(fp,"psi%d[x_]:=%22.20f*10^-6 Exp[%22.20f x]+ %22.20f Exp[%22.20f x] /; x>%g \n",
j,A,ka,B,-ka,AA);
}
if (Z) goto LABEL ;
printf("\n(*where*) a=%g;\n",AA);
fprintf(fp,"\n(*where*) a=%g;\n\n",AA);
fprintf(fp,"Plot[psi0[x],{x,0,2*a}]\n\n");
puts("Plot[psi0[x],{x,0,2*a}]\n\n");
return(1);
}
int main() {
float f;
fp=fopen("zsample.dat","w"); /* external fp */
printf("V= ?\n");
scanf("%f",&f);
VV=1.*f;
SampleQP();
return(fclose(fp));
}