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 module handles definition of the tree nodes for the global and
10 : !> the subtrees binary tree
11 : !> --------------------------------------------------
12 : !> | parent element |
13 : !> | / \ |
14 : !> | accepted (acc) / \ not accepted (nacc) |
15 : !> | / \ |
16 : !> | child child |
17 : !> | / \ / \ |
18 : !> | ... |
19 : !> --------------------------------------------------
20 : !> tree creation assuming acceptance (acc) AND rejectance (nacc)
21 : !> of configuration
22 : !> if configuration is accepted: new configuration (child on acc) on basis
23 : !> of last configuration (one level up)
24 : !> if configuration is rejected: child on nacc on basis of last accepted
25 : !> element (last element which is on acc brach of its parent element)
26 : !> The global tree handles all configurations of different subtrees.
27 : !> The structure element "conf" is an array related to the temperature
28 : !> (sorted) and points to the subtree elements.
29 : !> \par History
30 : !> 11.2012 created [Mandes Schoenherr]
31 : !> \author Mandes
32 : ! **************************************************************************************************
33 :
34 : MODULE tmc_types
35 : USE cell_types, ONLY: cell_type
36 : USE kinds, ONLY: default_path_length,&
37 : default_string_length,&
38 : dp
39 : USE message_passing, ONLY: mp_para_env_release,&
40 : mp_para_env_type
41 : USE parallel_rng_types, ONLY: rng_stream_type
42 : USE tmc_move_types, ONLY: tmc_move_type
43 : USE tmc_stati, ONLY: task_type_MC
44 : USE tmc_tree_types, ONLY: clean_list,&
45 : elem_array_type,&
46 : elem_list_type,&
47 : global_tree_type
48 : #include "../base/base_uses.f90"
49 :
50 : IMPLICIT NONE
51 :
52 : PRIVATE
53 :
54 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'tmc_types'
55 :
56 : PUBLIC :: tmc_env_type, tmc_comp_set_type, tmc_param_type
57 : PUBLIC :: tmc_env_create, tmc_env_release, &
58 : tmc_master_env_create, tmc_master_env_release, &
59 : tmc_worker_env_create, tmc_worker_env_release
60 : PUBLIC :: tmc_atom_type
61 : PUBLIC :: allocate_tmc_atom_type
62 :
63 : ! global environment
64 : TYPE tmc_env_type
65 : TYPE(tmc_comp_set_type), POINTER :: tmc_comp_set => NULL()
66 : TYPE(tmc_param_type), POINTER :: params => NULL()
67 : TYPE(rng_stream_type), ALLOCATABLE :: rng_stream
68 : TYPE(master_env_type), POINTER :: m_env => NULL()
69 : TYPE(worker_env_type), POINTER :: w_env => NULL()
70 : END TYPE tmc_env_type
71 :
72 : ! structure for remembering the main values used for reordering MPI communicators
73 : ! \param group_nr: the first group_ener_nr groups are for energy calculation,
74 : ! then the Configurational Change groups,
75 : ! the global master has group 0 and unused cores have negative group numbering
76 : TYPE tmc_comp_set_type
77 : INTEGER :: group_ener_size = 0
78 : INTEGER :: group_ener_nr = 0
79 : INTEGER :: group_cc_size = 0
80 : INTEGER :: group_cc_nr = 0
81 : INTEGER :: group_nr = 0
82 : INTEGER :: ana_on_the_fly = -1
83 : ! the communicators (para_env)
84 : TYPE(mp_para_env_type), POINTER :: para_env_m_w => NULL()
85 : TYPE(mp_para_env_type), POINTER :: para_env_sub_group => NULL()
86 : TYPE(mp_para_env_type), POINTER :: para_env_m_first_w => NULL()
87 : TYPE(mp_para_env_type), POINTER :: para_env_m_ana => NULL()
88 : TYPE(mp_para_env_type), POINTER :: para_env_m_only => NULL()
89 : END TYPE tmc_comp_set_type
90 :
91 : ! struct for TMC global variables
92 : TYPE tmc_param_type
93 : INTEGER :: task_type = task_type_MC
94 : INTEGER :: dim_per_elem = 3
95 : INTEGER :: nr_temp = -1
96 : REAL(KIND=dp), DIMENSION(:), POINTER :: Temp => NULL()
97 : TYPE(cell_type), POINTER :: cell => NULL()
98 : REAL(KIND=dp), DIMENSION(:), POINTER :: sub_box_size => NULL()
99 : TYPE(tmc_atom_type), DIMENSION(:), POINTER :: atoms => NULL()
100 :
101 : INTEGER :: nr_elem_mv = -1
102 : TYPE(tmc_move_type), POINTER :: move_types => NULL()
103 : TYPE(tmc_move_type), POINTER :: nmc_move_types => NULL()
104 : REAL(KIND=dp) :: pressure = 0.0_dp
105 : LOGICAL :: v_isotropic = .FALSE.
106 : LOGICAL :: mv_cen_of_mass = .FALSE.
107 : LOGICAL :: esimate_acc_prob = .FALSE.
108 : LOGICAL :: SPECULATIVE_CANCELING = .FALSE.
109 : LOGICAL :: use_scf_energy_info = .FALSE.
110 : LOGICAL :: USE_REDUCED_TREE = .FALSE.
111 : CHARACTER(LEN=default_path_length) :: energy_inp_file = ""
112 : CHARACTER(LEN=default_path_length) :: NMC_inp_file = ""
113 : LOGICAL :: DRAW_TREE = .FALSE.
114 : CHARACTER(LEN=default_path_length) :: dot_file_name = ""
115 : CHARACTER(LEN=default_path_length) :: all_conf_file_name = ""
116 : LOGICAL :: print_only_diff_conf = .FALSE.
117 : LOGICAL :: print_trajectory = .FALSE.
118 : LOGICAL :: print_dipole = .FALSE.
119 : LOGICAL :: print_forces = .FALSE.
120 : LOGICAL :: print_cell = .FALSE.
121 : LOGICAL :: print_energies = .FALSE.
122 : TYPE(prior_estimate_acceptance_type), POINTER :: prior_NMC_acc => NULL()
123 : LOGICAL :: print_test_output = .FALSE.
124 : END TYPE tmc_param_type
125 :
126 : TYPE tmc_atom_type
127 : CHARACTER(LEN=default_string_length) :: name = ""
128 : REAL(KIND=dp) :: mass = 0.0_dp
129 : END TYPE tmc_atom_type
130 :
131 : ! to estimate the prior acceptance
132 : TYPE prior_estimate_acceptance_type
133 : INTEGER :: counter = 0
134 : REAL(KIND=dp) :: aver = 0.0_dp, aver_2 = 0.0_dp
135 : END TYPE prior_estimate_acceptance_type
136 :
137 : ! environments for the master
138 : TYPE master_env_type
139 : INTEGER :: num_MC_elem = 0! the specified number of Markov Chain elements, to be reached
140 : CHARACTER(LEN=default_path_length) :: restart_in_file_name = ""
141 : CHARACTER(LEN=default_path_length) :: restart_out_file_name = ""
142 : INTEGER :: restart_out_step = 0
143 : INTEGER :: io_unit = -1
144 : INTEGER :: info_out_step_size = 0
145 : REAL(KIND=dp) :: walltime = 0.0_dp
146 : INTEGER :: rnd_init = 0
147 : REAL(KIND=dp) :: temp_decrease = 0.0_dp ! for simulated annealing
148 : TYPE(elem_list_type), POINTER :: cancelation_list => NULL()
149 : INTEGER :: count_cancel_ener = 0
150 : INTEGER :: count_cancel_NMC = 0
151 : ! masters tree stuff
152 : TYPE(global_tree_type), POINTER :: gt_head => NULL(), gt_act => NULL()
153 : INTEGER, DIMENSION(:), POINTER :: tree_node_count => NULL()
154 : INTEGER, DIMENSION(:), POINTER :: result_count => NULL()
155 : TYPE(elem_array_type), DIMENSION(:), &
156 : POINTER :: result_list => NULL(), &
157 : st_heads => NULL(), &
158 : st_clean_ends => NULL()
159 : TYPE(global_tree_type), POINTER :: gt_clean_end => NULL()
160 : INTEGER, DIMENSION(4) :: estim_corr_wrong = 0
161 : TYPE(elem_list_type), POINTER :: analysis_list => NULL()
162 : END TYPE master_env_type
163 :
164 : ! environment for the worker
165 : TYPE worker_env_type
166 : INTEGER :: env_id_ener = -1, env_id_approx = -1
167 : INTEGER :: io_unit = -1
168 : REAL(KIND=dp) :: act_temp = 0.0_dp
169 : END TYPE worker_env_type
170 :
171 : CONTAINS
172 :
173 : ! **************************************************************************************************
174 : !> \brief creates a new structure environment for TMC
175 : !> \param tmc_env structure with parameters for TMC
176 : !> \author Mandes 11.2012
177 : ! **************************************************************************************************
178 40 : SUBROUTINE tmc_env_create(tmc_env)
179 : TYPE(tmc_env_type), POINTER :: tmc_env
180 :
181 : CHARACTER(LEN=*), PARAMETER :: routineN = 'tmc_env_create'
182 :
183 : INTEGER :: handle
184 :
185 40 : CALL timeset(routineN, handle)
186 :
187 40 : CPASSERT(.NOT. ASSOCIATED(tmc_env))
188 :
189 40 : ALLOCATE (tmc_env)
190 :
191 40 : ALLOCATE (tmc_env%tmc_comp_set)
192 :
193 : ! initialize the parameter section
194 40 : ALLOCATE (tmc_env%params)
195 :
196 40 : ALLOCATE (tmc_env%params%sub_box_size(tmc_env%params%dim_per_elem))
197 160 : tmc_env%params%sub_box_size(:) = -1.0_dp
198 :
199 40 : CALL timestop(handle)
200 :
201 40 : END SUBROUTINE tmc_env_create
202 :
203 : ! **************************************************************************************************
204 : !> \brief releases the structure environment for TMC
205 : !> \param tmc_env structure with parameters for TMC
206 : !> \author Mandes 11.2012
207 : ! **************************************************************************************************
208 40 : SUBROUTINE tmc_env_release(tmc_env)
209 : TYPE(tmc_env_type), POINTER :: tmc_env
210 :
211 : CHARACTER(LEN=*), PARAMETER :: routineN = 'tmc_env_release'
212 :
213 : INTEGER :: handle
214 :
215 40 : CALL timeset(routineN, handle)
216 :
217 40 : CPASSERT(ASSOCIATED(tmc_env))
218 40 : CPASSERT(ASSOCIATED(tmc_env%params))
219 :
220 40 : DEALLOCATE (tmc_env%params%sub_box_size)
221 40 : IF (ASSOCIATED(tmc_env%params%Temp)) THEN
222 28 : DEALLOCATE (tmc_env%params%Temp)
223 : END IF
224 40 : IF (ASSOCIATED(tmc_env%params%cell)) THEN
225 34 : DEALLOCATE (tmc_env%params%cell)
226 : END IF
227 40 : IF (ASSOCIATED(tmc_env%params%atoms)) THEN
228 20 : CALL deallocate_tmc_atom_type(tmc_env%params%atoms)
229 : END IF
230 40 : DEALLOCATE (tmc_env%params)
231 :
232 40 : CALL mp_para_env_release(tmc_env%tmc_comp_set%para_env_sub_group)
233 40 : CALL mp_para_env_release(tmc_env%tmc_comp_set%para_env_m_w)
234 40 : IF (ASSOCIATED(tmc_env%tmc_comp_set%para_env_m_first_w)) THEN
235 28 : CALL mp_para_env_release(tmc_env%tmc_comp_set%para_env_m_first_w)
236 : END IF
237 40 : IF (ASSOCIATED(tmc_env%tmc_comp_set%para_env_m_ana)) THEN
238 26 : CALL mp_para_env_release(tmc_env%tmc_comp_set%para_env_m_ana)
239 : END IF
240 40 : IF (ASSOCIATED(tmc_env%tmc_comp_set%para_env_m_only)) THEN
241 14 : CALL mp_para_env_release(tmc_env%tmc_comp_set%para_env_m_only)
242 : END IF
243 :
244 40 : DEALLOCATE (tmc_env%tmc_comp_set)
245 :
246 40 : DEALLOCATE (tmc_env)
247 :
248 40 : CALL timestop(handle)
249 :
250 40 : END SUBROUTINE tmc_env_release
251 :
252 : ! **************************************************************************************************
253 : !> \brief creates a new structure environment for TMC master
254 : !> \param tmc_env structure with parameters for TMC
255 : !> \author Mandes 11.2012
256 : ! **************************************************************************************************
257 14 : SUBROUTINE tmc_master_env_create(tmc_env)
258 : TYPE(tmc_env_type), POINTER :: tmc_env
259 :
260 : CHARACTER(LEN=*), PARAMETER :: routineN = 'tmc_master_env_create'
261 :
262 : INTEGER :: handle, i
263 :
264 14 : CALL timeset(routineN, handle)
265 :
266 14 : CPASSERT(ASSOCIATED(tmc_env))
267 14 : CPASSERT(ASSOCIATED(tmc_env%params))
268 14 : CPASSERT(tmc_env%params%nr_temp > 0)
269 :
270 14 : CPASSERT(.NOT. ASSOCIATED(tmc_env%m_env))
271 :
272 70 : ALLOCATE (tmc_env%m_env)
273 14 : NULLIFY (tmc_env%m_env%gt_head, tmc_env%m_env%gt_act, tmc_env%m_env%tree_node_count, &
274 14 : tmc_env%m_env%result_count, tmc_env%m_env%result_list, &
275 14 : tmc_env%m_env%st_heads, tmc_env%m_env%st_clean_ends, &
276 14 : tmc_env%m_env%gt_clean_end, tmc_env%m_env%cancelation_list, tmc_env%m_env%analysis_list)
277 :
278 14 : tmc_env%m_env%restart_in_file_name = ""
279 14 : tmc_env%m_env%restart_out_file_name = ""
280 42 : ALLOCATE (tmc_env%m_env%tree_node_count(0:tmc_env%params%nr_temp))
281 54 : tmc_env%m_env%tree_node_count(:) = 0
282 42 : ALLOCATE (tmc_env%m_env%result_count(0:tmc_env%params%nr_temp))
283 54 : tmc_env%m_env%result_count(:) = 0
284 68 : ALLOCATE (tmc_env%m_env%st_heads(tmc_env%params%nr_temp))
285 68 : ALLOCATE (tmc_env%m_env%st_clean_ends(tmc_env%params%nr_temp))
286 :
287 68 : IF (tmc_env%params%USE_REDUCED_TREE) ALLOCATE (tmc_env%m_env%result_list(tmc_env%params%nr_temp))
288 :
289 40 : DO i = 1, tmc_env%params%nr_temp
290 26 : tmc_env%m_env%st_heads(i)%elem => NULL()
291 26 : tmc_env%m_env%st_clean_ends(i)%elem => NULL()
292 40 : IF (tmc_env%params%USE_REDUCED_TREE) THEN
293 26 : tmc_env%m_env%result_list(i)%elem => NULL()
294 : END IF
295 : END DO
296 14 : tmc_env%m_env%gt_head => NULL()
297 14 : tmc_env%m_env%gt_clean_end => NULL()
298 14 : tmc_env%m_env%temp_decrease = 1.0_dp
299 14 : tmc_env%m_env%count_cancel_ener = 0
300 14 : tmc_env%m_env%count_cancel_NMC = 0
301 70 : tmc_env%m_env%estim_corr_wrong(:) = 0
302 :
303 14 : ALLOCATE (tmc_env%params%prior_NMC_acc)
304 14 : tmc_env%params%prior_NMC_acc%counter = 0
305 14 : tmc_env%params%prior_NMC_acc%aver = 0.0_dp
306 14 : tmc_env%params%prior_NMC_acc%aver_2 = 0.0_dp
307 :
308 14 : CALL timestop(handle)
309 :
310 14 : END SUBROUTINE tmc_master_env_create
311 :
312 : ! **************************************************************************************************
313 : !> \brief releases the structure environment for TMC master
314 : !> \param tmc_env structure with parameters for TMC
315 : !> \author Mandes 11.2012
316 : ! **************************************************************************************************
317 14 : SUBROUTINE tmc_master_env_release(tmc_env)
318 : TYPE(tmc_env_type), POINTER :: tmc_env
319 :
320 : CHARACTER(LEN=*), PARAMETER :: routineN = 'tmc_master_env_release'
321 :
322 : INTEGER :: handle
323 :
324 14 : CALL timeset(routineN, handle)
325 :
326 14 : CPASSERT(ASSOCIATED(tmc_env))
327 14 : CPASSERT(ASSOCIATED(tmc_env%m_env))
328 :
329 14 : CALL clean_list(tmc_env%m_env%analysis_list)
330 14 : CALL clean_list(tmc_env%m_env%cancelation_list)
331 :
332 14 : DEALLOCATE (tmc_env%m_env%tree_node_count)
333 14 : DEALLOCATE (tmc_env%m_env%result_count)
334 14 : DEALLOCATE (tmc_env%m_env%st_heads)
335 14 : DEALLOCATE (tmc_env%m_env%st_clean_ends)
336 14 : IF (tmc_env%params%USE_REDUCED_TREE) DEALLOCATE (tmc_env%m_env%result_list)
337 14 : DEALLOCATE (tmc_env%params%prior_NMC_acc)
338 :
339 14 : DEALLOCATE (tmc_env%m_env)
340 :
341 14 : CALL timestop(handle)
342 :
343 14 : END SUBROUTINE tmc_master_env_release
344 :
345 : ! **************************************************************************************************
346 : !> \brief creates a new structure environment for TMC master
347 : !> \param tmc_env structure with parameters for TMC
348 : !> \author Mandes 11.2012
349 : ! **************************************************************************************************
350 14 : SUBROUTINE tmc_worker_env_create(tmc_env)
351 : TYPE(tmc_env_type), POINTER :: tmc_env
352 :
353 : CHARACTER(LEN=*), PARAMETER :: routineN = 'tmc_worker_env_create'
354 :
355 : INTEGER :: handle
356 :
357 14 : CALL timeset(routineN, handle)
358 :
359 14 : CPASSERT(ASSOCIATED(tmc_env))
360 14 : CPASSERT(.NOT. ASSOCIATED(tmc_env%w_env))
361 :
362 14 : ALLOCATE (tmc_env%w_env)
363 :
364 14 : tmc_env%w_env%env_id_ener = -1
365 14 : tmc_env%w_env%env_id_approx = -1
366 14 : tmc_env%w_env%io_unit = -1
367 14 : tmc_env%w_env%act_temp = -1.0_dp
368 :
369 14 : CALL timestop(handle)
370 :
371 14 : END SUBROUTINE tmc_worker_env_create
372 :
373 : ! **************************************************************************************************
374 : !> \brief releases the structure environment for TMC master
375 : !> \param tmc_env structure with parameters for TMC
376 : !> \author Mandes 11.2012
377 : ! **************************************************************************************************
378 14 : SUBROUTINE tmc_worker_env_release(tmc_env)
379 : TYPE(tmc_env_type), POINTER :: tmc_env
380 :
381 : CHARACTER(LEN=*), PARAMETER :: routineN = 'tmc_worker_env_release'
382 :
383 : INTEGER :: handle
384 :
385 14 : CALL timeset(routineN, handle)
386 :
387 14 : CPASSERT(ASSOCIATED(tmc_env))
388 14 : CPASSERT(ASSOCIATED(tmc_env%w_env))
389 :
390 14 : DEALLOCATE (tmc_env%w_env)
391 :
392 14 : CALL timestop(handle)
393 :
394 14 : END SUBROUTINE tmc_worker_env_release
395 :
396 : ! **************************************************************************************************
397 : !> \brief creates a structure for storing the atom informations
398 : !> \param atoms pointer to a list of tmc_atoms_type
399 : !> \param nr_atoms the amount of atoms
400 : !> \author Mandes 01.2013
401 : ! **************************************************************************************************
402 34 : SUBROUTINE allocate_tmc_atom_type(atoms, nr_atoms)
403 : TYPE(tmc_atom_type), DIMENSION(:), POINTER :: atoms
404 : INTEGER, INTENT(IN) :: nr_atoms
405 :
406 34 : CPASSERT(.NOT. ASSOCIATED(atoms))
407 34 : CPASSERT(nr_atoms > 0)
408 :
409 3988 : ALLOCATE (atoms(nr_atoms))
410 :
411 34 : CPASSERT(ASSOCIATED(atoms))
412 :
413 34 : END SUBROUTINE allocate_tmc_atom_type
414 :
415 : ! **************************************************************************************************
416 : !> \brief releases the structure for storing the atom informations
417 : !> \param atoms pointer to a list of tmc_atoms_type
418 : !> \author Mandes 01.2013
419 : ! **************************************************************************************************
420 20 : SUBROUTINE deallocate_tmc_atom_type(atoms)
421 : TYPE(tmc_atom_type), DIMENSION(:), POINTER :: atoms
422 :
423 20 : CPASSERT(ASSOCIATED(atoms))
424 :
425 20 : DEALLOCATE (atoms)
426 :
427 : CPASSERT(.NOT. ASSOCIATED(atoms))
428 20 : END SUBROUTINE deallocate_tmc_atom_type
429 :
430 0 : END MODULE tmc_types
|