/* vm[nocc,ngrids] = ao[i,ngrids] * dm[i,nocc] */ void VXCdot_ao_dm(double *vm, double *ao, double *dm, int nao, int nocc, int ngrids, int nbas, unsigned char *non0table, int *shls_slice, int *ao_loc) { const int nblk = (ngrids+BLKSIZE-1) / BLKSIZE; #pragma omp parallel { int ip, ib; #pragma omp for nowait schedule(static) for (ib = 0; ib < nblk; ib++) { ip = ib * BLKSIZE; dot_ao_dm(vm+ip, ao+ip, dm, nao, nocc, ngrids, MIN(ngrids-ip, BLKSIZE), non0table+ib*nbas, shls_slice, ao_loc); } } }
/* vm[ngrids,nocc] = ao[ngrids,i] * dm[i,nocc] */ void VXCdot_ao_dm(double *vm, double *ao, double *dm, int nao, int nocc, int ngrids, int blksize, char *non0table, int *atm, int natm, int *bas, int nbas, double *env) { const int nblk = (ngrids+blksize-1) / blksize; int ip, ib; #pragma omp parallel default(none) \ shared(vm, ao, dm, nao, nocc, ngrids, blksize, non0table, \ atm, natm, bas, nbas, env) \ private(ip, ib) #pragma omp for nowait schedule(static) for (ib = 0; ib < nblk; ib++) { ip = ib * blksize; dot_ao_dm(vm+ip*nocc, ao+ip*nao, dm, nao, nocc, MIN(ngrids-ip, blksize), non0table+ib*nbas, atm, natm, bas, nbas, env); } }