File: csvr_system_types.F

package info (click to toggle)
cp2k 6.1-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 204,532 kB
  • sloc: fortran: 835,196; f90: 59,605; python: 9,861; sh: 7,882; cpp: 4,868; ansic: 2,807; xml: 2,185; lisp: 733; pascal: 612; perl: 547; makefile: 497; csh: 16
file content (176 lines) | stat: -rw-r--r-- 7,963 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
!--------------------------------------------------------------------------------------------------!
!   CP2K: A general program to perform molecular dynamics simulations                              !
!   Copyright (C) 2000 - 2018  CP2K developers group                                               !
!--------------------------------------------------------------------------------------------------!

! **************************************************************************************************
!> \brief Type for the canonical sampling through velocity rescaling
!> \author Teodoro Laino - 09.2007 University of Zurich [tlaino]
! **************************************************************************************************
MODULE csvr_system_types
   USE bibliography,                    ONLY: Bussi2007,&
                                              cite_reference
   USE extended_system_types,           ONLY: create_map_info_type,&
                                              map_info_type,&
                                              release_map_info_type
   USE input_section_types,             ONLY: section_vals_type,&
                                              section_vals_val_get
   USE kinds,                           ONLY: dp
   USE parallel_rng_types,              ONLY: GAUSSIAN,&
                                              create_rng_stream,&
                                              delete_rng_stream,&
                                              next_rng_seed,&
                                              rng_stream_type
   USE simpar_types,                    ONLY: simpar_type
   USE string_utilities,                ONLY: compress
#include "./base/base_uses.f90"

   IMPLICIT NONE

   PRIVATE
   PUBLIC :: csvr_system_type, &
             csvr_init, &
             csvr_dealloc, &
             csvr_thermo_create

! **************************************************************************************************
   TYPE csvr_thermo_type
      INTEGER                                 :: degrees_of_freedom
      REAL(KIND=dp)                           :: nkt
      REAL(KIND=dp)                           :: thermostat_energy
      REAL(KIND=dp)                           :: region_kin_energy
      TYPE(rng_stream_type), POINTER          :: gaussian_rng_stream
   END TYPE csvr_thermo_type

! **************************************************************************************************
   TYPE csvr_system_type
      INTEGER                                 :: region, glob_num_csvr, loc_num_csvr
      REAL(KIND=dp)                           :: tau_csvr, dt_fact
      TYPE(csvr_thermo_type), POINTER         :: nvt(:)
      TYPE(map_info_type), POINTER            :: map_info
   END TYPE csvr_system_type

! *** Global parameters ***
   CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'csvr_system_types'

CONTAINS

! **************************************************************************************************
!> \brief Initialize type for Canonical Sampling through Velocity Rescaling (CSVR)
!> \param csvr ...
!> \param simpar ...
!> \param section ...
!> \author Teodoro Laino [tlaino] 10.2007- University of Zurich
! **************************************************************************************************
   SUBROUTINE csvr_init(csvr, simpar, section)
      TYPE(csvr_system_type), POINTER                    :: csvr
      TYPE(simpar_type), POINTER                         :: simpar
      TYPE(section_vals_type), POINTER                   :: section

      CHARACTER(LEN=*), PARAMETER :: routineN = 'csvr_init', routineP = moduleN//':'//routineN

      NULLIFY (csvr%nvt)
      NULLIFY (csvr%map_info)
      csvr%loc_num_csvr = 0
      csvr%glob_num_csvr = 0
      csvr%dt_fact = 1.0_dp
      CALL cite_reference(Bussi2007)
      CALL section_vals_val_get(section, "TIMECON", r_val=csvr%tau_csvr)
      ! The CSVR library expects the tau_csv to be in unit of integration timestep
      ! if applied once.. divided by two if the process is applied both to the first
      ! and the second verlet step
      csvr%tau_csvr = csvr%tau_csvr/(0.5_dp*simpar%dt)
      CALL create_map_info_type(csvr%map_info)

   END SUBROUTINE csvr_init

! **************************************************************************************************
!> \brief Initialize NVT type for CSVR thermostat
!> \param csvr ...
!> \author Teodoro Laino [tlaino] 10.2007- University of Zurich
! **************************************************************************************************
   SUBROUTINE csvr_thermo_create(csvr)
      TYPE(csvr_system_type), POINTER                    :: csvr

      CHARACTER(LEN=*), PARAMETER :: routineN = 'csvr_thermo_create', &
         routineP = moduleN//':'//routineN

      CHARACTER(LEN=40)                                  :: name
      INTEGER                                            :: i, ithermo, my_index
      REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :)     :: seed
      REAL(KIND=dp), DIMENSION(3, 2)                     :: initial_seed, my_seed

      CPASSERT(ASSOCIATED(csvr))
      CPASSERT(.NOT. ASSOCIATED(csvr%nvt))

      ALLOCATE (csvr%nvt(csvr%loc_num_csvr))
      DO i = 1, csvr%loc_num_csvr
         csvr%nvt(i)%thermostat_energy = 0.0_dp
         NULLIFY (csvr%nvt(i)%gaussian_rng_stream)
      END DO
      ! Initialize the gaussian stream random number
      ALLOCATE (seed(3, 2, csvr%glob_num_csvr))
      initial_seed = next_rng_seed()

      seed(:, :, 1) = initial_seed
      DO ithermo = 2, csvr%glob_num_csvr
         seed(:, :, ithermo) = next_rng_seed(seed(:, :, ithermo-1))
      END DO
      ! Update initial seed
      initial_seed = next_rng_seed(seed(:, :, csvr%glob_num_csvr))
      DO ithermo = 1, csvr%loc_num_csvr
         my_index = csvr%map_info%index(ithermo)
         my_seed = seed(:, :, my_index)
         WRITE (UNIT=name, FMT="(A,I8)") "Wiener process for Thermostat #", my_index
         CALL compress(name)
         CALL create_rng_stream(rng_stream=csvr%nvt(ithermo)%gaussian_rng_stream, &
                                name=name, distribution_type=GAUSSIAN, extended_precision=.TRUE., &
                                seed=my_seed)
      END DO
      DEALLOCATE (seed)

   END SUBROUTINE csvr_thermo_create

! **************************************************************************************************
!> \brief Deallocate type for CSVR thermostat
!> \param csvr ...
!> \author Teodoro Laino [tlaino] 10.2007- University of Zurich
! **************************************************************************************************
   SUBROUTINE csvr_dealloc(csvr)
      TYPE(csvr_system_type), POINTER                    :: csvr

      CHARACTER(LEN=*), PARAMETER :: routineN = 'csvr_dealloc', routineP = moduleN//':'//routineN

      IF (ASSOCIATED(csvr)) THEN
         CALL csvr_thermo_dealloc(csvr%nvt)
         CALL release_map_info_type(csvr%map_info)
         DEALLOCATE (csvr)
      ENDIF

   END SUBROUTINE csvr_dealloc

! **************************************************************************************************
!> \brief Deallocate NVT type for CSVR thermostat
!> \param nvt ...
!> \author Teodoro Laino [tlaino] 10.2007- University of Zurich
! **************************************************************************************************
   SUBROUTINE csvr_thermo_dealloc(nvt)
      TYPE(csvr_thermo_type), DIMENSION(:), POINTER      :: nvt

      CHARACTER(LEN=*), PARAMETER :: routineN = 'csvr_thermo_dealloc', &
         routineP = moduleN//':'//routineN

      INTEGER                                            :: i

      IF (ASSOCIATED(nvt)) THEN
         DO i = 1, SIZE(nvt)
            IF (ASSOCIATED(nvt(i)%gaussian_rng_stream)) THEN
               CALL delete_rng_stream(nvt(i)%gaussian_rng_stream)
            ENDIF
         END DO
         DEALLOCATE (nvt)
      ENDIF
   END SUBROUTINE csvr_thermo_dealloc

END MODULE csvr_system_types