FINT CINTinit_int3c1e_EnvVars(CINTEnvVars *envs, const FINT *ng, const FINT *shls, const FINT *atm, const FINT natm, const FINT *bas, const FINT nbas, const double *env) { envs->natm = natm; envs->nbas = nbas; envs->atm = atm; envs->bas = bas; envs->env = env; envs->shls = shls; const FINT i_sh = shls[0]; const FINT j_sh = shls[1]; const FINT k_sh = shls[2]; envs->i_l = bas(ANG_OF, i_sh); envs->j_l = bas(ANG_OF, j_sh); envs->k_l = bas(ANG_OF, k_sh); envs->i_prim = bas(NPRIM_OF, i_sh); envs->j_prim = bas(NPRIM_OF, j_sh); envs->k_prim = bas(NPRIM_OF, k_sh); envs->i_ctr = bas(NCTR_OF, i_sh); envs->j_ctr = bas(NCTR_OF, j_sh); envs->k_ctr = bas(NCTR_OF, k_sh); envs->nfi = CINTlen_cart(envs->i_l); envs->nfj = CINTlen_cart(envs->j_l); envs->nfk = CINTlen_cart(envs->k_l); envs->nf = envs->nfi * envs->nfj * envs->nfk; envs->ri = env + atm(PTR_COORD, bas(ATOM_OF, i_sh)); envs->rj = env + atm(PTR_COORD, bas(ATOM_OF, j_sh)); envs->rk = env + atm(PTR_COORD, bas(ATOM_OF, k_sh)); envs->gbits = ng[GSHIFT]; envs->ncomp_e1 = ng[POS_E1]; envs->ncomp_tensor = ng[TENSOR]; envs->li_ceil = envs->i_l + ng[IINC]; envs->lj_ceil = envs->j_l + ng[JINC]; envs->lk_ceil = envs->k_l + ng[KINC]; envs->common_factor = SQRTPI * M_PI * CINTcommon_fac_sp(envs->i_l) * CINTcommon_fac_sp(envs->j_l) * CINTcommon_fac_sp(envs->k_l); FINT dli = envs->li_ceil + 1; FINT dlj = envs->lj_ceil + envs->lk_ceil + 1; FINT dlk = envs->lk_ceil + 1; envs->g_stride_i = 1; envs->g_stride_j = dli; envs->g_stride_k = dli * dlj; FINT nmax = envs->li_ceil + dlj; envs->g_size = MAX(dli*dlj*dlk, dli*nmax); envs->rirj[0] = envs->ri[0] - envs->rj[0]; envs->rirj[1] = envs->ri[1] - envs->rj[1]; envs->rirj[2] = envs->ri[2] - envs->rj[2]; return 0; }
/* * 1e GTO integral basic loop for < i|j>, no 1/r */ FINT CINT1e_loop(double *gctr, CINTEnvVars *envs, double fac) { const FINT *shls = envs->shls; const FINT *atm = envs->atm; const FINT *bas = envs->bas; const double *env = envs->env; const FINT i_sh = shls[0]; const FINT j_sh = shls[1]; const FINT i_l = envs->i_l; const FINT j_l = envs->j_l; const FINT i_ctr = envs->i_ctr; const FINT j_ctr = envs->j_ctr; const FINT nfi = envs->nfi; const FINT nfj = envs->nfj; const FINT n_comp = envs->ncomp_e1 * envs->ncomp_tensor; const FINT nf = envs->nf; const double *ri = envs->ri; const double *rj = envs->rj; const double *ai = env + bas(PTR_EXP, i_sh); const double *aj = env + bas(PTR_EXP, j_sh); const double *ci = env + bas(PTR_COEFF, i_sh); const double *cj = env + bas(PTR_COEFF, j_sh); FINT ip, jp, n; FINT has_value = 0; FINT *const idx = malloc(sizeof(FINT) * nf * 3); double aij, dij, eij, rrij; double *g = malloc(sizeof(double) * envs->g_size * 3 * ((1<<envs->gbits)+1)); // +1 as buffer double *gout = malloc(sizeof(double) * nf * n_comp); double *gctri = malloc(sizeof(double) * nf * i_ctr * n_comp); CINTg1e_index_xyz(idx, envs); rrij = CINTsquare_dist(ri, rj); fac *= SQRTPI * M_PI * CINTcommon_fac_sp(i_l) * CINTcommon_fac_sp(j_l); for (jp = 0; jp < envs->j_prim; jp++) { envs->aj = aj[jp]; n = nf * i_ctr * n_comp; CINTdset0(n, gctri); for (ip = 0; ip < envs->i_prim; ip++) { envs->ai = ai[ip]; aij = ai[ip] + aj[jp]; eij = (ai[ip] * aj[jp] / aij) * rrij; if (eij > EXPCUTOFF) continue; has_value = 1; dij = exp(-eij) / (aij * sqrt(aij)) * fac; CINTg_ovlp(g, ai[ip], aj[jp], dij, envs); CINTdset0(nf * n_comp, gout); (*envs->f_gout)(g, gout, idx, envs); n = nf * n_comp; CINTprim_to_ctr(gctri, n, gout, 1, envs->i_prim, i_ctr, ci+ip); } n = nf * i_ctr; CINTprim_to_ctr(gctr, n, gctri, n_comp, envs->j_prim, j_ctr, cj+jp); } free(g); free(idx); free(gout); free(gctri); return has_value; }
FINT CINTinit_int3c2e_EnvVars(CINTEnvVars *envs, const FINT *ng, const FINT *shls, const FINT *atm, const FINT natm, const FINT *bas, const FINT nbas, const double *env) { envs->natm = natm; envs->nbas = nbas; envs->atm = atm; envs->bas = bas; envs->env = env; envs->shls = shls; const FINT i_sh = shls[0]; const FINT j_sh = shls[1]; const FINT k_sh = shls[2]; envs->i_l = bas(ANG_OF, i_sh); envs->j_l = bas(ANG_OF, j_sh); envs->k_l = bas(ANG_OF, k_sh); envs->i_prim = bas(NPRIM_OF, i_sh); envs->j_prim = bas(NPRIM_OF, j_sh); envs->k_prim = bas(NPRIM_OF, k_sh); envs->i_ctr = bas(NCTR_OF, i_sh); envs->j_ctr = bas(NCTR_OF, j_sh); envs->k_ctr = bas(NCTR_OF, k_sh); envs->nfi = CINTlen_cart(envs->i_l); envs->nfj = CINTlen_cart(envs->j_l); envs->nfk = CINTlen_cart(envs->k_l); envs->nf = envs->nfi * envs->nfk * envs->nfj; envs->ri = env + atm(PTR_COORD, bas(ATOM_OF, i_sh)); envs->rj = env + atm(PTR_COORD, bas(ATOM_OF, j_sh)); envs->rk = env + atm(PTR_COORD, bas(ATOM_OF, k_sh)); envs->common_factor = (M_PI*M_PI*M_PI)*2/SQRTPI * CINTcommon_fac_sp(envs->i_l) * CINTcommon_fac_sp(envs->j_l) * CINTcommon_fac_sp(envs->k_l); envs->gbits = ng[GSHIFT]; envs->ncomp_e1 = ng[POS_E1]; envs->ncomp_tensor = ng[TENSOR]; envs->li_ceil = envs->i_l + ng[IINC]; envs->lj_ceil = envs->j_l + ng[JINC]; envs->lk_ceil = envs->k_l + ng[KINC]; envs->ll_ceil = 0; // to reuse CINTg0_2e_2d envs->nrys_roots =(envs->li_ceil + envs->lj_ceil + envs->lk_ceil)/2 + 1; assert(i_sh < SHLS_MAX); assert(j_sh < SHLS_MAX); assert(k_sh < SHLS_MAX); assert(envs->i_l < ANG_MAX); assert(envs->j_l < ANG_MAX); assert(envs->k_l < ANG_MAX); assert(envs->i_ctr < NCTR_MAX); assert(envs->j_ctr < NCTR_MAX); assert(envs->k_ctr < NCTR_MAX); assert(envs->i_prim < NPRIM_MAX); assert(envs->j_prim < NPRIM_MAX); assert(envs->k_prim < NPRIM_MAX); assert(envs->i_prim >= envs->i_ctr); assert(envs->j_prim >= envs->j_ctr); assert(envs->k_prim >= envs->k_ctr); assert(bas(ATOM_OF,i_sh) >= 0); assert(bas(ATOM_OF,j_sh) >= 0); assert(bas(ATOM_OF,k_sh) >= 0); assert(bas(ATOM_OF,i_sh) < natm); assert(bas(ATOM_OF,j_sh) < natm); assert(bas(ATOM_OF,k_sh) < natm); assert(envs->nrys_roots < MXRYSROOTS); CINTset_g3c2e_params(envs); return 0; }
/* * 1e GTO integral basic loop for < i|1/r|j>, no 1/r * if nuc_id >= 0: nuclear attraction, use nuclear model * if nuc_id < 0: 1/r potential, do not use nuclear model */ FINT CINT1e_nuc_loop(double *gctr, CINTEnvVars *envs, double fac, FINT nuc_id) { const FINT *shls = envs->shls; const FINT *atm = envs->atm; const FINT *bas = envs->bas; const double *env = envs->env; const FINT i_sh = shls[0]; const FINT j_sh = shls[1]; const FINT i_l = envs->i_l; const FINT j_l = envs->j_l; const FINT i_ctr = envs->i_ctr; const FINT j_ctr = envs->j_ctr; const FINT nfi = envs->nfi; const FINT nfj = envs->nfj; const FINT nf = envs->nf; const FINT n_comp = envs->ncomp_e1 * envs->ncomp_tensor; const double *ri = envs->ri; const double *rj = envs->rj; const double *ai = env + bas(PTR_EXP, i_sh); const double *aj = env + bas(PTR_EXP, j_sh); const double *ci = env + bas(PTR_COEFF, i_sh); const double *cj = env + bas(PTR_COEFF, j_sh); FINT ip, jp, i, n; FINT has_value = 0; double tau; const double *cr; double (*f_nuc_mod)(); double x, u[MXRYSROOTS], w[MXRYSROOTS]; FINT *const idx = malloc(sizeof(FINT) * nf * 3); double rij[3], aij, dij, eij, rrij, t2; double *g = malloc(sizeof(double) * envs->g_size * 3 * ((1<<envs->gbits)+1)); // +1 as buffer double *const gout = malloc(sizeof(double) * nf * n_comp); double *const gctri = malloc(sizeof(double) * nf * i_ctr * n_comp); if (nuc_id < 0) { cr = &env[PTR_RINV_ORIG]; f_nuc_mod = CINTno_nuc_mod; } else { cr = &env[atm(PTR_COORD, nuc_id)], f_nuc_mod = CINTnuc_mod; } CINTg1e_index_xyz(idx, envs); rrij = CINTsquare_dist(ri, rj); fac *= 2 * M_PI * CINTcommon_fac_sp(i_l) * CINTcommon_fac_sp(j_l); for (jp = 0; jp < envs->j_prim; jp++) { envs->aj = aj[jp]; n = nf * i_ctr * n_comp; CINTdset0(n, gctri); for (ip = 0; ip < envs->i_prim; ip++) { envs->ai = ai[ip]; aij = ai[ip] + aj[jp]; eij = (ai[ip] * aj[jp] / aij) * rrij; if (eij > EXPCUTOFF) continue; has_value = 1; rij[0] = (ai[ip] * ri[0] + aj[jp] * rj[0]) / aij; rij[1] = (ai[ip] * ri[1] + aj[jp] * rj[1]) / aij; rij[2] = (ai[ip] * ri[2] + aj[jp] * rj[2]) / aij; tau = (*f_nuc_mod)(aij, nuc_id, atm, env); x = aij * CINTsquare_dist(rij, cr) * tau * tau; CINTrys_roots(envs->nrys_roots, x, u, w); dij = exp(-eij) / aij * fac; CINTdset0(nf * n_comp, gout); for (i = 0; i < envs->nrys_roots; i++) { t2 = u[i] / (1 + u[i]) * tau * tau; CINTg_nuc(g, aij, rij, cr, t2, dij * w[i] * tau, envs); (*envs->f_gout)(g, gout, idx, envs); } n = nf * n_comp; CINTprim_to_ctr(gctri, n, gout, 1, envs->i_prim, i_ctr, ci+ip); } n = nf * i_ctr; CINTprim_to_ctr(gctr, n, gctri, n_comp, envs->j_prim, j_ctr, cj+jp); } free(g); free(idx); free(gout); free(gctri); return has_value; }