void eri_aux1 ( int l1,int l2,double a,double b,double gamma, double* H,double* dHda, double* dHdb, double* f, double* dfda, double* dfdb, int n_aux ){ int maxL = (l1+l2); // this is correct int L,i,r,l; binomial_expansion(l1,l2,a,b,f,dfda,dfdb, 1); // 1 - is_derivs zero_array(H,n_aux); zero_array(dHda,n_aux); zero_array(dHdb,n_aux); for(i=0;i<=maxL;i++){ for(r=0;r<=(i/2);r++){ //!!! Integer division L = i - 2*r; if(L>=0){ double prefact = ( (FACTORIAL(i)/(1.0*FACTORIAL(r)*FACTORIAL(L))) ) * FAST_POW((0.25/gamma),(i-r)); H[L] += prefact*f[i]; dHda[L] += prefact*dfda[i]; dHdb[L] += prefact*dfdb[i]; }// L>0 }// for r }// for i }
double sto_norm(int n, double alp){ // In fact, this is not the norm, but the normalization coefficient /* Meaning: if N - is a result of this function and S(n,l,m,alpha) = (r-center)^(n-1) * exp(-alp * (r - center)) is a STO then s = N * S(l,m,n,alp) - is normaized: integral(s,s) = 1.0 e.g. see: http://en.wikipedia.org/wiki/Slater-type_orbital */ double res = sqrt(2.0*alp/FACTORIAL(2*n))*FAST_POW(2.0*alp,n); // this is normalization factor return res; }
int main(void) { int ans = FACTORIAL(6); printf("%d\n", ans); return 0; }
//void Aux_Function6 void eri_aux2 ( int l1,int l2,int l3,int l4,double PA,double PB,double QC,double QD,double p,double gamma1,double gamma2, double* G, double* dGdA, double* dGdB, double* dGdC, double* dGdD, double* dGdp, double* HL,double* dHLda, double* dHLdb, double* HM,double* dHMda, double* dHMdb, double* f, double* dfda, double* dfdb, int n_aux ){ // This is C(G) function used in multiple summs for ERI calculations // dGdA = dG / dPA // dGdB = dG / dPB // dGdC = dG / dQC // dGdD = dG / dQD // dGdp = dG / dp zero_array(G,n_aux); zero_array(dGdA,n_aux); zero_array(dGdB,n_aux); zero_array(dGdC,n_aux); zero_array(dGdD,n_aux); zero_array(dGdp,n_aux); // This is C function used in multiple summs for ERI calculations int maxL = l1 + l2; int maxM = l3 + l4; eri_aux1(l1,l2,PA,PB,gamma1,HL,dHLda,dHLdb,f,dfda,dfdb,n_aux); // HL of size l1+l2 eri_aux1(l3,l4,QC,QD,gamma2,HM,dHMda,dHMdb,f,dfda,dfdb,n_aux); // HM of size l3+l4 double d = 0.25*((1.0/gamma1) + (1.0/gamma2)); int L,M,u; for(L=0;L<=maxL;L++){ for(M=0;M<=maxM;M++){ int maxU = ((L+M)/2); //INTEGER_DIVISION!!! "largest integer less of equal (L+M)/2" for(u=0;u<=maxU;u++){ int I = L + M - u; if(I>=0){ double prefac = FAST_POW(-1.0,(M+u)) * FACTORIAL(L+M)/ (1.0*FACTORIAL(u) * FACTORIAL(L+M-2*u) * FAST_POW(d,(L+M-u))); double fp = FAST_POW(p,(L+M-2*u)); G[I] += prefac * HL[L] * HM[M] * fp; dGdA[I] += prefac * dHLda[L] * HM[M] * fp; dGdB[I] += prefac * dHLdb[L] * HM[M] * fp; dGdC[I] += prefac * HL[L] * dHMda[M] * fp; dGdD[I] += prefac * HL[L] * dHMdb[M] * fp; if((L+M-2*u)>0){ // to avoid singularity when p = 0 dGdp[I] += (L+M-2*u) * prefac * HL[L] * HM[M] * FAST_POW(p,(L+M-2*u-1)); } } }// for u }// for M }// for L }// eri_aux2