Line data Source code
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 : !> \brief initialization of the reftraj structure used to analyse
10 : !> previously generated trajectories
11 : !> \par History
12 : !> Created 10-07 [MI]
13 : !> \author MI
14 : ! **************************************************************************************************
15 : MODULE reftraj_types
16 :
17 : USE cp_parser_types, ONLY: cp_parser_type,&
18 : parser_create,&
19 : parser_release
20 : USE input_section_types, ONLY: section_vals_type,&
21 : section_vals_val_get
22 : USE kinds, ONLY: default_path_length,&
23 : dp
24 : USE message_passing, ONLY: mp_para_env_type
25 : #include "../base/base_uses.f90"
26 :
27 : IMPLICIT NONE
28 :
29 : PRIVATE
30 : PUBLIC :: reftraj_type, reftraj_msd_type, &
31 : create_reftraj, release_reftraj
32 :
33 : INTEGER, PARAMETER, PUBLIC :: REFTRAJ_EVAL_NONE = 101
34 : INTEGER, PARAMETER, PUBLIC :: REFTRAJ_EVAL_ENERGY = 102
35 : INTEGER, PARAMETER, PUBLIC :: REFTRAJ_EVAL_ENERGY_FORCES = 103
36 : INTEGER, PARAMETER, PUBLIC :: REFTRAJ_WRAP_NONE = 201
37 : INTEGER, PARAMETER, PUBLIC :: REFTRAJ_WRAP_POSITIVE = 202
38 : INTEGER, PARAMETER, PUBLIC :: REFTRAJ_WRAP_CENTRAL = 203
39 :
40 : ! **************************************************************************************************
41 : !> \brief parameters related to the analysis of previously generated trajectories
42 : !> \author MI
43 : ! **************************************************************************************************
44 : TYPE reftraj_info_type
45 : INTEGER :: first_snapshot = 0
46 : INTEGER :: last_snapshot = 0
47 : INTEGER :: stride = 0
48 : INTEGER :: eval = REFTRAJ_EVAL_NONE
49 : INTEGER :: wrap = REFTRAJ_WRAP_NONE
50 : LOGICAL :: variable_volume = .FALSE.
51 : LOGICAL :: msd = .FALSE.
52 : TYPE(cp_parser_type), POINTER :: traj_parser => NULL()
53 : TYPE(cp_parser_type), POINTER :: cell_parser => NULL()
54 : END TYPE reftraj_info_type
55 :
56 : ! **************************************************************************************************
57 : TYPE reftraj_msd_type
58 : LOGICAL :: disp_atom = .FALSE., msd_kind = .FALSE., msd_molecule = .FALSE., msd_region = .FALSE.
59 : INTEGER :: num_disp_atom = 0, ref0_unit = 0
60 : INTEGER, POINTER, DIMENSION(:) :: disp_atom_index => NULL()
61 : REAL(KIND=dp) :: disp_atom_tol = 0.0_dp, drcom(3) = 0.0_dp, ref0_com(3) = 0.0_dp, total_mass = 0.0_dp
62 : REAL(KIND=dp), POINTER, DIMENSION(:, :) :: disp_atom_dr => NULL()
63 : REAL(KIND=dp), POINTER, DIMENSION(:, :) :: ref0_pos => NULL()
64 : REAL(KIND=dp), POINTER, DIMENSION(:, :) :: ref0_com_molecule => NULL()
65 : REAL(KIND=dp), POINTER, DIMENSION(:, :) :: val_msd_kind => NULL()
66 : REAL(KIND=dp), POINTER, DIMENSION(:, :) :: val_msd_molecule => NULL()
67 : REAL(KIND=dp), POINTER, DIMENSION(:, :) :: val_msd_region => NULL()
68 : END TYPE reftraj_msd_type
69 :
70 : ! **************************************************************************************************
71 : TYPE reftraj_type
72 : INTEGER :: itimes = 0
73 : INTEGER :: itimes0 = 0
74 : INTEGER :: isnap = 0
75 : INTEGER :: natom = 0
76 : LOGICAL :: init = .FALSE.
77 : REAL(KIND=dp) :: epot = 0.0_dp, epot0 = 0.0_dp, time = 0.0_dp, time0 = 0.0_dp
78 : TYPE(reftraj_info_type), POINTER :: info => NULL()
79 : TYPE(reftraj_msd_type), POINTER :: msd => NULL()
80 : END TYPE reftraj_type
81 :
82 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'reftraj_types'
83 :
84 : CONTAINS
85 :
86 : ! **************************************************************************************************
87 : !> \brief ...
88 : !> \param reftraj ...
89 : !> \param reftraj_section ...
90 : !> \param para_env ...
91 : ! **************************************************************************************************
92 36 : SUBROUTINE create_reftraj(reftraj, reftraj_section, para_env)
93 :
94 : TYPE(reftraj_type), INTENT(OUT) :: reftraj
95 : TYPE(section_vals_type), POINTER :: reftraj_section
96 : TYPE(mp_para_env_type), POINTER :: para_env
97 :
98 : CHARACTER(LEN=default_path_length) :: filename
99 :
100 : NULLIFY (reftraj%info)
101 : NULLIFY (reftraj%msd)
102 :
103 36 : ALLOCATE (reftraj%info)
104 : NULLIFY (reftraj%info%traj_parser)
105 : NULLIFY (reftraj%info%cell_parser)
106 :
107 : ! Initialize parser for trajectory
108 36 : CALL section_vals_val_get(reftraj_section, "TRAJ_FILE_NAME", c_val=filename)
109 108 : ALLOCATE (reftraj%info%traj_parser)
110 36 : CALL parser_create(reftraj%info%traj_parser, filename, para_env=para_env)
111 :
112 36 : CALL section_vals_val_get(reftraj_section, "VARIABLE_VOLUME", l_val=reftraj%info%variable_volume)
113 36 : IF (reftraj%info%variable_volume) THEN
114 : ! In case requested initialize parser for cell
115 6 : CALL section_vals_val_get(reftraj_section, "CELL_FILE_NAME", c_val=filename)
116 18 : ALLOCATE (reftraj%info%cell_parser)
117 6 : CALL parser_create(reftraj%info%cell_parser, filename, para_env=para_env)
118 : END IF
119 :
120 36 : CALL section_vals_val_get(reftraj_section, "FIRST_SNAPSHOT", i_val=reftraj%info%first_snapshot)
121 36 : CALL section_vals_val_get(reftraj_section, "LAST_SNAPSHOT", i_val=reftraj%info%last_snapshot)
122 36 : CALL section_vals_val_get(reftraj_section, "STRIDE", i_val=reftraj%info%stride)
123 36 : CALL section_vals_val_get(reftraj_section, "EVAL", i_val=reftraj%info%eval)
124 36 : CALL section_vals_val_get(reftraj_section, "WRAP", i_val=reftraj%info%wrap)
125 :
126 : CALL section_vals_val_get(reftraj_section, "MSD%_SECTION_PARAMETERS_", &
127 36 : l_val=reftraj%info%msd)
128 36 : IF (reftraj%info%msd .AND. (reftraj%info%wrap /= REFTRAJ_WRAP_NONE)) THEN
129 0 : CPWARN("MSD calculation is incompatible with wrapping coordinates")
130 0 : reftraj%info%wrap = REFTRAJ_WRAP_NONE
131 : END IF
132 :
133 36 : END SUBROUTINE create_reftraj
134 :
135 : ! **************************************************************************************************
136 : !> \brief ...
137 : !> \param reftraj ...
138 : !> \par History
139 : !> 10.2007 created
140 : !> \author MI
141 : ! **************************************************************************************************
142 36 : SUBROUTINE release_reftraj(reftraj)
143 :
144 : TYPE(reftraj_type), INTENT(INOUT) :: reftraj
145 :
146 36 : IF (ASSOCIATED(reftraj%info%traj_parser)) THEN
147 36 : CALL parser_release(reftraj%info%traj_parser)
148 36 : DEALLOCATE (reftraj%info%traj_parser)
149 : END IF
150 36 : IF (ASSOCIATED(reftraj%info%cell_parser)) THEN
151 6 : CALL parser_release(reftraj%info%cell_parser)
152 6 : DEALLOCATE (reftraj%info%cell_parser)
153 : END IF
154 36 : IF (ASSOCIATED(reftraj%info)) THEN
155 36 : DEALLOCATE (reftraj%info)
156 : END IF
157 36 : IF (ASSOCIATED(reftraj%msd)) THEN
158 2 : DEALLOCATE (reftraj%msd%ref0_pos)
159 2 : IF (reftraj%msd%msd_kind) THEN
160 2 : DEALLOCATE (reftraj%msd%val_msd_kind)
161 : END IF
162 2 : IF (reftraj%msd%msd_molecule) THEN
163 0 : DEALLOCATE (reftraj%msd%val_msd_molecule)
164 0 : DEALLOCATE (reftraj%msd%ref0_com_molecule)
165 : END IF
166 2 : IF (reftraj%msd%disp_atom) THEN
167 2 : DEALLOCATE (reftraj%msd%disp_atom_index)
168 2 : DEALLOCATE (reftraj%msd%disp_atom_dr)
169 : END IF
170 :
171 2 : DEALLOCATE (reftraj%msd)
172 : END IF
173 :
174 36 : END SUBROUTINE release_reftraj
175 :
176 0 : END MODULE reftraj_types
|