1!--------------------------------------------------------------------------------------------------!
2!   CP2K: A general program to perform molecular dynamics simulations                              !
3!   Copyright (C) 2000 - 2019  CP2K developers group                                               !
4!--------------------------------------------------------------------------------------------------!
5
6! **************************************************************************************************
7!> \par History
8!>      JGH (11.08.2002) exchange and correlation energy now in exc
9!>      TL  (25.05.2004) qmmm energy
10!> \author MK (13.06.2002)
11! **************************************************************************************************
12MODULE qs_energy_types
13
14   USE kinds,                           ONLY: dp
15#include "./base/base_uses.f90"
16
17   IMPLICIT NONE
18
19   PRIVATE
20
21   CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_energy_types'
22
23   TYPE qs_energy_type
24      REAL(KIND=dp) :: core, &
25                       core_overlap, &
26                       core_overlap0, &
27                       core_self, &
28                       repulsive, &
29                       dispersion, &
30                       gcp, &
31                       ex, &
32                       exc, &
33                       exc_aux_fit, &
34                       exc1, &
35                       hartree, &
36                       hartree_1c, &
37                       e_hartree, & ! contains the hartree energy of electrons only
38                       ! computed if requested
39                       image_charge, &
40                       qmmm_el, &
41                       qmmm_nu, &
42                       mulliken, &
43                       cdft, &
44                       ee, &
45                       ee_core, &
46                       efield, &
47                       efield_core, &
48                       s2_restraint, &
49                       dft_plus_u, & ! DFT+U energy contribution
50                       sccs_hartree, & ! SCCS Hartree energy of solute + solvent
51                       sccs_pol, & ! SCCS polarisation energy
52                       sccs_mpc, & ! Makov-Payne energy correction for charged supercells
53                       sccs_cav, & ! SCCS cavitation energy
54                       sccs_dis, & ! SCCS dispersion free energy
55                       sccs_rep, & ! SCCS repulsion free energy
56                       ktS, & ! electronic entropic contribution
57                       efermi, & ! Fermi energy
58                       dftb3, & ! DFTB 3rd order correction
59                       mp2, &
60                       ! single excitations correction for all
61                       ! non-scf orbital(density) corrections
62                       ! for example, almo delocalization corrction
63                       singles_corr, &
64                       total, &
65                       tot_old, &
66                       kinetic, & !total kinetic energy [rk]
67                       s_square, &
68                       surf_dipole, &
69                       embed_corr ! correction for embedding potential
70      REAL(KIND=dp), DIMENSION(:), POINTER :: ddapc_restraint
71   END TYPE qs_energy_type
72
73   ! Public data types
74
75   PUBLIC :: qs_energy_type
76
77   ! Public subroutines
78
79   PUBLIC :: allocate_qs_energy, &
80             deallocate_qs_energy, &
81             init_qs_energy
82
83CONTAINS
84
85! **************************************************************************************************
86!> \brief   Allocate and/or initialise a Quickstep energy data structure.
87!> \param qs_energy ...
88!> \date    13.06.2002
89!> \author  MK
90!> \version 1.0
91! **************************************************************************************************
92   SUBROUTINE allocate_qs_energy(qs_energy)
93
94      TYPE(qs_energy_type), POINTER                      :: qs_energy
95
96      CHARACTER(len=*), PARAMETER :: routineN = 'allocate_qs_energy', &
97         routineP = moduleN//':'//routineN
98
99      INTEGER                                            :: handle
100
101      CALL timeset(routineN, handle)
102      IF (.NOT. ASSOCIATED(qs_energy)) THEN
103         ALLOCATE (qs_energy)
104         NULLIFY (qs_energy%ddapc_restraint)
105      END IF
106
107      CALL init_qs_energy(qs_energy)
108      CALL timestop(handle)
109
110   END SUBROUTINE allocate_qs_energy
111
112! **************************************************************************************************
113!> \brief   Deallocate a Quickstep energy data structure.
114!> \param qs_energy ...
115!> \date    13.06.2002
116!> \author  MK
117!> \version 1.0
118! **************************************************************************************************
119   SUBROUTINE deallocate_qs_energy(qs_energy)
120      TYPE(qs_energy_type), POINTER                      :: qs_energy
121
122      CHARACTER(len=*), PARAMETER :: routineN = 'deallocate_qs_energy', &
123         routineP = moduleN//':'//routineN
124
125      IF (ASSOCIATED(qs_energy)) THEN
126         IF (ASSOCIATED(qs_energy%ddapc_restraint)) THEN
127            DEALLOCATE (qs_energy%ddapc_restraint)
128         END IF
129         DEALLOCATE (qs_energy)
130      ELSE
131         CALL cp_abort(__LOCATION__, &
132                       "The qs_energy pointer is not associated "// &
133                       "and cannot be deallocated")
134      END IF
135
136   END SUBROUTINE deallocate_qs_energy
137
138! **************************************************************************************************
139!> \brief   Initialise a Quickstep energy data structure.
140!> \param qs_energy ...
141!> \date    13.06.2002
142!> \author  MK
143!> \version 1.0
144! **************************************************************************************************
145   SUBROUTINE init_qs_energy(qs_energy)
146
147      TYPE(qs_energy_type), POINTER                      :: qs_energy
148
149      CHARACTER(len=*), PARAMETER :: routineN = 'init_qs_energy', routineP = moduleN//':'//routineN
150
151      IF (ASSOCIATED(qs_energy)) THEN
152         qs_energy%core = 0.0_dp
153         qs_energy%core_overlap = 0.0_dp
154         qs_energy%core_overlap0 = 0.0_dp
155         qs_energy%core_self = 0.0_dp
156         qs_energy%repulsive = 0.0_dp
157         qs_energy%dispersion = 0.0_dp
158         qs_energy%gcp = 0.0_dp
159         qs_energy%qmmm_el = 0.0_dp
160         qs_energy%qmmm_nu = 0.0_dp
161         qs_energy%ex = 0.0_dp
162         qs_energy%exc = 0.0_dp
163         qs_energy%exc_aux_fit = 0.0_dp
164         qs_energy%exc1 = 0.0_dp
165         qs_energy%e_hartree = 0.0_dp
166         qs_energy%hartree = 0.0_dp
167         qs_energy%hartree_1c = 0.0_dp
168         qs_energy%image_charge = 0.0_dp
169         qs_energy%mulliken = 0.0_dp
170         qs_energy%cdft = 0.0_dp
171         qs_energy%efield = 0.0_dp
172         qs_energy%efield_core = 0.0_dp
173         qs_energy%ee = 0.0_dp
174         qs_energy%ee_core = 0.0_dp
175         qs_energy%s2_restraint = 0.0_dp
176         qs_energy%dft_plus_u = 0.0_dp
177         qs_energy%sccs_hartree = 0.0_dp
178         qs_energy%sccs_pol = 0.0_dp
179         qs_energy%sccs_mpc = 0.0_dp
180         qs_energy%sccs_cav = 0.0_dp
181         qs_energy%sccs_dis = 0.0_dp
182         qs_energy%sccs_rep = 0.0_dp
183         qs_energy%dftb3 = 0.0_dp
184         qs_energy%kTS = 0.0_dp
185         qs_energy%mp2 = 0.0_dp
186         qs_energy%efermi = 0.0_dp
187         qs_energy%kinetic = 0.0_dp
188         qs_energy%surf_dipole = 0.0_dp
189         qs_energy%total = 0.0_dp
190         qs_energy%singles_corr = 0.0_dp
191         IF (.NOT. ASSOCIATED(qs_energy%ddapc_restraint)) THEN
192            ALLOCATE (qs_energy%ddapc_restraint(1))
193         END IF
194         qs_energy%ddapc_restraint(:) = 0.0_dp
195      ELSE
196         CALL cp_abort(__LOCATION__, &
197                       "The qs_energy pointer is not associated "// &
198                       "and cannot be initialised")
199      END IF
200
201   END SUBROUTINE init_qs_energy
202
203END MODULE qs_energy_types
204