void AO2MOfill_nr_s4(int (*intor)(), int (*fprescreen)(), double *eri, double *buf, int nkl, int ish, struct _AO2MOEnvs *envs) { const int nao = envs->nao; const size_t nao2 = nao * (nao+1) / 2; const int *ao_loc = envs->ao_loc; const int klsh_start = envs->klsh_start; const int klsh_end = klsh_start + envs->klsh_count; const int di = ao_loc[ish+1] - ao_loc[ish]; const int ioff = ao_loc[ish] * (ao_loc[ish]+1) / 2; int kl, jsh, ksh, lsh, dj, dk, dl; int icomp; int shls[4]; double *pbuf = buf; double *peri; shls[0] = ish; for (kl = klsh_start; kl < klsh_end; kl++) { // kl = k * (k+1) / 2 + l ksh = (int)(sqrt(2*kl+.25) - .5 + 1e-7); lsh = kl - ksh * (ksh+1) / 2; dk = ao_loc[ksh+1] - ao_loc[ksh]; dl = ao_loc[lsh+1] - ao_loc[lsh]; shls[2] = ksh; shls[3] = lsh; if (ksh == lsh) { for (jsh = 0; jsh < ish; jsh++) { dj = ao_loc[jsh+1] - ao_loc[jsh]; shls[1] = jsh; DISTR_INTS_BY(s4_copy_keql, s4_set0_keql, ao_loc[ish]+1); } jsh = ish; dj = di; shls[1] = ish; DISTR_INTS_BY(s4_copy_keql_ieqj, s4_set0_keql_ieqj, ao_loc[ish]+1); eri += nao2 * dk*(dk+1)/2; } else { for (jsh = 0; jsh < ish; jsh++) { dj = ao_loc[jsh+1] - ao_loc[jsh]; shls[1] = jsh; DISTR_INTS_BY(s4_copy, s4_set0, ao_loc[ish]+1); } jsh = ish; dj = di; shls[1] = ish; DISTR_INTS_BY(s4_copy_ieqj, s4_set0_ieqj, ao_loc[ish]+1); eri += nao2 * dk * dl; } } }
void AO2MOfill_nr_s1(int (*intor)(), int (*fprescreen)(), double *eri, double *buf, int nkl, int ish, struct _AO2MOEnvs *envs) { const int nao = envs->nao; const size_t nao2 = nao * nao; const int *ao_loc = envs->ao_loc; const int klsh_start = envs->klsh_start; const int klsh_end = klsh_start + envs->klsh_count; const int di = ao_loc[ish+1] - ao_loc[ish]; const int ioff = ao_loc[ish] * nao; int kl, jsh, ksh, lsh, dj, dk, dl; int icomp; int shls[4]; double *pbuf, *peri; shls[0] = ish; for (kl = klsh_start; kl < klsh_end; kl++) { // kl = k * (k+1) / 2 + l ksh = kl / envs->nbas; lsh = kl - ksh * envs->nbas; dk = ao_loc[ksh+1] - ao_loc[ksh]; dl = ao_loc[lsh+1] - ao_loc[lsh]; shls[2] = ksh; shls[3] = lsh; for (jsh = 0; jsh < envs->nbas; jsh++) { dj = ao_loc[jsh+1] - ao_loc[jsh]; shls[1] = jsh; DISTR_INTS_BY(s1_copy, s1_set0, nao); } eri += nao2 * dk * dl; } }
void GTOnr2e_fill_s4(int (*intor)(), int (*fprescreen)(), double *eri, int ncomp, int ish, int jsh, struct _VHFEnvs *envs, int *ishloc, int *jshloc, int naoi, int naoj) { if (ish < jsh) { return; } int di = ishloc[ish+1] - ishloc[ish]; int dj = jshloc[jsh+1] - jshloc[jsh]; double *buf = malloc(sizeof(double)*di*dj*NCTRMAX*NCTRMAX*ncomp); int shls[4]; int ksh, lsh; shls[0] = ish; shls[1] = jsh; for (ksh = 0; ksh < envs->nbas; ksh++) { for (lsh = 0; lsh <= ksh; lsh++) { shls[2] = ksh; shls[3] = lsh; DISTR_INTS_BY(s4_copy, s4_set0); } } free(buf); }