(git:e7e05ae)
virial_types.F
Go to the documentation of this file.
1 !--------------------------------------------------------------------------------------------------!
2 ! CP2K: A general program to perform molecular dynamics simulations !
3 ! Copyright 2000-2024 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 
26  TYPE virial_type
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 
52  TYPE virial_p_type
53  TYPE(virial_type), POINTER :: virial => null()
54  END TYPE virial_p_type
55 
56  PUBLIC :: virial_set, &
58 
59 CONTAINS
60 
61 ! **************************************************************************************************
62 !> \brief Symmetrize the virial components
63 !> \param virial ...
64 !> \version 1.0
65 ! **************************************************************************************************
66  SUBROUTINE symmetrize_virial(virial)
67  TYPE(virial_type), INTENT(INOUT) :: virial
68 
69  INTEGER :: i, j
70 
71  DO i = 1, 3
72  DO j = 1, i - 1
73  virial%pv_total(j, i) = 0.5_dp*(virial%pv_total(i, j) + virial%pv_total(j, i))
74  virial%pv_total(i, j) = virial%pv_total(j, i)
75  virial%pv_kinetic(j, i) = 0.5_dp*(virial%pv_kinetic(i, j) + virial%pv_kinetic(j, i))
76  virial%pv_kinetic(i, j) = virial%pv_kinetic(j, i)
77  virial%pv_virial(j, i) = 0.5_dp*(virial%pv_virial(i, j) + virial%pv_virial(j, i))
78  virial%pv_virial(i, j) = virial%pv_virial(j, i)
79  virial%pv_xc(j, i) = 0.5_dp*(virial%pv_xc(i, j) + virial%pv_xc(j, i))
80  virial%pv_xc(i, j) = virial%pv_xc(j, i)
81  virial%pv_fock_4c(j, i) = 0.5_dp*(virial%pv_fock_4c(i, j) + virial%pv_fock_4c(j, i))
82  virial%pv_fock_4c(i, j) = virial%pv_fock_4c(j, i)
83  virial%pv_constraint(j, i) = 0.5_dp*(virial%pv_constraint(i, j) + virial%pv_constraint(j, i))
84  virial%pv_constraint(i, j) = virial%pv_constraint(j, i)
85  ! Virial components
86  virial%pv_overlap(j, i) = 0.5_dp*(virial%pv_overlap(i, j) + virial%pv_overlap(j, i))
87  virial%pv_overlap(i, j) = virial%pv_overlap(j, i)
88  virial%pv_ekinetic(j, i) = 0.5_dp*(virial%pv_ekinetic(i, j) + virial%pv_ekinetic(j, i))
89  virial%pv_ekinetic(i, j) = virial%pv_ekinetic(j, i)
90  virial%pv_ppl(j, i) = 0.5_dp*(virial%pv_ppl(i, j) + virial%pv_ppl(j, i))
91  virial%pv_ppl(i, j) = virial%pv_ppl(j, i)
92  virial%pv_ppnl(j, i) = 0.5_dp*(virial%pv_ppnl(i, j) + virial%pv_ppnl(j, i))
93  virial%pv_ppnl(i, j) = virial%pv_ppnl(j, i)
94  virial%pv_ecore_overlap(j, i) = 0.5_dp*(virial%pv_ecore_overlap(i, j) + virial%pv_ecore_overlap(j, i))
95  virial%pv_ecore_overlap(i, j) = virial%pv_ecore_overlap(j, i)
96  virial%pv_ehartree(j, i) = 0.5_dp*(virial%pv_ehartree(i, j) + virial%pv_ehartree(j, i))
97  virial%pv_ehartree(i, j) = virial%pv_ehartree(j, i)
98  virial%pv_exc(j, i) = 0.5_dp*(virial%pv_exc(i, j) + virial%pv_exc(j, i))
99  virial%pv_exc(i, j) = virial%pv_exc(j, i)
100  virial%pv_exx(j, i) = 0.5_dp*(virial%pv_exx(i, j) + virial%pv_exx(j, i))
101  virial%pv_exx(i, j) = virial%pv_exx(j, i)
102  virial%pv_vdw(j, i) = 0.5_dp*(virial%pv_vdw(i, j) + virial%pv_vdw(j, i))
103  virial%pv_vdw(i, j) = virial%pv_vdw(j, i)
104  virial%pv_mp2(j, i) = 0.5_dp*(virial%pv_mp2(i, j) + virial%pv_mp2(j, i))
105  virial%pv_mp2(i, j) = virial%pv_mp2(j, i)
106  virial%pv_nlcc(j, i) = 0.5_dp*(virial%pv_nlcc(i, j) + virial%pv_nlcc(j, i))
107  virial%pv_nlcc(i, j) = virial%pv_nlcc(j, i)
108  virial%pv_gapw(j, i) = 0.5_dp*(virial%pv_gapw(i, j) + virial%pv_gapw(j, i))
109  virial%pv_gapw(i, j) = virial%pv_gapw(j, i)
110  virial%pv_lrigpw(j, i) = 0.5_dp*(virial%pv_lrigpw(i, j) + virial%pv_lrigpw(j, i))
111  virial%pv_lrigpw(i, j) = virial%pv_lrigpw(j, i)
112  END DO
113  END DO
114 
115  END SUBROUTINE symmetrize_virial
116 
117 ! **************************************************************************************************
118 !> \brief ...
119 !> \param virial ...
120 !> \param reset ...
121 ! **************************************************************************************************
122  SUBROUTINE zero_virial(virial, reset)
123  TYPE(virial_type), INTENT(INOUT) :: virial
124  LOGICAL, INTENT(IN), OPTIONAL :: reset
125 
126  LOGICAL :: my_reset
127 
128  my_reset = .true.
129  IF (PRESENT(reset)) my_reset = reset
130 
131  virial%pv_total = 0.0_dp
132  virial%pv_kinetic = 0.0_dp
133  virial%pv_virial = 0.0_dp
134  virial%pv_xc = 0.0_dp
135  virial%pv_fock_4c = 0.0_dp
136  virial%pv_constraint = 0.0_dp
137 
138  virial%pv_overlap = 0.0_dp
139  virial%pv_ekinetic = 0.0_dp
140  virial%pv_ppl = 0.0_dp
141  virial%pv_ppnl = 0.0_dp
142  virial%pv_ecore_overlap = 0.0_dp
143  virial%pv_ehartree = 0.0_dp
144  virial%pv_exc = 0.0_dp
145  virial%pv_exx = 0.0_dp
146  virial%pv_vdw = 0.0_dp
147  virial%pv_mp2 = 0.0_dp
148  virial%pv_nlcc = 0.0_dp
149  virial%pv_gapw = 0.0_dp
150  virial%pv_lrigpw = 0.0_dp
151 
152  IF (my_reset) THEN
153  virial%pv_availability = .false.
154  virial%pv_calculate = .false.
155  virial%pv_numer = .false.
156  virial%pv_diagonal = .false.
157  END IF
158 
159  END SUBROUTINE zero_virial
160 
161 ! **************************************************************************************************
162 !> \brief ...
163 !> \param virial ...
164 !> \param pv_total ...
165 !> \param pv_kinetic ...
166 !> \param pv_virial ...
167 !> \param pv_xc ...
168 !> \param pv_fock_4c ...
169 !> \param pv_constraint ...
170 !> \param pv_overlap ...
171 !> \param pv_ekinetic ...
172 !> \param pv_ppl ...
173 !> \param pv_ppnl ...
174 !> \param pv_ecore_overlap ...
175 !> \param pv_ehartree ...
176 !> \param pv_exc ...
177 !> \param pv_exx ...
178 !> \param pv_vdw ...
179 !> \param pv_mp2 ...
180 !> \param pv_nlcc ...
181 !> \param pv_gapw ...
182 !> \param pv_lrigpw ...
183 !> \param pv_availability ...
184 !> \param pv_calculate ...
185 !> \param pv_numer ...
186 !> \param pv_diagonal ...
187 ! **************************************************************************************************
188  SUBROUTINE virial_set(virial, pv_total, pv_kinetic, pv_virial, pv_xc, pv_fock_4c, pv_constraint, &
189  pv_overlap, pv_ekinetic, pv_ppl, pv_ppnl, pv_ecore_overlap, pv_ehartree, &
190  pv_exc, pv_exx, pv_vdw, pv_mp2, pv_nlcc, pv_gapw, pv_lrigpw, &
191  pv_availability, pv_calculate, pv_numer, pv_diagonal)
192 
193  TYPE(virial_type), INTENT(INOUT) :: virial
194  REAL(kind=dp), DIMENSION(3, 3), OPTIONAL :: pv_total, pv_kinetic, pv_virial, pv_xc, &
195  pv_fock_4c, pv_constraint, pv_overlap, pv_ekinetic, pv_ppl, pv_ppnl, pv_ecore_overlap, &
196  pv_ehartree, pv_exc, pv_exx, pv_vdw, pv_mp2, pv_nlcc, pv_gapw, pv_lrigpw
197  LOGICAL, OPTIONAL :: pv_availability, pv_calculate, pv_numer, &
198  pv_diagonal
199 
200  IF (PRESENT(pv_total)) virial%pv_total = pv_total
201  IF (PRESENT(pv_kinetic)) virial%pv_kinetic = pv_kinetic
202  IF (PRESENT(pv_virial)) virial%pv_virial = pv_virial
203  IF (PRESENT(pv_xc)) virial%pv_xc = pv_xc
204  IF (PRESENT(pv_fock_4c)) virial%pv_fock_4c = pv_fock_4c
205  IF (PRESENT(pv_constraint)) virial%pv_constraint = pv_constraint
206 
207  IF (PRESENT(pv_overlap)) virial%pv_overlap = pv_overlap
208  IF (PRESENT(pv_ekinetic)) virial%pv_ekinetic = pv_ekinetic
209  IF (PRESENT(pv_ppl)) virial%pv_ppl = pv_ppl
210  IF (PRESENT(pv_ppnl)) virial%pv_ppnl = pv_ppnl
211  IF (PRESENT(pv_ecore_overlap)) virial%pv_ecore_overlap = pv_ecore_overlap
212  IF (PRESENT(pv_ehartree)) virial%pv_ehartree = pv_ehartree
213  IF (PRESENT(pv_exc)) virial%pv_exc = pv_exc
214  IF (PRESENT(pv_exx)) virial%pv_exx = pv_exx
215  IF (PRESENT(pv_vdw)) virial%pv_vdw = pv_vdw
216  IF (PRESENT(pv_mp2)) virial%pv_mp2 = pv_mp2
217  IF (PRESENT(pv_nlcc)) virial%pv_nlcc = pv_nlcc
218  IF (PRESENT(pv_gapw)) virial%pv_gapw = pv_gapw
219  IF (PRESENT(pv_lrigpw)) virial%pv_lrigpw = pv_lrigpw
220 
221  IF (PRESENT(pv_availability)) virial%pv_availability = pv_availability
222  IF (PRESENT(pv_calculate)) virial%pv_calculate = pv_calculate
223  IF (PRESENT(pv_numer)) virial%pv_numer = pv_numer
224  IF (PRESENT(pv_diagonal)) virial%pv_diagonal = pv_diagonal
225 
226  END SUBROUTINE virial_set
227 
228 END MODULE virial_types
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
subroutine, public zero_virial(virial, reset)
...
Definition: virial_types.F:123
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)
...
Definition: virial_types.F:192
subroutine, public symmetrize_virial(virial)
Symmetrize the virial components.
Definition: virial_types.F:67