Beispiel #1
0
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;
}
Beispiel #2
0
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;
}