#define VERN "spectr2.cpp" // spectr2.cpp Jul 11 allow Poisson ratio as input // spectr1.cpp Jun 30 enumerate all frequencies // and write to a data file // - beta2b.cpp June 30 slight changes #include #include #include #include #include #include #include double j(int n,double x); double factorial(double arg); double SeriesSphBess1j(int n,double x); double SphBess1j(int n,double x); double dubfactorial(double arg); double evalan(int n,double alpha,double beta); double evalbn(int n,double alpha,double beta); double evalcn(int n,double alpha,double beta); double evaldn(int n,double alpha,double beta); void main(void) { // main clrscr(); int ipx,ipy,i1; double beta,f1,f2,sfx,alpha; gotoxy(1,1);cout<>nuPoisson; if (nuPoisson<=-2) {closegraph();exit(0);} gotoxy(2,12);cout<<" "; alphabybeta=sqrt((1-2.0*nuPoisson)/(2-2.0*nuPoisson)); //gotoxy(2,10);cout<<"What is alpha/beta? ";cin>>alphabybeta; if (alphabybeta<=0) return; double db,func,func0,oldf1,oldf2; int countroots=0,nn; db=0.001; countroots=0; char foutname[40]; gotoxy(2,12); cout<<"Name of output file? (.txt extension; q to quit) ";cin>>foutname; if (foutname[0]=='q') {closegraph();exit(0);} FILE *fout; fout=fopen(foutname,"wb"); fprintf(fout,"%s%s%s%c%c","// ",foutname," July 11, 2002 ",13,10); fprintf(fout,"%s%f%s%f%s%c%c","// Poisson=",nuPoisson," alpha/beta=",alphabybeta," ",13,10); //-------------------------------------------------- nn=0; // n=0 spheroidal func0=0; oldf1=0;oldf2=0; for (beta=db;beta<12;beta=beta+db) { // beta alpha=alphabybeta*beta; f1=tan(alpha)/alpha; f2=1.0/(1.0-0.25*beta*beta); func=f1-f2; if ((func*func0<0)&&(fabs(f1-oldf1)<1)&&(fabs(f2-oldf2)<1)) { // found a root countroots++; gotoxy(40+countroots/25,1+(countroots%25));cout<<" sph n=0 beta="<=1 spheroidal for (nn=1;nn<13;nn++) { // nn func0=0; for (beta=db;beta<12;beta=beta+db) { // beta double ra,rb,rc,rd; alpha=beta*alphabybeta; ra=evalan(nn,alpha,beta); rb=evalbn(nn,alpha,beta); rc=evalcn(nn,alpha,beta); rd=evaldn(nn,alpha,beta); func=ra*rd-rb*rc; if (func*func0<0) { // found a root countroots++; gotoxy(40+countroots/25,1+(countroots%25));cout<<" sph "<=1 only; n=0 are not physical modes) for (nn=1;nn<13;nn++) { // n gotoxy(67,2);cout<<"tor n="<1;i2=i2-2) { // r2=i2; ans=ans*r2; } // return ans; } // double factor n!! = n(n-2)(n-4)... double factorial(double arg) { // double ans,arg2,r2; int i1,i2; ans=1.0; i1 = floor(arg+0.5); for (i2=2;i2<=i1;i2++) { // r2=i2; ans=ans*r2; } // return ans; } // double SeriesSphBess1j(int n,double x) { // infinite series spherical bessel function of 1st kind // Note: summing to 15 gives optimal precision out to // about x=15, after which the series blow up, if "double" // is used. If double precision is used, then it is possible // to sum more terms to extend the range of accurate convergence // without getting the blow up problem. // (Double precision as used here is not really necessary.) if (x>14) {cout<<"x ="<