80 basis_j, basis_k, basis_i, &
81 cell_j, cell_k, cell_i, atom_j, atom_k, atom_i, &
82 j_bf_start_from_atom, k_bf_start_from_atom, &
85 REAL(kind=
dp),
DIMENSION(:, :, :) :: int_3c
89 INTEGER,
DIMENSION(3),
INTENT(IN),
OPTIONAL :: cell_j, cell_k, cell_i
90 INTEGER,
INTENT(IN),
OPTIONAL :: atom_j, atom_k, atom_i
91 INTEGER,
DIMENSION(:),
OPTIONAL :: j_bf_start_from_atom, &
92 k_bf_start_from_atom, &
95 CHARACTER(LEN=*),
PARAMETER :: routinen =
'build_3c_integral_block'
97 INTEGER :: at_i, at_j, at_k, block_end_i, block_end_j, block_end_k, block_start_i, &
98 block_start_j, block_start_k, egfi, handle, i, i_offset, ibasis, ikind, ilist,
imax, is, &
99 iset, j_offset, jkind, js, jset, k_offset, kkind, ks, kset, m_max, max_ncoi, max_ncoj, &
100 max_ncok, max_nset, max_nsgfi, max_nsgfj, max_nsgfk, maxli, maxlj, maxlk, natom, nbasis, &
101 ncoi, ncoj, ncok, nseti, nsetj, nsetk, op_ij, op_jk, sgfi, sgfj, sgfk, unit_id
102 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kind_of
103 INTEGER,
DIMENSION(3) :: my_cell_i, my_cell_j, my_cell_k
104 INTEGER,
DIMENSION(:),
POINTER :: lmax_i, lmax_j, lmax_k, lmin_i, lmin_j, &
105 lmin_k, npgfi, npgfj, npgfk, nsgfi, &
107 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgf_i, first_sgf_j, first_sgf_k
108 REAL(kind=
dp) :: dij, dik, djk, dr_ij, dr_ik, dr_jk, &
109 kind_radius_i, kind_radius_j, &
110 kind_radius_k, sijk_ext
111 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: ccp_buffer, cpp_buffer, &
112 max_contraction_i, max_contraction_j, &
114 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: sijk, sijk_contr
115 REAL(kind=
dp),
DIMENSION(3) :: ri, rij, rik, rj, rjk, rk
116 REAL(kind=
dp),
DIMENSION(3, 3) :: hmat
117 REAL(kind=
dp),
DIMENSION(:),
POINTER :: set_radius_i, set_radius_j, set_radius_k
118 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: rpgf_i, rpgf_j, rpgf_k, sphi_i, sphi_j, &
119 sphi_k, zeti, zetj, zetk
128 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
130 CALL timeset(routinen, handle)
132 op_ij = potential_parameter%potential_type
135 dr_ij = 0.0_dp; dr_jk = 0.0_dp; dr_ik = 0.0_dp
145 NULLIFY (qs_kind_set, atomic_kind_set)
148 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, cell=cell, &
149 natom=natom, dft_control=dft_control, para_env=para_env, &
150 particle_set=particle_set)
155 nbasis =
SIZE(basis_i)
160 DO ibasis = 1, nbasis
162 nset=iset, nsgf_set=nsgfi, npgf=npgfi)
163 maxli = max(maxli,
imax)
164 max_nset = max(max_nset, iset)
165 max_nsgfi = max(max_nsgfi, maxval(nsgfi))
166 max_ncoi = max(max_ncoi, maxval(npgfi)*
ncoset(maxli))
171 DO ibasis = 1, nbasis
173 nset=jset, nsgf_set=nsgfj, npgf=npgfj)
174 maxlj = max(maxlj,
imax)
175 max_nset = max(max_nset, jset)
176 max_nsgfj = max(max_nsgfj, maxval(nsgfj))
177 max_ncoj = max(max_ncoj, maxval(npgfj)*
ncoset(maxlj))
182 DO ibasis = 1, nbasis
184 nset=kset, nsgf_set=nsgfk, npgf=npgfk)
185 maxlk = max(maxlk,
imax)
186 max_nset = max(max_nset, kset)
187 max_nsgfk = max(max_nsgfk, maxval(nsgfk))
188 max_ncok = max(max_ncok, maxval(npgfk)*
ncoset(maxlk))
190 m_max = maxli + maxlj + maxlk
195 NULLIFY (tspj, spi, spk)
196 ALLOCATE (spi(max_nset, nbasis), tspj(max_nset, nbasis), spk(max_nset, nbasis))
198 DO ibasis = 1, nbasis
199 DO iset = 1, max_nset
200 NULLIFY (spi(iset, ibasis)%array)
201 NULLIFY (tspj(iset, ibasis)%array)
203 NULLIFY (spk(iset, ibasis)%array)
208 DO ibasis = 1, nbasis
209 IF (ilist == 1) basis_set => basis_i(ibasis)%gto_basis_set
210 IF (ilist == 2) basis_set => basis_j(ibasis)%gto_basis_set
211 IF (ilist == 3) basis_set => basis_k(ibasis)%gto_basis_set
213 DO iset = 1, basis_set%nset
215 ncoi = basis_set%npgf(iset)*
ncoset(basis_set%lmax(iset))
216 sgfi = basis_set%first_sgf(1, iset)
217 egfi = sgfi + basis_set%nsgf_set(iset) - 1
220 ALLOCATE (spi(iset, ibasis)%array(ncoi, basis_set%nsgf_set(iset)))
221 spi(iset, ibasis)%array(:, :) = basis_set%sphi(1:ncoi, sgfi:egfi)
223 ELSE IF (ilist == 2)
THEN
224 ALLOCATE (tspj(iset, ibasis)%array(basis_set%nsgf_set(iset), ncoi))
225 tspj(iset, ibasis)%array(:, :) = transpose(basis_set%sphi(1:ncoi, sgfi:egfi))
228 ALLOCATE (spk(iset, ibasis)%array(ncoi, basis_set%nsgf_set(iset)))
229 spk(iset, ibasis)%array(:, :) = basis_set%sphi(1:ncoi, sgfi:egfi)
240 IF (para_env%mepos == 0)
THEN
241 CALL open_file(unit_number=unit_id, file_name=potential_parameter%filename)
243 CALL init(m_max, unit_id, para_env%mepos, para_env)
244 IF (para_env%mepos == 0)
THEN
256 ALLOCATE (cpp_buffer(max_nsgfj*max_ncok), ccp_buffer(max_nsgfj*max_nsgfk*max_ncoi))
257 int_3c(:, :, :) = 0.0_dp
268 IF (
PRESENT(atom_i))
THEN
269 IF (at_i .NE. atom_i) cycle
271 IF (
PRESENT(atom_j))
THEN
272 IF (at_j .NE. atom_j) cycle
274 IF (
PRESENT(atom_k))
THEN
275 IF (at_k .NE. atom_k) cycle
279 IF (
PRESENT(cell_i)) my_cell_i(1:3) = cell_i(1:3)
281 IF (
PRESENT(cell_j)) my_cell_j(1:3) = cell_j(1:3)
283 IF (
PRESENT(cell_k)) my_cell_k(1:3) = cell_k(1:3)
285 ri =
pbc(particle_set(at_i)%r(1:3), cell) + matmul(hmat, real(my_cell_i,
dp))
286 rj =
pbc(particle_set(at_j)%r(1:3), cell) + matmul(hmat, real(my_cell_j,
dp))
287 rk =
pbc(particle_set(at_k)%r(1:3), cell) + matmul(hmat, real(my_cell_k,
dp))
289 rjk(1:3) = rk(1:3) - rj(1:3)
290 rij(1:3) = rj(1:3) - ri(1:3)
291 rik(1:3) = rk(1:3) - ri(1:3)
297 ikind = kind_of(at_i)
298 jkind = kind_of(at_j)
299 kkind = kind_of(at_k)
302 lmax=lmax_i, lmin=lmin_i, npgf=npgfi, nset=nseti, &
303 nsgf_set=nsgfi, pgf_radius=rpgf_i, set_radius=set_radius_i, &
304 sphi=sphi_i, zet=zeti, kind_radius=kind_radius_i)
307 lmax=lmax_j, lmin=lmin_j, npgf=npgfj, nset=nsetj, &
308 nsgf_set=nsgfj, pgf_radius=rpgf_j, set_radius=set_radius_j, &
309 sphi=sphi_j, zet=zetj, kind_radius=kind_radius_j)
312 lmax=lmax_k, lmin=lmin_k, npgf=npgfk, nset=nsetk, &
313 nsgf_set=nsgfk, pgf_radius=rpgf_k, set_radius=set_radius_k, &
314 sphi=sphi_k, zet=zetk, kind_radius=kind_radius_k)
316 IF (kind_radius_j + kind_radius_i + dr_ij < dij) cycle
317 IF (kind_radius_j + kind_radius_k + dr_jk < djk) cycle
318 IF (kind_radius_k + kind_radius_i + dr_ik < dik) cycle
320 ALLOCATE (max_contraction_i(nseti))
321 max_contraction_i = 0.0_dp
323 sgfi = first_sgf_i(1, iset)
324 max_contraction_i(iset) = maxval((/(sum(abs(sphi_i(:, i))), i=sgfi, &
325 sgfi + nsgfi(iset) - 1)/))
328 ALLOCATE (max_contraction_j(nsetj))
329 max_contraction_j = 0.0_dp
331 sgfj = first_sgf_j(1, jset)
332 max_contraction_j(jset) = maxval((/(sum(abs(sphi_j(:, i))), i=sgfj, &
333 sgfj + nsgfj(jset) - 1)/))
336 ALLOCATE (max_contraction_k(nsetk))
337 max_contraction_k = 0.0_dp
339 sgfk = first_sgf_k(1, kset)
340 max_contraction_k(kset) = maxval((/(sum(abs(sphi_k(:, i))), i=sgfk, &
341 sgfk + nsgfk(kset) - 1)/))
348 IF (set_radius_j(jset) + set_radius_i(iset) + dr_ij < dij) cycle
352 IF (set_radius_j(jset) + set_radius_k(kset) + dr_jk < djk) cycle
353 IF (set_radius_k(kset) + set_radius_i(iset) + dr_ik < dik) cycle
355 ncoi = npgfi(iset)*
ncoset(lmax_i(iset))
356 ncoj = npgfj(jset)*
ncoset(lmax_j(jset))
357 ncok = npgfk(kset)*
ncoset(lmax_k(kset))
359 sgfi = first_sgf_i(1, iset)
360 sgfj = first_sgf_j(1, jset)
361 sgfk = first_sgf_k(1, kset)
363 IF (ncoj*ncok*ncoi .LE. 0) cycle
364 ALLOCATE (sijk(ncoj, ncok, ncoi))
365 sijk(:, :, :) = 0.0_dp
372 lmin_j(js), lmax_j(js), npgfj(js), zetj(:, js), &
374 lmin_k(ks), lmax_k(ks), npgfk(ks), zetk(:, ks), &
376 lmin_i(is), lmax_i(is), npgfi(is), zeti(:, is), &
378 djk, dij, dik, lib, potential_parameter, &
379 int_abc_ext=sijk_ext)
381 ALLOCATE (sijk_contr(nsgfj(jset), nsgfk(kset), nsgfi(iset)))
383 spk(kset, kkind)%array, spi(iset, ikind)%array, &
384 ncoj, ncok, ncoi, nsgfj(jset), nsgfk(kset), &
385 nsgfi(iset), cpp_buffer, ccp_buffer)
388 IF (
PRESENT(atom_j))
THEN
391 cpassert(
PRESENT(j_bf_start_from_atom))
392 j_offset = j_bf_start_from_atom(at_j) - 1
394 IF (
PRESENT(atom_k))
THEN
397 cpassert(
PRESENT(k_bf_start_from_atom))
398 k_offset = k_bf_start_from_atom(at_k) - 1
400 IF (
PRESENT(atom_i))
THEN
403 cpassert(
PRESENT(i_bf_start_from_atom))
404 i_offset = i_bf_start_from_atom(at_i) - 1
407 block_start_j = sgfj + j_offset
408 block_end_j = sgfj + nsgfj(jset) - 1 + j_offset
409 block_start_k = sgfk + k_offset
410 block_end_k = sgfk + nsgfk(kset) - 1 + k_offset
411 block_start_i = sgfi + i_offset
412 block_end_i = sgfi + nsgfi(iset) - 1 + i_offset
414 int_3c(block_start_j:block_end_j, &
415 block_start_k:block_end_k, &
416 block_start_i:block_end_i) = &
417 int_3c(block_start_j:block_end_j, &
418 block_start_k:block_end_k, &
419 block_start_i:block_end_i) + &
421 DEALLOCATE (sijk_contr)
429 DEALLOCATE (max_contraction_i, max_contraction_j, max_contraction_k)
437 DO iset = 1, max_nset
438 DO ibasis = 1, nbasis
439 IF (
ASSOCIATED(spi(iset, ibasis)%array))
DEALLOCATE (spi(iset, ibasis)%array)
440 IF (
ASSOCIATED(tspj(iset, ibasis)%array))
DEALLOCATE (tspj(iset, ibasis)%array)
442 IF (
ASSOCIATED(spk(iset, ibasis)%array))
DEALLOCATE (spk(iset, ibasis)%array)
445 DEALLOCATE (spi, tspj, spk)
447 CALL timestop(handle)
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs)
Get the QUICKSTEP environment.