Exemple #1
0
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));
}
Exemple #2
0
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;
}
Exemple #4
0
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();
}
Exemple #5
0
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;
}