(git:6250c82)
Loading...
Searching...
No Matches
virial_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!> \par History
10!> - Refactoring (4.4.2007, JGH)
11!> - Revise virial components (16.10.2020, MK)
12! **************************************************************************************************
14
15 USE kinds, ONLY: dp
16#include "../base/base_uses.f90"
17
18 IMPLICIT NONE
19
20 PRIVATE
21
22 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'virial_types'
23
24 PUBLIC :: virial_type, virial_p_type
25
27 REAL(kind=dp), DIMENSION(3, 3) :: pv_total = 0.0_dp, &
28 pv_kinetic = 0.0_dp, &
29 pv_virial = 0.0_dp, &
30 pv_xc = 0.0_dp, &
31 pv_fock_4c = 0.0_dp, &
32 pv_constraint = 0.0_dp
33 REAL(kind=dp), DIMENSION(3, 3) :: pv_overlap = 0.0_dp, &
34 pv_ekinetic = 0.0_dp, &
35 pv_ppl = 0.0_dp, &
36 pv_ppnl = 0.0_dp, &
37 pv_ecore_overlap = 0.0_dp, &
38 pv_ehartree = 0.0_dp, &
39 pv_exc = 0.0_dp, &
40 pv_exx = 0.0_dp, &
41 pv_vdw = 0.0_dp, &
42 pv_mp2 = 0.0_dp, &
43 pv_nlcc = 0.0_dp, &
44 pv_gapw = 0.0_dp, &
45 pv_lrigpw = 0.0_dp
46 LOGICAL :: pv_availability = .false., &
47 pv_calculate = .false., &
48 pv_numer = .false., &
49 pv_diagonal = .false.
50 END TYPE virial_type
51
53 TYPE(virial_type), POINTER :: virial => null()
54 END TYPE virial_p_type
55
58
59CONTAINS
60
61! **************************************************************************************************
62!> \brief Project a tensor to the periodic subspace of a low-dimensional cell.
63!> \param pv Tensor to be projected
64!> \param periodic Periodicity flags for x, y, and z
65! **************************************************************************************************
66 SUBROUTINE project_tensor_to_periodic_subspace(pv, periodic)
67 REAL(kind=dp), DIMENSION(3, 3), INTENT(INOUT) :: pv
68 INTEGER, DIMENSION(3), INTENT(IN) :: periodic
69
70 INTEGER :: i
71
72 DO i = 1, 3
73 IF (periodic(i) == 0) THEN
74 pv(i, :) = 0.0_dp
75 pv(:, i) = 0.0_dp
76 END IF
77 END DO
78
80
81! **************************************************************************************************
82!> \brief Project all virial components to the periodic subspace of a low-dimensional cell.
83!> \param virial Virial object to be projected
84!> \param periodic Periodicity flags for x, y, and z
85! **************************************************************************************************
86 SUBROUTINE project_virial_to_periodic_subspace(virial, periodic)
87 TYPE(virial_type), INTENT(INOUT) :: virial
88 INTEGER, DIMENSION(3), INTENT(IN) :: periodic
89
90 CALL project_tensor_to_periodic_subspace(virial%pv_total, periodic)
91 CALL project_tensor_to_periodic_subspace(virial%pv_kinetic, periodic)
92 CALL project_tensor_to_periodic_subspace(virial%pv_virial, periodic)
93 CALL project_tensor_to_periodic_subspace(virial%pv_xc, periodic)
94 CALL project_tensor_to_periodic_subspace(virial%pv_fock_4c, periodic)
95 CALL project_tensor_to_periodic_subspace(virial%pv_constraint, periodic)
96 CALL project_tensor_to_periodic_subspace(virial%pv_overlap, periodic)
97 CALL project_tensor_to_periodic_subspace(virial%pv_ekinetic, periodic)
98 CALL project_tensor_to_periodic_subspace(virial%pv_ppl, periodic)
99 CALL project_tensor_to_periodic_subspace(virial%pv_ppnl, periodic)
100 CALL project_tensor_to_periodic_subspace(virial%pv_ecore_overlap, periodic)
101 CALL project_tensor_to_periodic_subspace(virial%pv_ehartree, periodic)
102 CALL project_tensor_to_periodic_subspace(virial%pv_exc, periodic)
103 CALL project_tensor_to_periodic_subspace(virial%pv_exx, periodic)
104 CALL project_tensor_to_periodic_subspace(virial%pv_vdw, periodic)
105 CALL project_tensor_to_periodic_subspace(virial%pv_mp2, periodic)
106 CALL project_tensor_to_periodic_subspace(virial%pv_nlcc, periodic)
107 CALL project_tensor_to_periodic_subspace(virial%pv_gapw, periodic)
108 CALL project_tensor_to_periodic_subspace(virial%pv_lrigpw, periodic)
109
111
112! **************************************************************************************************
113!> \brief Symmetrize the virial components
114!> \param virial ...
115!> \version 1.0
116! **************************************************************************************************
117 SUBROUTINE symmetrize_virial(virial)
118 TYPE(virial_type), INTENT(INOUT) :: virial
119
120 INTEGER :: i, j
121
122 DO i = 1, 3
123 DO j = 1, i - 1
124 virial%pv_total(j, i) = 0.5_dp*(virial%pv_total(i, j) + virial%pv_total(j, i))
125 virial%pv_total(i, j) = virial%pv_total(j, i)
126 virial%pv_kinetic(j, i) = 0.5_dp*(virial%pv_kinetic(i, j) + virial%pv_kinetic(j, i))
127 virial%pv_kinetic(i, j) = virial%pv_kinetic(j, i)
128 virial%pv_virial(j, i) = 0.5_dp*(virial%pv_virial(i, j) + virial%pv_virial(j, i))
129 virial%pv_virial(i, j) = virial%pv_virial(j, i)
130 virial%pv_xc(j, i) = 0.5_dp*(virial%pv_xc(i, j) + virial%pv_xc(j, i))
131 virial%pv_xc(i, j) = virial%pv_xc(j, i)
132 virial%pv_fock_4c(j, i) = 0.5_dp*(virial%pv_fock_4c(i, j) + virial%pv_fock_4c(j, i))
133 virial%pv_fock_4c(i, j) = virial%pv_fock_4c(j, i)
134 virial%pv_constraint(j, i) = 0.5_dp*(virial%pv_constraint(i, j) + virial%pv_constraint(j, i))
135 virial%pv_constraint(i, j) = virial%pv_constraint(j, i)
136 ! Virial components
137 virial%pv_overlap(j, i) = 0.5_dp*(virial%pv_overlap(i, j) + virial%pv_overlap(j, i))
138 virial%pv_overlap(i, j) = virial%pv_overlap(j, i)
139 virial%pv_ekinetic(j, i) = 0.5_dp*(virial%pv_ekinetic(i, j) + virial%pv_ekinetic(j, i))
140 virial%pv_ekinetic(i, j) = virial%pv_ekinetic(j, i)
141 virial%pv_ppl(j, i) = 0.5_dp*(virial%pv_ppl(i, j) + virial%pv_ppl(j, i))
142 virial%pv_ppl(i, j) = virial%pv_ppl(j, i)
143 virial%pv_ppnl(j, i) = 0.5_dp*(virial%pv_ppnl(i, j) + virial%pv_ppnl(j, i))
144 virial%pv_ppnl(i, j) = virial%pv_ppnl(j, i)
145 virial%pv_ecore_overlap(j, i) = 0.5_dp*(virial%pv_ecore_overlap(i, j) + virial%pv_ecore_overlap(j, i))
146 virial%pv_ecore_overlap(i, j) = virial%pv_ecore_overlap(j, i)
147 virial%pv_ehartree(j, i) = 0.5_dp*(virial%pv_ehartree(i, j) + virial%pv_ehartree(j, i))
148 virial%pv_ehartree(i, j) = virial%pv_ehartree(j, i)
149 virial%pv_exc(j, i) = 0.5_dp*(virial%pv_exc(i, j) + virial%pv_exc(j, i))
150 virial%pv_exc(i, j) = virial%pv_exc(j, i)
151 virial%pv_exx(j, i) = 0.5_dp*(virial%pv_exx(i, j) + virial%pv_exx(j, i))
152 virial%pv_exx(i, j) = virial%pv_exx(j, i)
153 virial%pv_vdw(j, i) = 0.5_dp*(virial%pv_vdw(i, j) + virial%pv_vdw(j, i))
154 virial%pv_vdw(i, j) = virial%pv_vdw(j, i)
155 virial%pv_mp2(j, i) = 0.5_dp*(virial%pv_mp2(i, j) + virial%pv_mp2(j, i))
156 virial%pv_mp2(i, j) = virial%pv_mp2(j, i)
157 virial%pv_nlcc(j, i) = 0.5_dp*(virial%pv_nlcc(i, j) + virial%pv_nlcc(j, i))
158 virial%pv_nlcc(i, j) = virial%pv_nlcc(j, i)
159 virial%pv_gapw(j, i) = 0.5_dp*(virial%pv_gapw(i, j) + virial%pv_gapw(j, i))
160 virial%pv_gapw(i, j) = virial%pv_gapw(j, i)
161 virial%pv_lrigpw(j, i) = 0.5_dp*(virial%pv_lrigpw(i, j) + virial%pv_lrigpw(j, i))
162 virial%pv_lrigpw(i, j) = virial%pv_lrigpw(j, i)
163 END DO
164 END DO
165
166 END SUBROUTINE symmetrize_virial
167
168! **************************************************************************************************
169!> \brief ...
170!> \param virial ...
171!> \param reset ...
172! **************************************************************************************************
173 SUBROUTINE zero_virial(virial, reset)
174 TYPE(virial_type), INTENT(INOUT) :: virial
175 LOGICAL, INTENT(IN), OPTIONAL :: reset
176
177 LOGICAL :: my_reset
178
179 my_reset = .true.
180 IF (PRESENT(reset)) my_reset = reset
181
182 virial%pv_total = 0.0_dp
183 virial%pv_kinetic = 0.0_dp
184 virial%pv_virial = 0.0_dp
185 virial%pv_xc = 0.0_dp
186 virial%pv_fock_4c = 0.0_dp
187 virial%pv_constraint = 0.0_dp
188
189 virial%pv_overlap = 0.0_dp
190 virial%pv_ekinetic = 0.0_dp
191 virial%pv_ppl = 0.0_dp
192 virial%pv_ppnl = 0.0_dp
193 virial%pv_ecore_overlap = 0.0_dp
194 virial%pv_ehartree = 0.0_dp
195 virial%pv_exc = 0.0_dp
196 virial%pv_exx = 0.0_dp
197 virial%pv_vdw = 0.0_dp
198 virial%pv_mp2 = 0.0_dp
199 virial%pv_nlcc = 0.0_dp
200 virial%pv_gapw = 0.0_dp
201 virial%pv_lrigpw = 0.0_dp
202
203 IF (my_reset) THEN
204 virial%pv_availability = .false.
205 virial%pv_calculate = .false.
206 virial%pv_numer = .false.
207 virial%pv_diagonal = .false.
208 END IF
209
210 END SUBROUTINE zero_virial
211
212! **************************************************************************************************
213!> \brief ...
214!> \param virial ...
215!> \param pv_total ...
216!> \param pv_kinetic ...
217!> \param pv_virial ...
218!> \param pv_xc ...
219!> \param pv_fock_4c ...
220!> \param pv_constraint ...
221!> \param pv_overlap ...
222!> \param pv_ekinetic ...
223!> \param pv_ppl ...
224!> \param pv_ppnl ...
225!> \param pv_ecore_overlap ...
226!> \param pv_ehartree ...
227!> \param pv_exc ...
228!> \param pv_exx ...
229!> \param pv_vdw ...
230!> \param pv_mp2 ...
231!> \param pv_nlcc ...
232!> \param pv_gapw ...
233!> \param pv_lrigpw ...
234!> \param pv_availability ...
235!> \param pv_calculate ...
236!> \param pv_numer ...
237!> \param pv_diagonal ...
238! **************************************************************************************************
239 SUBROUTINE virial_set(virial, pv_total, pv_kinetic, pv_virial, pv_xc, pv_fock_4c, pv_constraint, &
240 pv_overlap, pv_ekinetic, pv_ppl, pv_ppnl, pv_ecore_overlap, pv_ehartree, &
241 pv_exc, pv_exx, pv_vdw, pv_mp2, pv_nlcc, pv_gapw, pv_lrigpw, &
242 pv_availability, pv_calculate, pv_numer, pv_diagonal)
243
244 TYPE(virial_type), INTENT(INOUT) :: virial
245 REAL(kind=dp), DIMENSION(3, 3), OPTIONAL :: pv_total, pv_kinetic, pv_virial, pv_xc, &
246 pv_fock_4c, pv_constraint, pv_overlap, pv_ekinetic, pv_ppl, pv_ppnl, pv_ecore_overlap, &
247 pv_ehartree, pv_exc, pv_exx, pv_vdw, pv_mp2, pv_nlcc, pv_gapw, pv_lrigpw
248 LOGICAL, OPTIONAL :: pv_availability, pv_calculate, pv_numer, &
249 pv_diagonal
250
251 IF (PRESENT(pv_total)) virial%pv_total = pv_total
252 IF (PRESENT(pv_kinetic)) virial%pv_kinetic = pv_kinetic
253 IF (PRESENT(pv_virial)) virial%pv_virial = pv_virial
254 IF (PRESENT(pv_xc)) virial%pv_xc = pv_xc
255 IF (PRESENT(pv_fock_4c)) virial%pv_fock_4c = pv_fock_4c
256 IF (PRESENT(pv_constraint)) virial%pv_constraint = pv_constraint
257
258 IF (PRESENT(pv_overlap)) virial%pv_overlap = pv_overlap
259 IF (PRESENT(pv_ekinetic)) virial%pv_ekinetic = pv_ekinetic
260 IF (PRESENT(pv_ppl)) virial%pv_ppl = pv_ppl
261 IF (PRESENT(pv_ppnl)) virial%pv_ppnl = pv_ppnl
262 IF (PRESENT(pv_ecore_overlap)) virial%pv_ecore_overlap = pv_ecore_overlap
263 IF (PRESENT(pv_ehartree)) virial%pv_ehartree = pv_ehartree
264 IF (PRESENT(pv_exc)) virial%pv_exc = pv_exc
265 IF (PRESENT(pv_exx)) virial%pv_exx = pv_exx
266 IF (PRESENT(pv_vdw)) virial%pv_vdw = pv_vdw
267 IF (PRESENT(pv_mp2)) virial%pv_mp2 = pv_mp2
268 IF (PRESENT(pv_nlcc)) virial%pv_nlcc = pv_nlcc
269 IF (PRESENT(pv_gapw)) virial%pv_gapw = pv_gapw
270 IF (PRESENT(pv_lrigpw)) virial%pv_lrigpw = pv_lrigpw
271
272 IF (PRESENT(pv_availability)) virial%pv_availability = pv_availability
273 IF (PRESENT(pv_calculate)) virial%pv_calculate = pv_calculate
274 IF (PRESENT(pv_numer)) virial%pv_numer = pv_numer
275 IF (PRESENT(pv_diagonal)) virial%pv_diagonal = pv_diagonal
276
277 END SUBROUTINE virial_set
278
279END MODULE virial_types
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
subroutine project_tensor_to_periodic_subspace(pv, periodic)
Project a tensor to the periodic subspace of a low-dimensional cell.
subroutine, public zero_virial(virial, reset)
...
subroutine, public virial_set(virial, pv_total, pv_kinetic, pv_virial, pv_xc, pv_fock_4c, pv_constraint, pv_overlap, pv_ekinetic, pv_ppl, pv_ppnl, pv_ecore_overlap, pv_ehartree, pv_exc, pv_exx, pv_vdw, pv_mp2, pv_nlcc, pv_gapw, pv_lrigpw, pv_availability, pv_calculate, pv_numer, pv_diagonal)
...
subroutine, public project_virial_to_periodic_subspace(virial, periodic)
Project all virial components to the periodic subspace of a low-dimensional cell.
subroutine, public symmetrize_virial(virial)
Symmetrize the virial components.