local real gdisk(real rad) { real x; x = 0.5 * alpha * rad; return - alpha*alpha * mdisk * x * (bessi0(x) * bessk0(x) - bessi1(x) * bessk1(x)); }
void potential_double(int *ndim,double *pos,double *acc,double *pot,double *time) { double apar, qpar, spar, ppar, lpar, rpar, rcyl; int i; // 20070312 bwillett added ppar - the plummer denominator: r + rc = sqrt(x^2+y^2+z^2) + rc // 20070312 bwillett added lpar - the logarithmic argument: R^2 + (z/q)^2 + d^2 // 20070427 bwillett added rpar - the spherical radius: r + rc - rc = ppar - plu_rc // 20070501 bwillett added apar - a + qpar // 20070507 bwillett took out pow statements // 20070507 bwillett used hypot from math.h rcyl = hypot(pos[X],pos[Y]); ppar = sqrt ((pos[X]*pos[X])+(pos[Y]*pos[Y])+(pos[Z]*pos[Z])) + plu_rc; rpar = ppar - plu_rc; lpar = (rcyl*rcyl) + ((pos[Z]/q)*(pos[Z]/q)) + (d*d); // This is only valid for 3 dimensions, and is in (x,y,z) // Recall F_mu = -grad_mu U // So a_mu = -grad_mu Phi // I did these derivatives in Mathematica, and will try to keep it consistent with the conventions written above acc[X] = - ( ( (2.0*vhalo*vhalo*pos[X])/(lpar) ) + ( (plu_mass*pos[X])/(rpar*ppar*ppar) ) ); acc[Y] = - ( ( (2.0*vhalo*vhalo*pos[Y])/(lpar) ) + ( (plu_mass*pos[Y])/(rpar*ppar*ppar) ) ); acc[Z] = - ( ( (2.0*vhalo*vhalo*pos[Z])/(lpar) ) + ( (plu_mass*pos[Z])/(rpar*ppar*ppar) ) ); // Copied from expdisk.c double r2, r, arg, i0, k0, i1, k1, f; double alpha; alpha = 1.0/a; r = rpar; r2 = r*r; arg = 0.5*alpha*r; //printf("%f %f %f %f %f\n", a, mass, r, r2, x); i0=bessi0(arg); k0=bessk0(arg); i1=bessi1(arg); k1=bessk1(arg); // 20080928 - willeb added exponential disk to acceleration field *pot = -mass*arg*(i0*k1-i1*k0); f = -0.5*alpha*alpha*alpha*mass*(i0*k0-i1*k1); acc[X] += f*pos[X]; acc[Y] += f*pos[Y]; acc[Z] += f*pos[Z]; // 20080928 - willeb added bulge and halo to potential *pot += (-(plu_mass)/ppar); *pot += (vhalo*vhalo*log(lpar)); }
float bessk(int n, float x) { float bessk0(float x); float bessk1(float x); void nrerror(char error_text[]); int j; float bk,bkm,bkp,tox; if (n < 2) nrerror("Index n less than 2 in bessk"); tox=2.0/x; bkm=bessk0(x); bk=bessk1(x); for (j=1;j<n;j++) { bkp=bkm+j*tox*bk; bkm=bk; bk=bkp; } return bk; }
void potential_dummy_for_c(void) { double a,b,c; int spline(); double bessi0(), bessk0(), bessi1(), bessk1(); void get_atable(); void read_image(); error("potential.c: Cannot call dummy_for_c - included to fool linkers"); (void) spline(); (void) bessi0(); (void) bessk0(); (void) bessi1(); (void) sqr(1.0); stropen("/dev/null","w"); #ifndef NO_IMAGE read_image(); #endif get_atable(); }
static double pbar_PropagatorInfiniteR(double rSrc, double zSrc, double ek) { double distance; double propagator,kspal,kv,kd,cn,knL; int n,i; if (rSrc==0.) return 0; distance= sqrt(SQR(rSrc) + SQR(zSrc)); // n_terms_infinite_sum=1000000; // if (distance<L_dif/100.) return 1./(4.*M_PI*Kdif*distance); propagator=0.; kspal= 2.*h*Gtot/Kdif; kv=Vdif/(2.*Kdif); kd= (kspal + 2.*kv); for (n=0; ; n++) { double dPropagator; // if(n<=lastK) knL=kn[n]; else { knL= (n+0.5)*M_PI; cn=1; if(kd) { int nn; if(kd>0) nn=n+1; else nn=n; for(i=0; i<10; ++i) knL = nn*M_PI - atan(2.*knL/(kd*L_dif)); } // kn[n]=knL; // lastK=n; } cn= 1. - sin(2.*knL)/(2.*knL); dPropagator=bessk0(sqrt(SQR(knL/L_dif)+SQR(kv))*rSrc); propagator+=dPropagator*sin(knL*(L_dif-zSrc)/L_dif)*sin(knL)/cn; if(fabs(dPropagator) <= 0.1*Eps*fabs(propagator)) break; } return propagator*exp(-kv*zSrc)/(2.*M_PI*Kdif*L_dif); }
int main(void) { char txt[MAXSTR]; int i,nval; float val,x; FILE *fp; if ((fp = fopen("fncval.dat","r")) == NULL) nrerror("Data file fncval.dat not found\n"); fgets(txt,MAXSTR,fp); while (strncmp(txt,"Modified Bessel Function K0",27)) { fgets(txt,MAXSTR,fp); if (feof(fp)) nrerror("Data not found in fncval.dat\n"); } fscanf(fp,"%d %*s",&nval); printf("\n%s\n",txt); printf("%5s %13s %18s \n","x","actual","bessk0(x)"); for (i=1;i<=nval;i++) { fscanf(fp,"%f %f",&x,&val); printf("%6.2f %16.7e %16.7e\n",x,val,bessk0(x)); } fclose(fp); return 0; }