1!--------------------------------------------------------------------------------------------------!
2!   CP2K: A general program to perform molecular dynamics simulations                              !
3!   Copyright (C) 2000 - 2020  CP2K developers group                                               !
4!--------------------------------------------------------------------------------------------------!
5
6! **************************************************************************************************
7!> \brief Lumps all possible extended system variables into one
8!>    type for easy access and passing
9!> \par History
10!>      Teodoro Laino - 09.2007 - University of Zurich
11!>        Cleaned the typo.. no need to have an extended
12!>        type. Thermostat and Barostat type have been created
13!> \author CJM
14! **************************************************************************************************
15MODULE extended_system_types
16   USE bibliography,                    ONLY: Nose1984a,&
17                                              Nose1984b,&
18                                              cite_reference
19   USE input_constants,                 ONLY: do_thermo_no_communication
20   USE input_section_types,             ONLY: section_vals_type,&
21                                              section_vals_val_get
22   USE kinds,                           ONLY: dp
23#include "./base/base_uses.f90"
24
25   IMPLICIT NONE
26   PRIVATE
27
28   PUBLIC :: lnhc_dealloc, &
29             lnhc_init, &
30             lnhc_parameters_type, &
31             map_info_type, &
32             create_map_info_type, &
33             release_map_info_type, &
34             npt_info_type
35
36   LOGICAL, PARAMETER, PUBLIC :: debug_isotropic_limit = .FALSE.
37   LOGICAL, PARAMETER, PUBLIC :: debug_uniaxial_limit = .FALSE.
38
39! **************************************************************************************************
40   TYPE npt_info_type
41      REAL(KIND=dp) :: eps
42      REAL(KIND=dp) :: v
43      REAL(KIND=dp) :: f
44      REAL(KIND=dp) :: mass
45   END TYPE npt_info_type
46
47! **************************************************************************************************
48   TYPE nhc_info_type
49      INTEGER        :: degrees_of_freedom
50      REAL(KIND=dp) :: eta
51      REAL(KIND=dp) :: v
52      REAL(KIND=dp) :: f
53      REAL(KIND=dp) :: nkt
54      REAL(KIND=dp) :: mass
55   END TYPE nhc_info_type
56
57! **************************************************************************************************
58   TYPE point_info_type
59      REAL(KIND=dp), POINTER :: point
60   END TYPE point_info_type
61
62! **************************************************************************************************
63   TYPE map_info_type
64      INTEGER                                         :: dis_type
65      INTEGER, POINTER, DIMENSION(:)                  :: index, map_index
66      REAL(KIND=dp), POINTER, DIMENSION(:)           :: v_scale
67      REAL(KIND=dp), POINTER, DIMENSION(:)           :: s_kin
68      TYPE(point_info_type), POINTER, DIMENSION(:, :) :: p_scale
69      TYPE(point_info_type), POINTER, DIMENSION(:, :) :: p_kin
70   END TYPE map_info_type
71
72! **************************************************************************************************
73   TYPE lnhc_parameters_type
74      INTEGER                                 :: nyosh, nc, nhc_len
75      INTEGER                                 :: glob_num_nhc, loc_num_nhc, region
76      REAL(KIND=dp)                           :: tau_nhc, dt_fact
77      REAL(KIND=dp), POINTER                  :: dt_yosh(:)
78      TYPE(nhc_info_type), POINTER            :: nvt(:, :)
79      TYPE(map_info_type), POINTER            :: map_info
80   END TYPE lnhc_parameters_type
81
82   CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'extended_system_types'
83
84CONTAINS
85
86! **************************************************************************************************
87!> \brief Initialize type for Nose-Hoover thermostat
88!> \param lnhc ...
89!> \param section ...
90! **************************************************************************************************
91   SUBROUTINE lnhc_init(lnhc, section)
92      TYPE(lnhc_parameters_type), POINTER                :: lnhc
93      TYPE(section_vals_type), POINTER                   :: section
94
95      CHARACTER(LEN=*), PARAMETER :: routineN = 'lnhc_init', routineP = moduleN//':'//routineN
96
97      NULLIFY (lnhc%dt_yosh)
98      NULLIFY (lnhc%nvt)
99      NULLIFY (lnhc%map_info)
100      lnhc%loc_num_nhc = 0
101      lnhc%glob_num_nhc = 0
102      lnhc%dt_fact = 1.0_dp
103      CALL cite_reference(Nose1984a)
104      CALL cite_reference(Nose1984b)
105      CALL section_vals_val_get(section, "LENGTH", i_val=lnhc%nhc_len)
106      CALL section_vals_val_get(section, "YOSHIDA", i_val=lnhc%nyosh)
107      CALL section_vals_val_get(section, "TIMECON", r_val=lnhc%tau_nhc)
108      CALL section_vals_val_get(section, "MTS", i_val=lnhc%nc)
109      CALL create_map_info_type(lnhc%map_info)
110
111   END SUBROUTINE lnhc_init
112
113! **************************************************************************************************
114!> \brief create the map_info type
115!> \param map_info ...
116! **************************************************************************************************
117   SUBROUTINE create_map_info_type(map_info)
118      TYPE(map_info_type), POINTER                       :: map_info
119
120      CHARACTER(LEN=*), PARAMETER :: routineN = 'create_map_info_type', &
121         routineP = moduleN//':'//routineN
122
123      ALLOCATE (map_info)
124      NULLIFY (map_info%index, map_info%map_index)
125      NULLIFY (map_info%v_scale)
126      NULLIFY (map_info%p_scale)
127      NULLIFY (map_info%s_kin)
128      NULLIFY (map_info%p_kin)
129      map_info%dis_type = do_thermo_no_communication
130
131   END SUBROUTINE create_map_info_type
132
133! **************************************************************************************************
134!> \brief release the map_info type
135!> \param map_info ...
136! **************************************************************************************************
137   SUBROUTINE release_map_info_type(map_info)
138      TYPE(map_info_type), POINTER                       :: map_info
139
140      CHARACTER(LEN=*), PARAMETER :: routineN = 'release_map_info_type', &
141         routineP = moduleN//':'//routineN
142
143      IF (ASSOCIATED(map_info)) THEN
144         IF (ASSOCIATED(map_info%p_kin)) THEN
145            DEALLOCATE (map_info%p_kin)
146         END IF
147         IF (ASSOCIATED(map_info%p_scale)) THEN
148            DEALLOCATE (map_info%p_scale)
149         END IF
150         IF (ASSOCIATED(map_info%v_scale)) THEN
151            DEALLOCATE (map_info%v_scale)
152         END IF
153         IF (ASSOCIATED(map_info%s_kin)) THEN
154            DEALLOCATE (map_info%s_kin)
155         END IF
156         IF (ASSOCIATED(map_info%index)) THEN
157            DEALLOCATE (map_info%index)
158         END IF
159         IF (ASSOCIATED(map_info%map_index)) THEN
160            DEALLOCATE (map_info%map_index)
161         END IF
162
163         DEALLOCATE (map_info)
164      END IF
165
166   END SUBROUTINE release_map_info_type
167
168! **************************************************************************************************
169!> \brief Deallocate type for Nose-Hoover thermostat
170!> \param lnhc ...
171! **************************************************************************************************
172   SUBROUTINE lnhc_dealloc(lnhc)
173      TYPE(lnhc_parameters_type), POINTER                :: lnhc
174
175      CHARACTER(LEN=*), PARAMETER :: routineN = 'lnhc_dealloc', routineP = moduleN//':'//routineN
176
177      IF (ASSOCIATED(lnhc)) THEN
178         IF (ASSOCIATED(lnhc%dt_yosh)) THEN
179            DEALLOCATE (lnhc%dt_yosh)
180         END IF
181         IF (ASSOCIATED(lnhc%nvt)) THEN
182            DEALLOCATE (lnhc%nvt)
183         ENDIF
184         CALL release_map_info_type(lnhc%map_info)
185         DEALLOCATE (lnhc)
186      ENDIF
187
188   END SUBROUTINE lnhc_dealloc
189
190END MODULE extended_system_types
191