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; }
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
SUMOReal Ni(int n,int i) { SUMOReal ni; ni = factrl(n)/(factrl(i)*factrl(n-i)); return ni; }
/** * 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))); }
/* 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) */ } } }