110 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_vhxc_dbasis
113 INTEGER,
INTENT(IN) :: lambda
115 CHARACTER(len=*),
PARAMETER :: routinen =
'integrate_v_dbasis'
117 INTEGER :: bcol, brow, handle, i, iatom, igrid_level, ikind, ikind_old, ilevel, img, ipair, &
118 ipgf, ipgf_new, iset, iset_new, iset_old, itask, ithread, jatom, jkind, jkind_old, jpgf, &
119 jpgf_new, jset, jset_new, jset_old, maxco, maxpgf, maxset, maxsgf_set, na1, na2, natom, &
120 nb1, nb2, ncoa, ncob, nimages, nkind, nseta, nsetb, nthread, sgfa, sgfb
121 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: block_touched
122 INTEGER,
DIMENSION(:),
POINTER :: la_max, la_min, lb_max, lb_min, npgfa, &
124 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa, first_sgfb
125 LOGICAL :: atom_pair_changed, atom_pair_done, dh_duplicated, distributed_grids, found, &
126 my_compute_tau, new_set_pair_coming, pab_required, scatter, use_subpatch
127 REAL(kind=
dp) :: eps_rho_rspace, f, prefactor, radius, &
129 REAL(kind=
dp),
DIMENSION(3) :: force_a, force_b, ra, rab, rab_inv, rb, &
131 REAL(kind=
dp),
DIMENSION(3, 3) :: my_virial_a, my_virial_b
132 REAL(kind=
dp),
DIMENSION(:),
POINTER :: set_radius_a, set_radius_b
133 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: h_block, hab, p_block, pab, rpgfa, &
134 rpgfb, sphi_a, sphi_b, work, zeta, zetb
135 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: habt, hadb, hdab, pabt, workt
136 REAL(kind=
dp),
DIMENSION(:, :, :, :),
POINTER :: hadbt, hdabt
137 TYPE(
atom_pair_type),
DIMENSION(:),
POINTER :: atom_pair_recv, atom_pair_send
139 TYPE(
block_p_type),
ALLOCATABLE,
DIMENSION(:) :: vhxc_block
149 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
154 TYPE(
task_type),
DIMENSION(:),
POINTER :: tasks
156 CALL timeset(routinen, handle)
160 CALL get_qs_env(qs_env=qs_env, task_list=task_list)
161 cpassert(
ASSOCIATED(task_list))
169 gridlevel_info => pw_env%gridlevel_info
173 atomic_kind_set=atomic_kind_set, &
174 qs_kind_set=qs_kind_set, &
177 dft_control=dft_control, &
178 particle_set=particle_set)
181 cpassert(.NOT. dft_control%qs_control%gapw)
184 cpassert(
ASSOCIATED(pw_env))
185 CALL pw_env_get(pw_env, rs_descs=rs_descs, rs_grids=rs_rho)
186 DO igrid_level = 1, gridlevel_info%ngrid_levels
187 distributed_grids = rs_rho(igrid_level)%desc%distributed
190 group = rs_rho(1)%desc%group
195 nkind =
SIZE(qs_kind_set)
199 maxsgf_set=maxsgf_set, &
203 tasks => task_list%tasks
204 atom_pair_send => task_list%atom_pair_send
205 atom_pair_recv => task_list%atom_pair_recv
208 eps_rho_rspace = dft_control%qs_control%eps_rho_rspace
213 ALLOCATE (deltap(dft_control%nimages))
214 IF (distributed_grids)
THEN
217 CALL dbcsr_copy(deltap(1)%matrix, matrix_p, name=
"DeltaP")
219 deltap(1)%matrix => matrix_p
225 NULLIFY (pabt, habt, workt)
226 ALLOCATE (habt(maxco, maxco, 0:nthread))
227 ALLOCATE (workt(maxco, maxsgf_set, 0:nthread))
228 ALLOCATE (hdabt(3, maxco, maxco, 0:nthread))
229 ALLOCATE (hadbt(3, maxco, maxco, 0:nthread))
230 ALLOCATE (pabt(maxco, maxco, 0:nthread))
232 IF (distributed_grids)
THEN
234 nimages, scatter=.true.)
255 IF (.NOT.
ALLOCATED(vhxc_block))
ALLOCATE (vhxc_block(3))
259 work => workt(:, :, ithread)
260 hab => habt(:, :, ithread)
261 pab => pabt(:, :, ithread)
262 hdab => hdabt(:, :, :, ithread)
263 hadb => hadbt(:, :, :, ithread)
265 iset_old = -1; jset_old = -1
266 ikind_old = -1; jkind_old = -1
272 loop_gridlevels:
DO igrid_level = 1, gridlevel_info%ngrid_levels
275 loop_pairs:
DO ipair = 1, task_list%npairs(igrid_level)
276 loop_tasks:
DO itask = task_list%taskstart(ipair, igrid_level), task_list%taskstop(ipair, igrid_level)
277 ilevel = tasks(itask)%grid_level
278 img = tasks(itask)%image
279 iatom = tasks(itask)%iatom
280 jatom = tasks(itask)%jatom
281 iset = tasks(itask)%iset
282 jset = tasks(itask)%jset
283 ipgf = tasks(itask)%ipgf
284 jpgf = tasks(itask)%jpgf
287 IF (itask .EQ. task_list%taskstart(ipair, igrid_level))
THEN
289 ikind = particle_set(iatom)%atomic_kind%kind_number
290 jkind = particle_set(jatom)%atomic_kind%kind_number
292 ra(:) =
pbc(particle_set(iatom)%r, cell)
294 IF (iatom <= jatom)
THEN
302 IF (ikind .NE. ikind_old)
THEN
304 basis_set=orb_basis_set, basis_type=
"ORB")
307 first_sgf=first_sgfa, &
314 set_radius=set_radius_a, &
319 IF (jkind .NE. jkind_old)
THEN
321 basis_set=orb_basis_set, basis_type=
"ORB")
323 first_sgf=first_sgfb, &
330 set_radius=set_radius_b, &
337 NULLIFY (vhxc_block(i)%block)
338 CALL dbcsr_get_block_p(matrix_vhxc_dbasis(i)%matrix, brow, bcol, vhxc_block(i)%block, found)
343 row=brow, col=bcol, block=p_block, found=found)
349 atom_pair_changed = .true.
353 atom_pair_changed = .false.
357 IF (atom_pair_changed .OR. iset_old .NE. iset .OR. jset_old .NE. jset)
THEN
359 ncoa = npgfa(iset)*
ncoset(la_max(iset))
360 sgfa = first_sgfa(1, iset)
361 ncob = npgfb(jset)*
ncoset(lb_max(jset))
362 sgfb = first_sgfb(1, jset)
364 IF (iatom <= jatom)
THEN
365 work(1:ncoa, 1:nsgfb(jset)) = matmul(sphi_a(1:ncoa, sgfa:sgfa + nsgfa(iset) - 1), &
366 p_block(sgfa:sgfa + nsgfa(iset) - 1, sgfb:sgfb + nsgfb(jset) - 1))
367 pab(1:ncoa, 1:ncob) = matmul(work(1:ncoa, 1:nsgfb(jset)), transpose(sphi_b(1:ncob, sgfb:sgfb + nsgfb(jset) - 1)))
369 work(1:ncob, 1:nsgfa(iset)) = matmul(sphi_b(1:ncob, sgfb:sgfb + nsgfb(jset) - 1), &
370 p_block(sgfb:sgfb + nsgfb(jset) - 1, sgfa:sgfa + nsgfa(iset) - 1))
371 pab(1:ncob, 1:ncoa) = matmul(work(1:ncob, 1:nsgfa(iset)), transpose(sphi_a(1:ncoa, sgfa:sgfa + nsgfa(iset) - 1)))
374 IF (iatom <= jatom)
THEN
375 hab(1:ncoa, 1:ncob) = 0._dp
376 hdab(:, 1:ncoa, 1:ncob) = 0._dp
377 hadb(:, 1:ncoa, 1:ncob) = 0._dp
379 hab(1:ncob, 1:ncoa) = 0._dp
380 hdab(:, 1:ncob, 1:ncoa) = 0._dp
381 hadb(:, 1:ncob, 1:ncoa) = 0._dp
389 rab = tasks(itask)%rab
390 rb(:) = ra(:) + rab(:)
391 zetp = zeta(ipgf, iset) + zetb(jpgf, jset)
393 f = zetb(jpgf, jset)/zetp
394 rp(:) = ra(:) + f*rab(:)
395 prefactor = exp(-zeta(ipgf, iset)*f*dot_product(rab, rab))
397 lb_min=lb_min(jset), lb_max=lb_max(jset), &
398 ra=ra, rb=rb, rp=rp, &
399 zetp=zetp, eps=eps_rho_rspace, &
400 prefactor=prefactor, cutoff=1.0_dp)
402 na1 = (ipgf - 1)*
ncoset(la_max(iset)) + 1
403 na2 = ipgf*
ncoset(la_max(iset))
404 nb1 = (jpgf - 1)*
ncoset(lb_max(jset)) + 1
405 nb2 = jpgf*
ncoset(lb_max(jset))
408 IF (rs_rho(igrid_level)%desc%distributed)
THEN
410 IF (tasks(itask)%dist_type .EQ. 2)
THEN
411 use_subpatch = .true.
413 use_subpatch = .false.
416 use_subpatch = .false.
419 IF (iatom <= jatom)
THEN
420 IF (iatom == lambda) &
422 la_max(iset), zeta(ipgf, iset), la_min(iset), &
423 lb_max(jset), zetb(jpgf, jset), lb_min(jset), &
424 ra, rab, rs_rho(igrid_level), &
425 hab, o1=na1 - 1, o2=nb1 - 1, &
427 calculate_forces=.true., &
428 compute_tau=.false., &
429 use_subpatch=use_subpatch, subpatch_pattern=tasks(itask)%subpatch_pattern, &
431 IF (jatom == lambda) &
433 la_max(iset), zeta(ipgf, iset), la_min(iset), &
434 lb_max(jset), zetb(jpgf, jset), lb_min(jset), &
435 ra, rab, rs_rho(igrid_level), &
436 hab, o1=na1 - 1, o2=nb1 - 1, &
438 calculate_forces=.true., &
439 compute_tau=.false., &
440 use_subpatch=use_subpatch, subpatch_pattern=tasks(itask)%subpatch_pattern, &
444 IF (iatom == lambda) &
446 lb_max(jset), zetb(jpgf, jset), lb_min(jset), &
447 la_max(iset), zeta(ipgf, iset), la_min(iset), &
448 rb, rab_inv, rs_rho(igrid_level), &
449 hab, o1=nb1 - 1, o2=na1 - 1, &
451 calculate_forces=.true., &
452 force_a=force_b, force_b=force_a, &
453 compute_tau=.false., &
454 use_subpatch=use_subpatch, subpatch_pattern=tasks(itask)%subpatch_pattern, &
456 IF (jatom == lambda) &
458 lb_max(jset), zetb(jpgf, jset), lb_min(jset), &
459 la_max(iset), zeta(ipgf, iset), la_min(iset), &
460 rb, rab_inv, rs_rho(igrid_level), &
461 hab, o1=nb1 - 1, o2=na1 - 1, &
463 calculate_forces=.true., &
464 force_a=force_b, force_b=force_a, &
465 compute_tau=.false., &
466 use_subpatch=use_subpatch, subpatch_pattern=tasks(itask)%subpatch_pattern, &
470 new_set_pair_coming = .false.
471 atom_pair_done = .false.
472 IF (itask < task_list%taskstop(ipair, igrid_level))
THEN
473 ilevel = tasks(itask + 1)%grid_level
474 img = tasks(itask + 1)%image
475 iatom = tasks(itask + 1)%iatom
476 jatom = tasks(itask + 1)%jatom
477 iset_new = tasks(itask + 1)%iset
478 jset_new = tasks(itask + 1)%jset
479 ipgf_new = tasks(itask + 1)%ipgf
480 jpgf_new = tasks(itask + 1)%jpgf
481 IF (iset_new .NE. iset .OR. jset_new .NE. jset)
THEN
482 new_set_pair_coming = .true.
486 new_set_pair_coming = .true.
487 atom_pair_done = .true.
490 IF (new_set_pair_coming)
THEN
493 hdab(i, :, :) = hdab(i, :, :) + hadb(i, :, :)
494 IF (iatom <= jatom)
THEN
495 work(1:ncoa, 1:nsgfb(jset)) = matmul(hdab(i, 1:ncoa, 1:ncob), sphi_b(1:ncob, sgfb:sgfb + nsgfb(jset) - 1))
496 vhxc_block(i)%block(sgfa:sgfa + nsgfa(iset) - 1, sgfb:sgfb + nsgfb(jset) - 1) = &
497 vhxc_block(i)%block(sgfa:sgfa + nsgfa(iset) - 1, sgfb:sgfb + nsgfb(jset) - 1) + &
498 matmul(transpose(sphi_a(1:ncoa, sgfa:sgfa + nsgfa(iset) - 1)), work(1:ncoa, 1:nsgfb(jset)))
500 work(1:ncob, 1:nsgfa(iset)) = matmul(hdab(i, 1:ncob, 1:ncoa), sphi_a(1:ncoa, sgfa:sgfa + nsgfa(iset) - 1))
501 vhxc_block(i)%block(sgfb:sgfb + nsgfb(jset) - 1, sgfa:sgfa + nsgfa(iset) - 1) = &
502 vhxc_block(i)%block(sgfb:sgfb + nsgfb(jset) - 1, sgfa:sgfa + nsgfa(iset) - 1) + &
503 matmul(transpose(sphi_b(1:ncob, sgfb:sgfb + nsgfb(jset) - 1)), work(1:ncob, 1:nsgfa(iset)))
516 END DO loop_gridlevels
520 IF (distributed_grids)
THEN
525 dft_control%nimages, scatter=.false.)
528 IF (distributed_grids)
THEN
531 DO img = 1, dft_control%nimages
532 NULLIFY (deltap(img)%matrix)
537 DEALLOCATE (pabt, habt, workt, hdabt, hadbt)
539 CALL timestop(handle)
575 qs_env, calculate_forces, force_adm, &
576 compute_tau, gapw, basis_type, pw_env_external, task_list_external)
586 LOGICAL,
INTENT(IN) :: calculate_forces
587 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: force_adm
588 LOGICAL,
INTENT(IN),
OPTIONAL :: compute_tau, gapw
589 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: basis_type
590 TYPE(
pw_env_type),
OPTIONAL,
POINTER :: pw_env_external
593 CHARACTER(len=*),
PARAMETER :: routinen =
'integrate_v_rspace'
595 CHARACTER(len=default_string_length) :: my_basis_type
596 INTEGER :: atom_a, handle, iatom, igrid_level, &
597 ikind, img, maxco, maxsgf_set, natoms, &
599 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, kind_of
600 LOGICAL :: calculate_virial, distributed_grids, &
601 do_kp, my_compute_tau, my_gapw, &
603 REAL(kind=
dp) :: admm_scal_fac
604 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: forces_array
605 REAL(kind=
dp),
DIMENSION(3, 3) :: virial_matrix
608 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: deltap, dhmat
615 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
620 CALL timeset(routinen, handle)
623 cpassert(
PRESENT(hmat) .OR.
PRESENT(hmat_kp))
625 IF (
PRESENT(hmat_kp)) do_kp = .true.
626 IF (
PRESENT(pmat))
THEN
627 cpassert(
PRESENT(hmat))
628 ELSE IF (
PRESENT(pmat_kp))
THEN
629 cpassert(
PRESENT(hmat_kp))
637 my_compute_tau = .false.
638 IF (
PRESENT(compute_tau)) my_compute_tau = compute_tau
643 IF (
PRESENT(gapw)) my_gapw = gapw
644 IF (
PRESENT(basis_type))
THEN
645 my_basis_type = basis_type
647 my_basis_type =
"ORB"
655 task_list=task_list, &
656 task_list_soft=task_list_soft)
657 IF (.NOT. my_basis_type ==
"ORB")
THEN
658 cpassert(
PRESENT(task_list_external))
660 IF (my_gapw) task_list => task_list_soft
661 IF (
PRESENT(task_list_external)) task_list => task_list_external
662 cpassert(
ASSOCIATED(task_list))
668 IF (
PRESENT(pw_env_external)) pw_env => pw_env_external
672 atomic_kind_set=atomic_kind_set, &
673 qs_kind_set=qs_kind_set, &
676 dft_control=dft_control, &
677 particle_set=particle_set, &
681 admm_scal_fac = 1.0_dp
682 IF (
PRESENT(force_adm)) admm_scal_fac = force_adm
684 cpassert(
ASSOCIATED(pw_env))
688 group = rs_v(1)%desc%group
691 gridlevel_info => pw_env%gridlevel_info
696 nimages = dft_control%nimages
697 IF (nimages > 1)
THEN
700 nkind =
SIZE(qs_kind_set)
701 calculate_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer) .AND. calculate_forces
702 pab_required = (
PRESENT(pmat) .OR.
PRESENT(pmat_kp)) .AND. calculate_forces
706 maxsgf_set=maxsgf_set, &
707 basis_type=my_basis_type)
709 distributed_grids = .false.
710 DO igrid_level = 1, gridlevel_info%ngrid_levels
711 IF (rs_v(igrid_level)%desc%distributed)
THEN
712 distributed_grids = .true.
716 ALLOCATE (forces_array(3, natoms))
718 IF (pab_required)
THEN
720 ALLOCATE (deltap(nimages))
723 deltap(img)%matrix => pmat_kp(img)%matrix
726 deltap(1)%matrix => pmat%matrix
730 IF (distributed_grids)
THEN
740 compute_tau=my_compute_tau, &
741 calculate_forces=calculate_forces, &
742 calculate_virial=calculate_virial, &
743 pab_blocks=task_list%pab_buffer, &
745 hab_blocks=task_list%hab_buffer, &
746 forces=forces_array, &
747 virial=virial_matrix)
749 IF (calculate_forces)
THEN
754 atom_a = atom_of_kind(iatom)
755 ikind = kind_of(iatom)
756 force(ikind)%rho_elec(:, atom_a) = force(ikind)%rho_elec(:, atom_a) + admm_scal_fac*forces_array(:, iatom)
759 DEALLOCATE (atom_of_kind, kind_of)
762 IF (calculate_virial)
THEN
763 virial%pv_virial = virial%pv_virial + admm_scal_fac*virial_matrix
767 ALLOCATE (dhmat(nimages))
768 IF (
PRESENT(hmat_kp))
THEN
769 cpassert(.NOT.
PRESENT(hmat))
771 dhmat(img)%matrix => hmat_kp(img)%matrix
774 cpassert(
PRESENT(hmat) .AND. nimages == 1)
775 dhmat(1)%matrix => hmat%matrix
779 IF (distributed_grids)
THEN
786 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.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.