(git:1f9fd2c)
Loading...
Searching...
No Matches
qs_dispersion_types.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Definition of disperson types for DFT calculations
10!> \author JGH (20.10.2008)
11! **************************************************************************************************
13
14 USE eeq_input, ONLY: eeq_solver_type
16 USE kinds, ONLY: default_path_length,&
18 dp
21#include "./base/base_uses.f90"
22
23 IMPLICIT NONE
24
25 PRIVATE
26
27 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_dispersion_types'
28
29! **************************************************************************************************
30 INTEGER, PARAMETER :: dftd2_pp = 1
31 INTEGER, PARAMETER :: dftd3_pp = 2
32 INTEGER, PARAMETER :: dftd4_pp = 3
33
35 INTEGER :: TYPE = -1
36 INTEGER :: pp_type = -1
37 INTEGER :: nl_type = -1
38 CHARACTER(LEN=default_string_length) :: ref_functional = ""
39 REAL(kind=dp) :: scaling = -1.0_dp
40 REAL(kind=dp) :: rc_disp = -1.0_dp
41 REAL(kind=dp) :: rc_d4 = -1.0_dp
42 REAL(kind=dp) :: rc_cn = -1.0_dp
43 REAL(kind=dp) :: exp_pre = -1.0_dp
44 TYPE(section_vals_type), POINTER :: dftd_section => null()
45 LOGICAL :: verbose = .false. !extended output
46 CHARACTER(LEN=default_path_length) :: parameter_file_name = ""
47 CHARACTER(LEN=default_path_length) :: kernel_file_name = ""
48 !charges
49 LOGICAL :: ext_charges = .false.
50 REAL(kind=dp), DIMENSION(:), POINTER :: charges => null() !charges for D4
51 REAL(kind=dp), DIMENSION(:), POINTER :: dcharges => null() !derivatives of D4 energy wrt charges
52 TYPE(eeq_solver_type) :: eeq_sparam ! parameters for EEQ solver
53 !DFT-D3 global parameters
54 INTEGER :: max_elem = -1 !elements parametrized
55 INTEGER :: maxc = -1 !max coordination number references per element
56 REAL(kind=dp) :: k1 = -1.0_dp, k2 = -1.0_dp, k3 = -1.0_dp !ad hoc parameters
57 REAL(kind=dp) :: alp = -1.0_dp !ad hoc parameters
58 REAL(kind=dp) :: s6 = -1.0_dp, s8 = -1.0_dp, sr6 = -1.0_dp !scaling parameters
59 REAL(kind=dp) :: a1 = -1.0_dp, a2 = -1.0_dp !BJ scaling parameters
60 REAL(kind=dp) :: eps_cn = -1.0_dp
61 LOGICAL :: d4_reference_code = .false. !Use D4 calculation from ext. library
62 LOGICAL :: d4_debug = .false. !Output debug information for D4
63 LOGICAL :: d3_reference_code = .false. !Use D3 parameters from s-dftd3 library
64 LOGICAL :: d3_scaling_explicit = .false. !Scaling parameters were explicitly set
65 LOGICAL :: doabc = .false. !neglect C9 terms
66 LOGICAL :: c9cnst = .false. !use constant c9 terms
67 LOGICAL :: lrc = .false. !calculate a long range correction
68 LOGICAL :: srb = .false. !calculate a short range bond correction
69 REAL(kind=dp), DIMENSION(4) :: srb_params = -1.0_dp ! parameters for SRB (s,g,t1,t2)
70 REAL(kind=dp) :: s9 = -1.0_dp !scale the many-body dispersion energy (default=1.0), dftd4
72 DIMENSION(:), POINTER :: sab_vdw => null(), sab_cn => null() ! neighborlists for pair interactions
73 REAL(kind=dp), DIMENSION(:, :, :, :, :), POINTER &
74 :: c6ab => null()
75 INTEGER, DIMENSION(:), POINTER :: maxci => null()
76 REAL(kind=dp), DIMENSION(:, :), POINTER :: r0ab => null()
77 REAL(kind=dp), DIMENSION(:), POINTER :: rcov => null() !covalent radii
78 REAL(kind=dp), DIMENSION(:), POINTER :: eneg => null() !electronegativity
79 REAL(kind=dp), DIMENSION(:), POINTER :: r2r4 => null() !atomic <r^2>/<r^4> values
80 INTEGER :: cnfun = 1 ! CN function to be used
81 REAL(kind=dp), DIMENSION(:), POINTER :: cn => null()
82 TYPE(cn_kind_list), DIMENSION(:), POINTER :: cnkind => null()
83 TYPE(cn_atom_list), DIMENSION(:), POINTER :: cnlist => null()
84 ! KG molecular corrections
85 LOGICAL :: domol = .false.
86 REAL(kind=dp) :: kgc8 = -1.0_dp !s8 scaling parameter
87 !vdW-DF variables
88 REAL(kind=dp) :: pw_cutoff = -1.0_dp
89 !parameters for the rVV10 functional
90 REAL(kind=dp) :: b_value = -1.0_dp, c_value = -1.0_dp, scale_rvv10 = -1.0_dp
91 INTEGER :: nqs = -1, nr_points = -1
92 !! The number of q points and radial points
93 !! used in generating the kernel phi(q1*r, q2*r)
94 !! (see DION 14-16 and SOLER 3)
95 REAL(kind=dp) :: r_max = -1.0_dp, q_cut = -1.0_dp, q_min = -1.0_dp, dk = -1.0_dp
96 !! The maximum value of r, the maximum and minimum
97 !! values of q and the k-space spacing of grid points.
98 !! Note that, during a vdW run, values of q0 found
99 !! larger than q_cut will be saturated (SOLER 6-7) to
100 !! q_cut
101 REAL(kind=dp), DIMENSION(:), POINTER :: q_mesh => null() !! The values of all the q points used
102 REAL(kind=dp), DIMENSION(:, :, :), POINTER &
103 :: kernel => null() !! A matrix holding the Fourier transformed kernel function
104 !! for each pair of q values. The ordering is
105 !! kernel(k_point, q1_value, q2_value)
106 REAL(kind=dp), DIMENSION(:, :, :), POINTER &
107 :: d2phi_dk2 => null() !! A matrix holding the second derivatives of the above
108 !! kernel matrix at each of the q points. Stored as
109 !! d2phi_dk2(k_point, q1_value, q2_value)
110 REAL(kind=dp), DIMENSION(:, :), POINTER :: d2y_dx2 => null() !! 2nd derivatives of q_mesh for interpolation
111 INTEGER, DIMENSION(:, :), POINTER :: d3_exclude_pair => null()
112 INTEGER :: nd3_exclude_pair = -1
113 END TYPE qs_dispersion_type
114
116 INTEGER :: TYPE = -1
117 LOGICAL :: defined = .false.
118 REAL(kind=dp) :: vdw_radii = -1.0_dp !van der Waals radii
119 REAL(kind=dp) :: c6 = -1.0_dp !c6 coefficients
121
122 TYPE cn_kind_list
123 REAL(kind=dp) :: cnum = -1.0_dp
124 INTEGER :: kind = -1
125 END TYPE cn_kind_list
126 TYPE cn_atom_list
127 REAL(kind=dp) :: cnum = -1.0_dp
128 INTEGER :: natom = -1
129 INTEGER, DIMENSION(:), POINTER :: atom => null()
130 END TYPE cn_atom_list
131
132! **************************************************************************************************
133
135 PUBLIC :: dftd2_pp, dftd3_pp, dftd4_pp
136 PUBLIC :: qs_dispersion_release
137
138! **************************************************************************************************
139CONTAINS
140! **************************************************************************************************
141!> \brief ...
142!> \param dispersion_env ...
143! **************************************************************************************************
144 SUBROUTINE qs_dispersion_release(dispersion_env)
145
146 TYPE(qs_dispersion_type), POINTER :: dispersion_env
147
148 INTEGER :: i
149
150 IF (ASSOCIATED(dispersion_env)) THEN
151 ! DFT-D3 arrays
152 IF (ASSOCIATED(dispersion_env%maxci)) THEN
153 DEALLOCATE (dispersion_env%maxci)
154 END IF
155 IF (ASSOCIATED(dispersion_env%c6ab)) THEN
156 DEALLOCATE (dispersion_env%c6ab)
157 END IF
158 IF (ASSOCIATED(dispersion_env%r0ab)) THEN
159 DEALLOCATE (dispersion_env%r0ab)
160 END IF
161 IF (ASSOCIATED(dispersion_env%rcov)) THEN
162 DEALLOCATE (dispersion_env%rcov)
163 END IF
164 IF (ASSOCIATED(dispersion_env%eneg)) THEN
165 DEALLOCATE (dispersion_env%eneg)
166 END IF
167 IF (ASSOCIATED(dispersion_env%r2r4)) THEN
168 DEALLOCATE (dispersion_env%r2r4)
169 END IF
170 IF (ASSOCIATED(dispersion_env%cn)) THEN
171 DEALLOCATE (dispersion_env%cn)
172 END IF
173 IF (ASSOCIATED(dispersion_env%cnkind)) THEN
174 DEALLOCATE (dispersion_env%cnkind)
175 END IF
176 IF (ASSOCIATED(dispersion_env%cnlist)) THEN
177 DO i = 1, SIZE(dispersion_env%cnlist)
178 DEALLOCATE (dispersion_env%cnlist(i)%atom)
179 END DO
180 DEALLOCATE (dispersion_env%cnlist)
181 END IF
182 ! vdD-DF
183 IF (ASSOCIATED(dispersion_env%q_mesh)) THEN
184 DEALLOCATE (dispersion_env%q_mesh)
185 END IF
186 IF (ASSOCIATED(dispersion_env%kernel)) THEN
187 DEALLOCATE (dispersion_env%kernel)
188 END IF
189 IF (ASSOCIATED(dispersion_env%d2phi_dk2)) THEN
190 DEALLOCATE (dispersion_env%d2phi_dk2)
191 END IF
192 IF (ASSOCIATED(dispersion_env%d2y_dx2)) THEN
193 DEALLOCATE (dispersion_env%d2y_dx2)
194 END IF
195 IF (ASSOCIATED(dispersion_env%d3_exclude_pair)) THEN
196 DEALLOCATE (dispersion_env%d3_exclude_pair)
197 END IF
198 ! neighborlists
199 CALL release_neighbor_list_sets(dispersion_env%sab_vdw)
200 CALL release_neighbor_list_sets(dispersion_env%sab_cn)
201 ! charges
202 IF (ASSOCIATED(dispersion_env%charges)) THEN
203 DEALLOCATE (dispersion_env%charges)
204 END IF
205 IF (ASSOCIATED(dispersion_env%dcharges)) THEN
206 DEALLOCATE (dispersion_env%dcharges)
207 END IF
208
209 DEALLOCATE (dispersion_env)
210
211 END IF
212
213 END SUBROUTINE qs_dispersion_release
214
215END MODULE qs_dispersion_types
216
Definition atom.F:9
Input definition and setup for EEQ model.
Definition eeq_input.F:12
objects that represent the structure of input sections and the data contained in an input section
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
integer, parameter, public default_path_length
Definition kinds.F:58
Definition of disperson types for DFT calculations.
integer, parameter, public dftd2_pp
integer, parameter, public dftd4_pp
subroutine, public qs_dispersion_release(dispersion_env)
...
integer, parameter, public dftd3_pp
Define the neighbor list data types and the corresponding functionality.
subroutine, public release_neighbor_list_sets(nlists)
releases an array of neighbor_list_sets