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

}
Exemple #2
0
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;
}
Exemple #3
0
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