75#include "./base/base_uses.f90"
81 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_dispersion_pairpot'
104 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_dispersion_pairpot_init'
106 CHARACTER(LEN=2) :: symbol
107 CHARACTER(LEN=default_string_length) :: aname, filename
108 CHARACTER(LEN=default_string_length), &
109 DIMENSION(:),
POINTER :: tmpstringlist
110 INTEGER :: elem, handle, i, ikind, j, max_elem, &
111 maxc, n_rep, nkind, nl, vdw_pp_type, &
113 INTEGER,
DIMENSION(:),
POINTER :: exlist
114 LOGICAL :: at_end, explicit, found, is_available
119 CALL timeset(routinen, handle)
121 nkind =
SIZE(atomic_kind_set)
123 vdw_type = dispersion_env%type
124 SELECT CASE (vdw_type)
129 vdw_pp_type = dispersion_env%type
130 SELECT CASE (dispersion_env%pp_type)
136 CALL get_atomic_kind(atomic_kind_set(ikind), element_symbol=symbol, z=elem)
140 filename = dispersion_env%parameter_file_name
143 IF (
PRESENT(pp_section))
THEN
147 c_vals=tmpstringlist)
148 IF (trim(tmpstringlist(1)) == trim(symbol))
THEN
150 READ (tmpstringlist(2), *) disp%c6
151 READ (tmpstringlist(3), *) disp%vdw_radii
157 IF (.NOT. found)
THEN
159 CALL dftd2_param(elem, disp%c6, disp%vdw_radii, found)
161 IF (.NOT. found)
THEN
163 INQUIRE (file=filename, exist=is_available)
164 IF (is_available)
THEN
173 IF (trim(aname) == trim(symbol))
THEN
178 disp%vdw_radii = disp%vdw_radii*
bohr
188 disp%defined = .true.
190 disp%defined = .false.
193 IF (.NOT. disp%defined) &
194 CALL cp_abort(__location__, &
195 "Dispersion parameters for element ("//trim(symbol)//
") are not defined! "// &
196 "Please provide a valid set of parameters through the input section or "// &
197 "through an external file! ")
198 CALL set_qs_kind(qs_kind_set(ikind), dispersion=disp)
207 dispersion_env%max_elem = max_elem
208 dispersion_env%maxc = maxc
209 ALLOCATE (dispersion_env%maxci(max_elem))
210 ALLOCATE (dispersion_env%c6ab(max_elem, max_elem, maxc, maxc, 3))
211 ALLOCATE (dispersion_env%r0ab(max_elem, max_elem))
212 ALLOCATE (dispersion_env%rcov(max_elem))
213 ALLOCATE (dispersion_env%eneg(max_elem))
214 ALLOCATE (dispersion_env%r2r4(max_elem))
215 ALLOCATE (dispersion_env%cn(max_elem))
218 filename = dispersion_env%parameter_file_name
219 CALL dftd3_c6_param(dispersion_env%c6ab, dispersion_env%maxci, filename, para_env)
220 CALL setr0ab(dispersion_env%r0ab, dispersion_env%rcov, dispersion_env%r2r4)
222 CALL seten(dispersion_env%eneg)
224 CALL setcn(dispersion_env%cn)
232 dum = 0.5_dp*dispersion_env%r2r4(i)*real(i,
dp)**0.5_dp
234 dispersion_env%r2r4(i) = sqrt(dum)
237 dispersion_env%k1 = 16.0_dp
238 dispersion_env%k2 = 4._dp/3._dp
246 dispersion_env%k3 = -4._dp
247 dispersion_env%rcov = dispersion_env%k2*dispersion_env%rcov*
bohr
249 dispersion_env%alp = 14._dp
252 CALL get_atomic_kind(atomic_kind_set(ikind), element_symbol=symbol, z=elem)
256 disp%defined = .true.
258 disp%defined = .false.
260 IF (.NOT. disp%defined) &
261 CALL cp_abort(__location__, &
262 "Dispersion parameters for element ("//trim(symbol)//
") are not defined! "// &
263 "Please provide a valid set of parameters through the input section or "// &
264 "through an external file! ")
265 CALL set_qs_kind(qs_kind_set(ikind), dispersion=disp)
268 IF (
PRESENT(pp_section))
THEN
272 ALLOCATE (dispersion_env%cnkind(n_rep))
275 c_vals=tmpstringlist)
276 READ (tmpstringlist(1), *) dispersion_env%cnkind(i)%cnum
277 READ (tmpstringlist(2), *) dispersion_env%cnkind(i)%kind
282 ALLOCATE (dispersion_env%cnlist(n_rep))
285 c_vals=tmpstringlist)
286 nl =
SIZE(tmpstringlist)
287 ALLOCATE (dispersion_env%cnlist(i)%atom(nl - 1))
288 dispersion_env%cnlist(i)%natom = nl - 1
289 READ (tmpstringlist(1), *) dispersion_env%cnlist(i)%cnum
291 READ (tmpstringlist(j + 1), *) dispersion_env%cnlist(i)%atom(j)
299 DO j = 1,
SIZE(exlist)
301 CALL get_qs_kind(qs_kind_set(ikind), dispersion=disp)
302 disp%defined = .false.
306 dispersion_env%nd3_exclude_pair = n_rep
308 ALLOCATE (dispersion_env%d3_exclude_pair(n_rep, 2))
312 dispersion_env%d3_exclude_pair(i, :) = exlist
322 CALL get_atomic_kind(atomic_kind_set(ikind), element_symbol=symbol, z=elem)
325 disp%defined = .true.
326 CALL set_qs_kind(qs_kind_set(ikind), dispersion=disp)
331 dispersion_env%max_elem = max_elem
332 dispersion_env%maxc = maxc
333 ALLOCATE (dispersion_env%maxci(max_elem))
334 ALLOCATE (dispersion_env%rcov(max_elem))
335 ALLOCATE (dispersion_env%eneg(max_elem))
336 ALLOCATE (dispersion_env%cn(max_elem))
338 CALL setrcov(dispersion_env%rcov)
340 CALL setcn(dispersion_env%cn)
342 CALL seten(dispersion_env%eneg)
344 dispersion_env%k1 = 16.0_dp
345 dispersion_env%k2 = 4._dp/3._dp
346 dispersion_env%k3 = -4._dp
347 dispersion_env%rcov = dispersion_env%k2*dispersion_env%rcov*
bohr
348 dispersion_env%alp = 14._dp
350 dispersion_env%cnfun = 3
352 IF (
PRESENT(pp_section))
THEN
359 CALL timestop(handle)
373 TYPE(qs_environment_type),
POINTER :: qs_env
374 TYPE(qs_dispersion_type),
POINTER :: dispersion_env
375 REAL(kind=dp),
INTENT(INOUT) :: energy
376 LOGICAL,
INTENT(IN) :: calculate_forces
377 REAL(kind=dp),
DIMENSION(:),
OPTIONAL :: atevdw
379 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calculate_dispersion_pairpot'
381 INTEGER :: atom_a, handle, iatom, ikind, iw, natom, &
383 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, kind_of
384 LOGICAL :: atenergy, atex, debugall, use_virial
385 REAL(kind=dp) :: evdw, gnorm
386 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:) :: atomic_energy
387 REAL(kind=dp),
DIMENSION(3) :: fdij
388 REAL(kind=dp),
DIMENSION(3, 3) :: dvirial, pv_loc, pv_virial_thread
389 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
390 TYPE(atprop_type),
POINTER :: atprop
391 TYPE(cell_type),
POINTER :: cell
392 TYPE(cp_logger_type),
POINTER :: logger
393 TYPE(mp_para_env_type),
POINTER :: para_env
394 TYPE(qs_force_type),
DIMENSION(:),
POINTER :: force
395 TYPE(virial_type),
POINTER :: virial
401 IF (dispersion_env%type .NE. xc_vdw_fun_pairpot)
THEN
405 CALL timeset(routinen, handle)
407 NULLIFY (atomic_kind_set)
409 CALL get_qs_env(qs_env=qs_env, nkind=nkind, natom=natom, atomic_kind_set=atomic_kind_set, &
410 cell=cell, virial=virial, para_env=para_env, atprop=atprop)
412 debugall = dispersion_env%verbose
415 logger => cp_get_default_logger()
416 IF (
ASSOCIATED(dispersion_env%dftd_section))
THEN
417 unit_nr = cp_print_key_unit_nr(logger, dispersion_env%dftd_section,
"PRINT_DFTD", &
424 atenergy = atprop%energy
427 IF (
PRESENT(atevdw))
THEN
431 IF (unit_nr > 0)
THEN
433 WRITE (unit_nr, *)
" Pair potential vdW calculation"
434 IF (dispersion_env%pp_type == vdw_pairpot_dftd2)
THEN
435 WRITE (unit_nr, *)
" Dispersion potential type: DFT-D2"
436 WRITE (unit_nr, *)
" Scaling parameter (s6) ", dispersion_env%scaling
437 WRITE (unit_nr, *)
" Exponential prefactor ", dispersion_env%exp_pre
438 ELSE IF (dispersion_env%pp_type == vdw_pairpot_dftd3)
THEN
439 WRITE (unit_nr, *)
" Dispersion potential type: DFT-D3"
440 ELSE IF (dispersion_env%pp_type == vdw_pairpot_dftd3bj)
THEN
441 WRITE (unit_nr, *)
" Dispersion potential type: DFT-D3(BJ)"
442 ELSE IF (dispersion_env%pp_type == vdw_pairpot_dftd4)
THEN
443 WRITE (unit_nr, *)
" Dispersion potential type: DFT-D4"
447 CALL get_qs_env(qs_env=qs_env, force=force)
448 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
449 IF (use_virial .AND. debugall)
THEN
450 dvirial = virial%pv_virial
453 pv_loc = virial%pv_virial
457 pv_virial_thread(:, :) = 0._dp
459 CALL get_atomic_kind_set(atomic_kind_set, atom_of_kind=atom_of_kind, kind_of=kind_of)
461 IF (dispersion_env%pp_type == vdw_pairpot_dftd2)
THEN
462 CALL calculate_dispersion_d2_pairpot(qs_env, dispersion_env, evdw, calculate_forces, atevdw)
463 ELSEIF (dispersion_env%pp_type == vdw_pairpot_dftd3 .OR. &
464 dispersion_env%pp_type == vdw_pairpot_dftd3bj)
THEN
465 CALL calculate_dispersion_d3_pairpot(qs_env, dispersion_env, evdw, calculate_forces, &
467 ELSEIF (dispersion_env%pp_type == vdw_pairpot_dftd4)
THEN
468 IF (dispersion_env%lrc)
THEN
469 cpabort(
"Long range correction with DFTD4 not implemented")
471 IF (dispersion_env%srb)
THEN
472 cpabort(
"Short range bond correction with DFTD4 not implemented")
474 IF (dispersion_env%domol)
THEN
475 cpabort(
"Molecular approximation with DFTD4 not implemented")
479 IF (dispersion_env%verbose) iw = cp_logger_get_default_io_unit(logger)
481 IF (atenergy .OR. atex)
THEN
482 ALLOCATE (atomic_energy(natom))
483 CALL calculate_dispersion_d4_pairpot(qs_env, dispersion_env, evdw, calculate_forces, &
484 iw, atomic_energy=atomic_energy)
486 CALL calculate_dispersion_d4_pairpot(qs_env, dispersion_env, evdw, calculate_forces, iw)
490 atevdw(1:natom) = atomic_energy(1:natom)
493 CALL atprop_array_init(atprop%atevdw, natom)
494 atprop%atevdw(1:natom) = atomic_energy(1:natom)
496 IF (atenergy .OR. atex)
THEN
497 DEALLOCATE (atomic_energy)
502 CALL para_env%sum(evdw)
504 IF (unit_nr > 0)
THEN
505 WRITE (unit_nr, *)
" Total vdW energy [au] :", evdw
506 WRITE (unit_nr, *)
" Total vdW energy [kcal] :", evdw*kcalmol
509 IF (calculate_forces .AND. debugall)
THEN
510 IF (unit_nr > 0)
THEN
511 WRITE (unit_nr, *)
" Dispersion Forces "
512 WRITE (unit_nr, *)
" Atom Kind Forces "
516 ikind = kind_of(iatom)
517 atom_a = atom_of_kind(iatom)
518 fdij(1:3) = force(ikind)%dispersion(:, atom_a)
519 CALL para_env%sum(fdij)
520 gnorm = gnorm + sum(abs(fdij))
521 IF (unit_nr > 0)
WRITE (unit_nr,
"(i5,i7,3F20.14)") iatom, ikind, fdij
523 IF (unit_nr > 0)
THEN
525 WRITE (unit_nr, *)
"|G| = ", gnorm
529 dvirial = virial%pv_virial - dvirial
530 CALL para_env%sum(dvirial)
531 IF (unit_nr > 0)
THEN
532 WRITE (unit_nr, *)
"Stress Tensor (dispersion)"
533 WRITE (unit_nr,
"(3G20.12)") dvirial
534 WRITE (unit_nr, *)
" Tr(P)/3 : ", (dvirial(1, 1) + dvirial(2, 2) + dvirial(3, 3))/3._dp
540 IF (calculate_forces .AND. use_virial)
THEN
541 virial%pv_vdw = virial%pv_vdw + (virial%pv_virial - pv_loc)
544 IF (
ASSOCIATED(dispersion_env%dftd_section))
THEN
545 CALL cp_print_key_finished_output(unit_nr, logger, dispersion_env%dftd_section,
"PRINT_DFTD")
548 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 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
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)
...
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, 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.
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, 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.
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.