Esempio n. 1
0
double negbin(int i, double k, double mean)
{
	 double tmp1, tmp2, tmp3, result;

	 tmp1 = exp(gammln(k + i)) / (factrl(i) * exp(gammln(k)));
	 tmp2 = mean / (mean + k);
	 tmp3 = k / (k + mean);
	 if (tmp2 < 0) printf("Domain error: tmp2\n");
	 if (tmp3 < 0) printf("Domain error: tmp3\n");
	 result = tmp1 * pow(tmp2,(double)i) * pow(tmp3,k);
	 return result;
}
Esempio n. 2
0
double factrl(int n) {
  // returns n!, from Numerical recipies
  static int ntop=4;
  static double a[33]={1.0,1.0,2.0,6.0,24.0};

  if (n < 0) {
    cout << "\aNegative factorial in routine FACTRL\n";
    return log((double)(n)); // This produces a trapable error
  }
  if (n > 32) return factrl(double(n));
  while (ntop<n) { int j = ntop++; a[ntop]=a[j]*ntop; }
  return a[n];
} // factrl
Esempio n. 3
0
SUMOReal Ni(int n,int i) {
    SUMOReal ni;
    ni = factrl(n)/(factrl(i)*factrl(n-i));
    return ni;
}
Esempio n. 4
0
/**
 * Compute the binomial coefficient (n,k)
 * Taken from numerical recipes.
 **/
inline double bico(const int64 n, const int64 k)
{
    MTOOLS_ASSERT((n >= 0) || (k >= 0) || (k <= n));
    if (n < 171) return floor(0.5 + factrl(n) / (factrl(k)*factrl(n - k)));
    return floor(0.5 + exp(factln(n) - factln(k) - factln(n - k)));
}
Esempio n. 5
0
/* SCF init routine */
void SCF_init(void)
{
 int l, n, m;
 MyDouble K_nl, deltam0;
 Anltilde=(MyDouble*)mymalloc("Anltilde",(SCF_NMAX+1)*(SCF_LMAX+1)*sizeof(MyDouble));
 coeflm=(MyDouble*)mymalloc("coeflm",(SCF_LMAX+1)*(SCF_LMAX+1)*sizeof(MyDouble));
 cosmphi=(MyDouble*)mymalloc("cosmphi",(SCF_LMAX+1)*sizeof(MyDouble));
 sinmphi=(MyDouble*)mymalloc("sinmphi",(SCF_LMAX+1)*sizeof(MyDouble));
 ultrasp=(MyDouble*)mymalloc("ultrasp",(SCF_NMAX+1)*(SCF_LMAX+1)*sizeof(MyDouble));
 ultraspt=(MyDouble*)mymalloc("ultraspt",(SCF_NMAX+1)*(SCF_LMAX+1)*sizeof(MyDouble));
 ultrasp1=(MyDouble*)mymalloc("ultrasp1",(SCF_NMAX+1)*(SCF_LMAX+1)*sizeof(MyDouble));
 plm=(MyDouble*)mymalloc("plm",(SCF_LMAX+1)*(SCF_LMAX+1)*sizeof(MyDouble));
 dplm=(MyDouble*)mymalloc("dplm",(SCF_LMAX+1)*(SCF_LMAX+1)*sizeof(MyDouble));
 dblfact=(MyDouble*)mymalloc("dblfact",(SCF_LMAX+1)*sizeof(MyDouble));
 sinsum=(MyDouble*)mymalloc("sinsum",(SCF_NMAX+1)*(SCF_LMAX+1)*(SCF_LMAX+1)*sizeof(MyDouble));
 cossum=(MyDouble*)mymalloc("cossum",(SCF_NMAX+1)*(SCF_LMAX+1)*(SCF_LMAX+1)*sizeof(MyDouble));

#ifdef SCF_HYBRID
 sinsum_all=(MyDouble*)mymalloc("sinsum_all",(SCF_NMAX+1)*(SCF_LMAX+1)*(SCF_LMAX+1)*sizeof(MyDouble));
 cossum_all=(MyDouble*)mymalloc("cossum_all", (SCF_NMAX+1)*(SCF_LMAX+1)*(SCF_LMAX+1)*sizeof(MyDouble));

 int i;
 /* store masses in backup field */
 for (i = 0; i < NumPart; i++)
  P[i].MassBackup = P[i].Mass;
#endif

#ifdef SCF_SCALEFAC
 scalefac_nlm=(float*)mymalloc("sinsum_all",(SCF_NMAX+1)*(SCF_LMAX+1)*(SCF_LMAX+1)*sizeof(MyDouble));
 FILE *fd;

  if(!(fd = fopen("scf_scalefac.dat", "r")))
    {
      printf("Cannot read SCF scaling file `scf_scalefac.dat'\n");
      endrun(10121);
    }

 for  (n=0; n<=SCF_NMAX; n++)
  for  (l=0; l<=SCF_LMAX; l++)
   for  (m=0; m<=l; m++)
     fscanf(fd, "%g", (float*)&scalefac_nlm[nlm(n,l,m)]);
 fclose(fd);

#ifdef DEBUG
 if (ThisTask == 0)
  for  (n=0; n<=SCF_NMAX; n++)
   for  (l=0; l<=SCF_LMAX; l++)
    for  (m=0; m<=l; m++)
     printf("(%d,%d,%d) = %g\n", n,l,m,scalefac_nlm[nlm(n,l,m)]);
#endif

#endif

 Anltilde[0]=0.0;
 coeflm[0]=0.0;
 cosmphi[0]=0.0;
 sinmphi[0]=0.0;
 ultrasp[0]=0.0;
 ultraspt[0]=0.0;
 plm[0]=0.0;
 ultrasp1[0]=0.0;
 dplm[0]=0.0;
 dblfact[1]=1.; 

 /* set initial random number seed (global variable, so that all processors generate the same potential */
 scf_seed=42;
 
 for (l=2; l<=SCF_LMAX; l++) 
   dblfact[l]=dblfact[l-1]*(2.*l-1.);
 
 for (n=0; n<=SCF_NMAX; n++) 
   for (l=0; l<=SCF_LMAX; l++)
     Anltilde[nl(n,l)]=0.0;
  
 for (l=0; l<=SCF_LMAX; l++) 
   for (m=0; m<=l; m++) 
     coeflm[lm(l,m)]=0.0;

 for (n=0; n<=SCF_NMAX; n++) 
   for (l=0; l<=SCF_LMAX; l++) 
     {
      K_nl = 0.5*n*(n+4.*l+3.)+(l+1.)*(2.*l+1.); /* eq.(2.23) */
      Anltilde[nl(n,l)]=-pow(2.,8.*l+6.)*factrl(n)*(n+2.*l+1.5)*tgamma(2.*l+1.5)*tgamma(2.*l+1.5)/(4.*M_PI*K_nl*factrl(n+4*l+2)); 
     }
 
 for (l=0; l<=SCF_LMAX; l++) 
  {
   for (m=0; m<=l; ++m) 
    {
     deltam0=2.;
     if (m==0) deltam0=1.;
     coeflm[lm(l,m)]=(2.*l+1.)*deltam0*factrl(l-m)/factrl(l+m); /* N_lm   eq. (3.15) */
    }
  }
}