int GTOcontract_exp0(double *ectr, double *coord, double *alpha, double *coeff, int l, int nprim, int nctr, int blksize, double fac) { int i, j; double arr, maxc; double eprim[nprim*blksize]; double logcoeff[nprim]; double rr[blksize]; double *gridx = coord; double *gridy = coord+blksize; double *gridz = coord+blksize*2; double *peprim = eprim; int not0 = 0; // the maximum value of the coefficients for each pGTO for (j = 0; j < nprim; j++) { maxc = 0; for (i = 0; i < nctr; i++) { maxc = MAX(maxc, fabs(coeff[i*nprim+j])); } logcoeff[j] = log(maxc); } for (i = 0; i < blksize; i++) { rr[i] = gridx[i]*gridx[i] + gridy[i]*gridy[i] + gridz[i]*gridz[i]; } for (i = 0; i < blksize; i++) { for (j = 0; j < nprim; j++) { arr = alpha[j] * rr[i]; if (arr-logcoeff[j] < EXPCUTOFF) { peprim[j] = exp_cephes(-arr) * fac; not0 = 1; } else { peprim[j] = 0; } } peprim += nprim; } if (not0) { const char TRANS_T = 'T'; const char TRANS_N = 'N'; const double D0 = 0; const double D1 = 1; dgemm_(&TRANS_T, &TRANS_N, &blksize, &nctr, &nprim, &D1, eprim, &nprim, coeff, &nprim, &D0, ectr, &blksize); } else { memset(ectr, 0, sizeof(double)*nctr*blksize); } return not0; }
int GTOcontract_exp1(double *ectr, double *coord, double *alpha, double *coeff, int l, int nprim, int nctr, size_t ngrids, double fac) { size_t i, j, k; double arr, maxc, eprim; double logcoeff[nprim]; double rr[ngrids]; double *gridx = coord; double *gridy = coord+BLKSIZE; double *gridz = coord+BLKSIZE*2; double *ectr_2a = ectr + NPRIMAX*BLKSIZE; double coeff2a[nprim*nctr]; int not0 = 0; // the maximum value of the coefficients for each pGTO for (j = 0; j < nprim; j++) { maxc = 0; for (i = 0; i < nctr; i++) { maxc = MAX(maxc, fabs(coeff[i*nprim+j])); } logcoeff[j] = log(maxc); } for (i = 0; i < ngrids; i++) { rr[i] = gridx[i]*gridx[i] + gridy[i]*gridy[i] + gridz[i]*gridz[i]; } memset(ectr , 0, sizeof(double)*nctr*BLKSIZE); memset(ectr_2a, 0, sizeof(double)*nctr*BLKSIZE); // -2 alpha_i C_ij exp(-alpha_i r_k^2) for (i = 0; i < nctr; i++) { for (j = 0; j < nprim; j++) { coeff2a[i*nprim+j] = -2.*alpha[j] * coeff[i*nprim+j]; } } for (j = 0; j < nprim; j++) { for (i = 0; i < ngrids; i++) { arr = alpha[j] * rr[i]; if (arr-logcoeff[j] < EXPCUTOFF) { not0 = 1; eprim = exp_cephes(-arr) * fac; for (k = 0; k < nctr; k++) { ectr [k*BLKSIZE+i] += eprim * coeff [k*nprim+j]; ectr_2a[k*BLKSIZE+i] += eprim * coeff2a[k*nprim+j]; } } } } return not0; }