72#include "./base/base_uses.f90"
78 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_dispersion_pairpot'
101 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_dispersion_pairpot_init'
103 CHARACTER(LEN=2) :: symbol
104 CHARACTER(LEN=default_path_length) :: filename
105 CHARACTER(LEN=default_string_length) :: aname, error_msg
106 CHARACTER(LEN=default_string_length), &
107 DIMENSION(:),
POINTER :: tmpstringlist
108 INTEGER :: elem, handle, i, ikind, j, max_elem, &
109 maxc, n_rep, nkind, nl, vdw_pp_type, &
111 INTEGER,
DIMENSION(:),
POINTER :: exlist
112 LOGICAL :: at_end, explicit, found, is_available
117 CALL timeset(routinen, handle)
119 nkind =
SIZE(atomic_kind_set)
121 vdw_type = dispersion_env%type
122 SELECT CASE (vdw_type)
127 vdw_pp_type = dispersion_env%type
128 SELECT CASE (dispersion_env%pp_type)
134 CALL get_atomic_kind(atomic_kind_set(ikind), element_symbol=symbol, z=elem)
138 filename = dispersion_env%parameter_file_name
141 IF (
PRESENT(pp_section))
THEN
145 c_vals=tmpstringlist)
146 IF (trim(tmpstringlist(1)) == trim(symbol))
THEN
148 READ (tmpstringlist(2), *) disp%c6
149 READ (tmpstringlist(3), *) disp%vdw_radii
155 IF (.NOT. found)
THEN
157 CALL dftd2_param(elem, disp%c6, disp%vdw_radii, found)
159 IF (.NOT. found)
THEN
161 INQUIRE (file=filename, exist=is_available)
162 IF (is_available)
THEN
171 IF (trim(aname) == trim(symbol))
THEN
176 disp%vdw_radii = disp%vdw_radii*
bohr
186 disp%defined = .true.
188 disp%defined = .false.
191 IF (.NOT. disp%defined) &
192 CALL cp_abort(__location__, &
193 "Dispersion parameters for element ("//trim(symbol)//
") are not defined! "// &
194 "Please provide a valid set of parameters through the input section or "// &
195 "through an external file! ")
196 CALL set_qs_kind(qs_kind_set(ikind), dispersion=disp)
206 dispersion_env%max_elem = max_elem
207 dispersion_env%maxc = maxc
208 ALLOCATE (dispersion_env%maxci(max_elem))
209 ALLOCATE (dispersion_env%c6ab(max_elem, max_elem, maxc, maxc, 3))
210 ALLOCATE (dispersion_env%r0ab(max_elem, max_elem))
211 ALLOCATE (dispersion_env%rcov(max_elem))
212 ALLOCATE (dispersion_env%eneg(max_elem))
213 ALLOCATE (dispersion_env%r2r4(max_elem))
214 ALLOCATE (dispersion_env%cn(max_elem))
216 IF (dispersion_env%d3_reference_code)
THEN
218 dispersion_env%r0ab, dispersion_env%rcov, &
219 dispersion_env%r2r4, &
220 dispersion_env%pp_type, dispersion_env%ref_functional, &
221 dispersion_env%s6, dispersion_env%s8, &
222 dispersion_env%a1, dispersion_env%a2, &
223 dispersion_env%sr6, para_env, error=error_msg, &
224 calc_scaling=.NOT. dispersion_env%d3_scaling_explicit)
225 IF (error_msg /=
"")
THEN
226 CALL cp_abort(__location__, error_msg)
229 filename = dispersion_env%parameter_file_name
230 CALL dftd3_c6_param(dispersion_env%c6ab, dispersion_env%maxci, filename, para_env)
231 CALL setrcov(dispersion_env%rcov)
232 CALL setr0ab(dispersion_env%r0ab, dispersion_env%rcov, dispersion_env%r2r4)
235 CALL seten(dispersion_env%eneg)
237 CALL setcn(dispersion_env%cn)
244 IF (.NOT. dispersion_env%d3_reference_code)
THEN
246 dum = 0.5_dp*dispersion_env%r2r4(i)*real(i,
dp)**0.5_dp
248 dispersion_env%r2r4(i) = sqrt(dum)
252 dispersion_env%k1 = 16.0_dp
253 dispersion_env%k2 = 4._dp/3._dp
261 dispersion_env%k3 = -4._dp
262 IF (.NOT. dispersion_env%d3_reference_code)
THEN
263 dispersion_env%rcov = dispersion_env%k2*dispersion_env%rcov*
bohr
266 dispersion_env%alp = 14._dp
269 CALL get_atomic_kind(atomic_kind_set(ikind), element_symbol=symbol, z=elem)
272 IF (elem <= max_elem)
THEN
273 disp%defined = .true.
275 disp%defined = .false.
277 IF (.NOT. disp%defined) &
278 CALL cp_abort(__location__, &
279 "Dispersion parameters for element ("//trim(symbol)//
") are not defined! "// &
280 "Please provide a valid set of parameters through the input section or "// &
281 "through an external file! ")
282 CALL set_qs_kind(qs_kind_set(ikind), dispersion=disp)
285 IF (
PRESENT(pp_section))
THEN
289 ALLOCATE (dispersion_env%cnkind(n_rep))
292 c_vals=tmpstringlist)
293 READ (tmpstringlist(1), *) dispersion_env%cnkind(i)%cnum
294 READ (tmpstringlist(2), *) dispersion_env%cnkind(i)%kind
299 ALLOCATE (dispersion_env%cnlist(n_rep))
302 c_vals=tmpstringlist)
303 nl =
SIZE(tmpstringlist)
304 ALLOCATE (dispersion_env%cnlist(i)%atom(nl - 1))
305 dispersion_env%cnlist(i)%natom = nl - 1
306 READ (tmpstringlist(1), *) dispersion_env%cnlist(i)%cnum
308 READ (tmpstringlist(j + 1), *) dispersion_env%cnlist(i)%atom(j)
316 DO j = 1,
SIZE(exlist)
318 CALL get_qs_kind(qs_kind_set(ikind), dispersion=disp)
319 disp%defined = .false.
323 dispersion_env%nd3_exclude_pair = n_rep
325 ALLOCATE (dispersion_env%d3_exclude_pair(n_rep, 2))
329 dispersion_env%d3_exclude_pair(i, :) = exlist
339 CALL get_atomic_kind(atomic_kind_set(ikind), element_symbol=symbol, z=elem)
342 disp%defined = .true.
343 CALL set_qs_kind(qs_kind_set(ikind), dispersion=disp)
348 dispersion_env%max_elem = max_elem
349 dispersion_env%maxc = maxc
350 ALLOCATE (dispersion_env%maxci(max_elem))
351 ALLOCATE (dispersion_env%rcov(max_elem))
352 ALLOCATE (dispersion_env%eneg(max_elem))
353 ALLOCATE (dispersion_env%cn(max_elem))
355 CALL setrcov(dispersion_env%rcov)
357 CALL setcn(dispersion_env%cn)
359 CALL seten(dispersion_env%eneg)
361 dispersion_env%k1 = 16.0_dp
362 dispersion_env%k2 = 4._dp/3._dp
363 dispersion_env%k3 = -4._dp
364 dispersion_env%rcov = dispersion_env%k2*dispersion_env%rcov*
bohr
365 dispersion_env%alp = 14._dp
367 dispersion_env%cnfun = 3
368 IF (dispersion_env%rc_cn < 0.0_dp)
THEN
371 IF (
PRESENT(pp_section))
THEN
378 CALL timestop(handle)
392 TYPE(qs_environment_type),
POINTER :: qs_env
393 TYPE(qs_dispersion_type),
POINTER :: dispersion_env
394 REAL(kind=dp),
INTENT(INOUT) :: energy
395 LOGICAL,
INTENT(IN) :: calculate_forces
396 REAL(kind=dp),
DIMENSION(:),
OPTIONAL :: atevdw
398 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calculate_dispersion_pairpot'
400 INTEGER :: atom_a, handle, iatom, ikind, iw, natom, &
402 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, kind_of
403 LOGICAL :: atenergy, atex, debugall, use_virial
404 REAL(kind=dp) :: evdw, gnorm
405 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:) :: atomic_energy
406 REAL(kind=dp),
DIMENSION(3) :: fdij
407 REAL(kind=dp),
DIMENSION(3, 3) :: dvirial, pv_loc, pv_virial_thread
408 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
409 TYPE(atprop_type),
POINTER :: atprop
410 TYPE(cell_type),
POINTER :: cell
411 TYPE(cp_logger_type),
POINTER :: logger
412 TYPE(mp_para_env_type),
POINTER :: para_env
413 TYPE(qs_force_type),
DIMENSION(:),
POINTER :: force
414 TYPE(virial_type),
POINTER :: virial
420 IF (dispersion_env%type /= xc_vdw_fun_pairpot)
THEN
424 CALL timeset(routinen, handle)
426 NULLIFY (atomic_kind_set)
428 CALL get_qs_env(qs_env=qs_env, nkind=nkind, natom=natom, atomic_kind_set=atomic_kind_set, &
429 cell=cell, virial=virial, para_env=para_env, atprop=atprop)
431 debugall = dispersion_env%verbose
434 logger => cp_get_default_logger()
435 IF (
ASSOCIATED(dispersion_env%dftd_section))
THEN
436 unit_nr = cp_print_key_unit_nr(logger, dispersion_env%dftd_section,
"PRINT_DFTD", &
443 atenergy = atprop%energy
446 IF (
PRESENT(atevdw))
THEN
450 IF (unit_nr > 0)
THEN
452 WRITE (unit_nr, *)
" Pair potential vdW calculation"
453 IF (dispersion_env%pp_type == vdw_pairpot_dftd2)
THEN
454 WRITE (unit_nr, *)
" Dispersion potential type: DFT-D2"
455 WRITE (unit_nr, *)
" Scaling parameter (s6) ", dispersion_env%scaling
456 WRITE (unit_nr, *)
" Exponential prefactor ", dispersion_env%exp_pre
457 ELSE IF (dispersion_env%pp_type == vdw_pairpot_dftd3)
THEN
458 WRITE (unit_nr, *)
" Dispersion potential type: DFT-D3"
459 ELSE IF (dispersion_env%pp_type == vdw_pairpot_dftd3bj)
THEN
460 WRITE (unit_nr, *)
" Dispersion potential type: DFT-D3(BJ)"
461 ELSE IF (dispersion_env%pp_type == vdw_pairpot_dftd4)
THEN
462 WRITE (unit_nr, *)
" Dispersion potential type: DFT-D4"
466 CALL get_qs_env(qs_env=qs_env, force=force)
467 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
468 IF (use_virial .AND. debugall)
THEN
469 dvirial = virial%pv_virial
472 pv_loc = virial%pv_virial
476 pv_virial_thread(:, :) = 0._dp
478 CALL get_atomic_kind_set(atomic_kind_set, atom_of_kind=atom_of_kind, kind_of=kind_of)
480 IF (dispersion_env%pp_type == vdw_pairpot_dftd2)
THEN
481 CALL calculate_dispersion_d2_pairpot(qs_env, dispersion_env, evdw, calculate_forces, atevdw)
482 ELSEIF (dispersion_env%pp_type == vdw_pairpot_dftd3 .OR. &
483 dispersion_env%pp_type == vdw_pairpot_dftd3bj)
THEN
484 CALL calculate_dispersion_d3_pairpot(qs_env, dispersion_env, evdw, calculate_forces, &
486 ELSEIF (dispersion_env%pp_type == vdw_pairpot_dftd4)
THEN
487 IF (dispersion_env%lrc)
THEN
488 cpabort(
"Long range correction with DFTD4 not implemented")
490 IF (dispersion_env%srb)
THEN
491 cpabort(
"Short range bond correction with DFTD4 not implemented")
493 IF (dispersion_env%domol)
THEN
494 cpabort(
"Molecular approximation with DFTD4 not implemented")
498 IF (dispersion_env%verbose) iw = cp_logger_get_default_io_unit(logger)
500 IF (atenergy .OR. atex)
THEN
501 ALLOCATE (atomic_energy(natom))
502 CALL calculate_dispersion_d4_pairpot(qs_env, dispersion_env, evdw, calculate_forces, &
503 iw, atomic_energy=atomic_energy)
505 CALL calculate_dispersion_d4_pairpot(qs_env, dispersion_env, evdw, calculate_forces, iw)
509 atevdw(1:natom) = atomic_energy(1:natom)
512 CALL atprop_array_init(atprop%atevdw, natom)
513 atprop%atevdw(1:natom) = atomic_energy(1:natom)
515 IF (atenergy .OR. atex)
THEN
516 DEALLOCATE (atomic_energy)
521 CALL para_env%sum(evdw)
523 IF (unit_nr > 0)
THEN
524 WRITE (unit_nr, *)
" Total vdW energy [au] :", evdw
525 WRITE (unit_nr, *)
" Total vdW energy [kcal] :", evdw*kcalmol
528 IF (calculate_forces .AND. debugall)
THEN
529 IF (unit_nr > 0)
THEN
530 WRITE (unit_nr, *)
" Dispersion Forces "
531 WRITE (unit_nr, *)
" Atom Kind Forces "
535 ikind = kind_of(iatom)
536 atom_a = atom_of_kind(iatom)
537 fdij(1:3) = force(ikind)%dispersion(:, atom_a)
538 CALL para_env%sum(fdij)
539 gnorm = gnorm + sum(abs(fdij))
540 IF (unit_nr > 0)
WRITE (unit_nr,
"(i5,i7,3F20.14)") iatom, ikind, fdij
542 IF (unit_nr > 0)
THEN
544 WRITE (unit_nr, *)
"|G| = ", gnorm
548 dvirial = virial%pv_virial - dvirial
549 CALL para_env%sum(dvirial)
550 IF (unit_nr > 0)
THEN
551 WRITE (unit_nr, *)
"Stress Tensor (dispersion)"
552 WRITE (unit_nr,
"(3G20.12)") dvirial
553 WRITE (unit_nr, *)
" Tr(P)/3 : ", (dvirial(1, 1) + dvirial(2, 2) + dvirial(3, 3))/3._dp
559 IF (calculate_forces .AND. use_virial)
THEN
560 virial%pv_vdw = virial%pv_vdw + (virial%pv_virial - pv_loc)
563 IF (
ASSOCIATED(dispersion_env%dftd_section))
THEN
564 CALL cp_print_key_finished_output(unit_nr, logger, dispersion_env%dftd_section,
"PRINT_DFTD")
567 CALL timestop(handle)
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind_set(atomic_kind_set, atom_of_kind, kind_of, natom_of_kind, maxatom, natom, nshell, fist_potential_present, shell_present, shell_adiabatic, shell_check_distance, damping_present)
Get attributes of an atomic kind set.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
Holds information on atomic properties.
subroutine, public atprop_array_init(atarray, natom)
...
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public caldeweyher2020
integer, save, public grimme2006
integer, save, public caldeweyher2019
integer, save, public caldeweyher2017
integer, save, public goerigk2017
integer, save, public wittmann2024
integer, save, public grimme2011
integer, save, public grimme2010
Handles all functions related to the CELL.
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
Utility routines to read data from files. Kept as close as possible to the old parser because.
subroutine, public parser_get_next_line(parser, nline, at_end)
Read the next input line and broadcast the input information. Skip (nline-1) lines and skip also all ...
Utility routines to read data from files. Kept as close as possible to the old parser because.
subroutine, public parser_release(parser)
releases the parser
subroutine, public parser_create(parser, file_name, unit_nr, para_env, end_section_label, separator_chars, comment_char, continuation_char, quote_char, section_char, parse_white_lines, initial_variables, apply_preprocessing)
Start a parser run. Initial variables allow to @SET stuff before opening the file.
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
Interface to the message passing library MPI.
Definition of physical constants:
real(kind=dp), parameter, public kcalmol
real(kind=dp), parameter, public kjmol
real(kind=dp), parameter, public bohr
Coordination number routines for dispersion pairpotentials.
real(kind=dp) function, public get_cn_radius(dispersion_env)
...
subroutine, public setr0ab(rout, rcov, r2r4)
...
subroutine, public setrcov(rcov)
...
subroutine, public seten(enout)
...
subroutine, public setcn(cnout)
...
Calculation of D2 dispersion.
subroutine, public calculate_dispersion_d2_pairpot(qs_env, dispersion_env, evdw, calculate_forces, atevdw)
...
subroutine, public dftd2_param(z, c6, r, found)
...
Calculation of D3 dispersion.
subroutine, public dftd3_c6_param(c6ab, maxci, filename, para_env)
...
subroutine, public calculate_dispersion_d3_pairpot(qs_env, dispersion_env, evdw, calculate_forces, unit_nr, atevdw)
...
Calculation of dispersion using pair potentials.
subroutine, public calculate_dispersion_d4_pairpot(qs_env, dispersion_env, evdw, calculate_forces, iw, atomic_energy)
...
Calculation of dispersion using pair potentials.
subroutine, public qs_dispersion_pairpot_init(atomic_kind_set, qs_kind_set, dispersion_env, pp_section, para_env)
...
subroutine, public calculate_dispersion_pairpot(qs_env, dispersion_env, energy, calculate_forces, atevdw)
...
subroutine, public dftd3_param_from_library(c6ab, maxci, r0ab, rcov, r2r4, pp_type, ref_functional, s6, s8, a1, a2, sr6, para_env, error, calc_scaling)
...
Definition of disperson types for DFT calculations.
integer, parameter, public dftd2_pp
integer, parameter, public dftd4_pp
integer, parameter, public dftd3_pp
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, mimic, 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, sab_cneo, 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, xcint_weights, 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, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_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, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_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, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public set_qs_kind(qs_kind, paw_atom, ghost, floating, hard_radius, hard0_radius, covalent_radius, vdw_radius, lmax_rho0, zeff, no_optimize, dispersion, u_minus_j, reltmat, dftb_parameter, xtb_parameter, elec_conf, pao_basis_size)
Set the components of an atomic kind data set.
Provides all information about an atomic kind.
type for the atomic properties
Type defining parameters related to the simulation cell.
type of a logger, at the moment it contains just a print level starting at which level it should be l...
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.