Line data Source code
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 : ! **************************************************************************************************
12 : MODULE qs_dispersion_types
13 :
14 : USE eeq_input, ONLY: eeq_solver_type
15 : USE input_section_types, ONLY: section_vals_type
16 : USE kinds, ONLY: default_path_length,&
17 : default_string_length,&
18 : dp
19 : USE qs_neighbor_list_types, ONLY: neighbor_list_set_p_type,&
20 : release_neighbor_list_sets
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 :
34 : TYPE qs_dispersion_type
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) :: d4_cutoff_width = 0.05_dp
44 : REAL(KIND=dp) :: d4_3b_cutoff_width = 0.0_dp
45 : REAL(KIND=dp) :: exp_pre = -1.0_dp
46 : TYPE(section_vals_type), POINTER :: dftd_section => NULL()
47 : LOGICAL :: verbose = .FALSE. !extended output
48 : CHARACTER(LEN=default_path_length) :: parameter_file_name = ""
49 : CHARACTER(LEN=default_path_length) :: kernel_file_name = ""
50 : !charges
51 : LOGICAL :: ext_charges = .FALSE.
52 : REAL(KIND=dp), DIMENSION(:), POINTER :: charges => NULL() !charges for D4
53 : REAL(KIND=dp), DIMENSION(:), POINTER :: dcharges => NULL() !derivatives of D4 energy wrt charges
54 : TYPE(eeq_solver_type) :: eeq_sparam ! parameters for EEQ solver
55 : !DFT-D3 global parameters
56 : INTEGER :: max_elem = -1 !elements parametrized
57 : INTEGER :: maxc = -1 !max coordination number references per element
58 : REAL(KIND=dp) :: k1 = -1.0_dp, k2 = -1.0_dp, k3 = -1.0_dp !ad hoc parameters
59 : REAL(KIND=dp) :: alp = -1.0_dp !ad hoc parameters
60 : REAL(KIND=dp) :: s6 = -1.0_dp, s8 = -1.0_dp, sr6 = -1.0_dp !scaling parameters
61 : REAL(KIND=dp) :: sr8 = 1.0_dp !D3(0) C8 damping parameter
62 : REAL(KIND=dp) :: a1 = -1.0_dp, a2 = -1.0_dp !BJ scaling parameters
63 : REAL(KIND=dp) :: eps_cn = -1.0_dp
64 : LOGICAL :: d4_reference_code = .FALSE. !Use D4 calculation from ext. library
65 : LOGICAL :: d4_debug = .FALSE. !Output debug information for D4
66 : LOGICAL :: d3_reference_code = .FALSE. !Use D3 parameters from s-dftd3 library
67 : LOGICAL :: d3_scaling_explicit = .FALSE. !Scaling parameters were explicitly set
68 : LOGICAL :: doabc = .FALSE. !neglect C9 terms
69 : LOGICAL :: c9cnst = .FALSE. !use constant c9 terms
70 : LOGICAL :: lrc = .FALSE. !calculate a long range correction
71 : LOGICAL :: srb = .FALSE. !calculate a short range bond correction
72 : REAL(KIND=dp), DIMENSION(4) :: srb_params = -1.0_dp ! parameters for SRB (s,g,t1,t2)
73 : REAL(KIND=dp) :: s9 = -1.0_dp !scale the many-body dispersion energy (default=1.0), dftd4
74 : TYPE(neighbor_list_set_p_type), &
75 : DIMENSION(:), POINTER :: sab_vdw => NULL(), sab_cn => NULL() ! neighborlists for pair interactions
76 : REAL(KIND=dp), DIMENSION(:, :, :, :, :), POINTER &
77 : :: c6ab => NULL()
78 : INTEGER, DIMENSION(:), POINTER :: maxci => NULL()
79 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: r0ab => NULL()
80 : REAL(KIND=dp), DIMENSION(:), POINTER :: rcov => NULL() !covalent radii
81 : REAL(KIND=dp), DIMENSION(:), POINTER :: eneg => NULL() !electronegativity
82 : REAL(KIND=dp), DIMENSION(:), POINTER :: r2r4 => NULL() !atomic <r^2>/<r^4> values
83 : INTEGER :: cnfun = 1 ! CN function to be used
84 : REAL(KIND=dp), DIMENSION(:), POINTER :: cn => NULL()
85 : TYPE(cn_kind_list), DIMENSION(:), POINTER :: cnkind => NULL()
86 : TYPE(cn_atom_list), DIMENSION(:), POINTER :: cnlist => NULL()
87 : ! KG molecular corrections
88 : LOGICAL :: domol = .FALSE.
89 : REAL(KIND=dp) :: kgc8 = -1.0_dp !s8 scaling parameter
90 : !vdW-DF variables
91 : REAL(KIND=dp) :: pw_cutoff = -1.0_dp
92 : !parameters for the rVV10 functional
93 : REAL(KIND=dp) :: b_value = -1.0_dp, c_value = -1.0_dp, scale_rvv10 = -1.0_dp
94 : INTEGER :: nqs = -1, nr_points = -1
95 : !! The number of q points and radial points
96 : !! used in generating the kernel phi(q1*r, q2*r)
97 : !! (see DION 14-16 and SOLER 3)
98 : REAL(KIND=dp) :: r_max = -1.0_dp, q_cut = -1.0_dp, q_min = -1.0_dp, dk = -1.0_dp
99 : !! The maximum value of r, the maximum and minimum
100 : !! values of q and the k-space spacing of grid points.
101 : !! Note that, during a vdW run, values of q0 found
102 : !! larger than q_cut will be saturated (SOLER 6-7) to
103 : !! q_cut
104 : REAL(KIND=dp), DIMENSION(:), POINTER :: q_mesh => NULL() !! The values of all the q points used
105 : REAL(KIND=dp), DIMENSION(:, :, :), POINTER &
106 : :: kernel_table => NULL() !! Fourier transformed kernel and its second radial derivatives
107 : !! kernel_table(q1*(q1 - 1)/2 + q2, k_point, itable), with q2 <= q1 and k_point starting at zero.
108 : !! itable = 1 for kernel values and 2 for second derivatives.
109 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: d2y_dx2 => NULL() !! 2nd derivatives of q_mesh for interpolation
110 : INTEGER, DIMENSION(:, :), POINTER :: d3_exclude_pair => NULL()
111 : INTEGER :: nd3_exclude_pair = -1
112 : END TYPE qs_dispersion_type
113 :
114 : TYPE qs_atom_dispersion_type
115 : INTEGER :: TYPE = -1
116 : LOGICAL :: defined = .FALSE.
117 : REAL(KIND=dp) :: vdw_radii = -1.0_dp !van der Waals radii
118 : REAL(KIND=dp) :: c6 = -1.0_dp !c6 coefficients
119 : END TYPE qs_atom_dispersion_type
120 :
121 : TYPE cn_kind_list
122 : REAL(KIND=dp) :: cnum = -1.0_dp
123 : INTEGER :: kind = -1
124 : END TYPE cn_kind_list
125 : TYPE cn_atom_list
126 : REAL(KIND=dp) :: cnum = -1.0_dp
127 : INTEGER :: natom = -1
128 : INTEGER, DIMENSION(:), POINTER :: atom => NULL()
129 : END TYPE cn_atom_list
130 :
131 : ! **************************************************************************************************
132 :
133 : PUBLIC :: qs_atom_dispersion_type, qs_dispersion_type
134 : PUBLIC :: dftd2_pp, dftd3_pp, dftd4_pp
135 : PUBLIC :: qs_dispersion_release
136 :
137 : ! **************************************************************************************************
138 : CONTAINS
139 : ! **************************************************************************************************
140 : !> \brief ...
141 : !> \param dispersion_env ...
142 : ! **************************************************************************************************
143 9737 : SUBROUTINE qs_dispersion_release(dispersion_env)
144 :
145 : TYPE(qs_dispersion_type), POINTER :: dispersion_env
146 :
147 : INTEGER :: i
148 :
149 9737 : IF (ASSOCIATED(dispersion_env)) THEN
150 : ! DFT-D3 arrays
151 9466 : IF (ASSOCIATED(dispersion_env%maxci)) THEN
152 1262 : DEALLOCATE (dispersion_env%maxci)
153 : END IF
154 9466 : IF (ASSOCIATED(dispersion_env%c6ab)) THEN
155 572 : DEALLOCATE (dispersion_env%c6ab)
156 : END IF
157 9466 : IF (ASSOCIATED(dispersion_env%r0ab)) THEN
158 572 : DEALLOCATE (dispersion_env%r0ab)
159 : END IF
160 9466 : IF (ASSOCIATED(dispersion_env%rcov)) THEN
161 1374 : DEALLOCATE (dispersion_env%rcov)
162 : END IF
163 9466 : IF (ASSOCIATED(dispersion_env%eneg)) THEN
164 1262 : DEALLOCATE (dispersion_env%eneg)
165 : END IF
166 9466 : IF (ASSOCIATED(dispersion_env%r2r4)) THEN
167 572 : DEALLOCATE (dispersion_env%r2r4)
168 : END IF
169 9466 : IF (ASSOCIATED(dispersion_env%cn)) THEN
170 1262 : DEALLOCATE (dispersion_env%cn)
171 : END IF
172 9466 : IF (ASSOCIATED(dispersion_env%cnkind)) THEN
173 6 : DEALLOCATE (dispersion_env%cnkind)
174 : END IF
175 9466 : IF (ASSOCIATED(dispersion_env%cnlist)) THEN
176 6 : DO i = 1, SIZE(dispersion_env%cnlist)
177 6 : DEALLOCATE (dispersion_env%cnlist(i)%atom)
178 : END DO
179 2 : DEALLOCATE (dispersion_env%cnlist)
180 : END IF
181 : ! vdD-DF
182 9466 : IF (ASSOCIATED(dispersion_env%q_mesh)) THEN
183 66 : DEALLOCATE (dispersion_env%q_mesh)
184 : END IF
185 9466 : IF (ASSOCIATED(dispersion_env%kernel_table)) THEN
186 66 : DEALLOCATE (dispersion_env%kernel_table)
187 : END IF
188 9466 : IF (ASSOCIATED(dispersion_env%d2y_dx2)) THEN
189 66 : DEALLOCATE (dispersion_env%d2y_dx2)
190 : END IF
191 9466 : IF (ASSOCIATED(dispersion_env%d3_exclude_pair)) THEN
192 2 : DEALLOCATE (dispersion_env%d3_exclude_pair)
193 : END IF
194 : ! neighborlists
195 9466 : CALL release_neighbor_list_sets(dispersion_env%sab_vdw)
196 9466 : CALL release_neighbor_list_sets(dispersion_env%sab_cn)
197 : ! charges
198 9466 : IF (ASSOCIATED(dispersion_env%charges)) THEN
199 640 : DEALLOCATE (dispersion_env%charges)
200 : END IF
201 9466 : IF (ASSOCIATED(dispersion_env%dcharges)) THEN
202 12 : DEALLOCATE (dispersion_env%dcharges)
203 : END IF
204 :
205 9466 : DEALLOCATE (dispersion_env)
206 :
207 : END IF
208 :
209 9737 : END SUBROUTINE qs_dispersion_release
210 :
211 0 : END MODULE qs_dispersion_types
|