(git:db0abe2)
Loading...
Searching...
No Matches
tmc_tree_build.F
Go to the documentation of this file.
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 tree nodes creation, deallocation, references etc.
10!> - we distinguish two kinds of tree nodes: global and sub tree nodes
11!> (because we also are able to do parallel tempering)
12!> - global tree nodes consists of pointers to sub tree nodes
13!> - sub tree nodes consists of position arrays, potential energy, etc.
14!> - furthermore the sub tree elements have references the all global
15!> tree elements referring to them
16!> - for tree element details see tree_types.F
17!>
18!> - for creating we always start with the global tree element
19!> (if not already exist)
20!> - for each new global tree element (depending on the move type):
21!> - two sub tree elements are swapped (Parallel Tempering)
22!> (in global tree element creation)
23!> - the volume of a subtree element is changed
24!> (directly in sub tree element creation)
25!> - positions in one subtree element changes
26!> (in sub tree elem creation or NMC)
27!> - ...
28!> - sub tree elements will be deleted only if no reference to
29!> any global tree element exist anymore
30!> \par History
31!> 11.2012 created [Mandes Schoenherr]
32!> \author Mandes
33! **************************************************************************************************
34
37 USE kinds, ONLY: dp
38 USE tmc_calculations, ONLY: calc_e_kin,&
40 USE tmc_dot_tree, ONLY: create_dot,&
47 USE tmc_move_types, ONLY: &
51 USE tmc_moves, ONLY: change_pos,&
53 USE tmc_stati, ONLY: tmc_status_failed,&
65 USE tmc_tree_types, ONLY: &
71 USE tmc_types, ONLY: tmc_env_type,&
73#include "../base/base_uses.f90"
74
75 IMPLICIT NONE
76
77 PRIVATE
78
79 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'tmc_tree_build'
80
84 PUBLIC :: remove_unused_g_tree
85 PUBLIC :: remove_all_trees
86 PUBLIC :: finalize_trees
87CONTAINS
88
89 !********************************************************************************
90 ! ALLOCATION - DEALLOCATION
91 !********************************************************************************
92! **************************************************************************************************
93!> \brief allocates an elements of the global element structure
94!> \param next_el ...
95!> \param nr_temp ...
96!> \author Mandes 11.2012
97! **************************************************************************************************
98 SUBROUTINE allocate_new_global_tree_node(next_el, nr_temp)
99 TYPE(global_tree_type), POINTER :: next_el
100 INTEGER :: nr_temp
101
102 CHARACTER(LEN=*), PARAMETER :: routineN = 'allocate_new_global_tree_node'
103
104 INTEGER :: handle, itmp
105
106 cpassert(.NOT. ASSOCIATED(next_el))
107
108 ! start the timing
109 CALL timeset(routinen, handle)
110
111 ! allocate everything
112 ALLOCATE (next_el)
113 ALLOCATE (next_el%conf(nr_temp))
114 ALLOCATE (next_el%conf_n_acc(nr_temp))
115 next_el%rnd_nr = -1.0_dp
116
117 DO itmp = 1, nr_temp
118 NULLIFY (next_el%conf(itmp)%elem)
119 next_el%conf_n_acc(itmp) = .false.
120 END DO
121
122 next_el%swaped = .false.
123 ! end the timing
124 CALL timestop(handle)
125 END SUBROUTINE allocate_new_global_tree_node
126
127! **************************************************************************************************
128!> \brief deallocates an elements of the global element structure
129!> \param gt_elem ...
130!> \author Mandes 11.2012
131! **************************************************************************************************
132 SUBROUTINE deallocate_global_tree_node(gt_elem)
133 TYPE(global_tree_type), POINTER :: gt_elem
134
135 CHARACTER(LEN=*), PARAMETER :: routineN = 'deallocate_global_tree_node'
136
137 INTEGER :: handle
138
139 cpassert(ASSOCIATED(gt_elem))
140
141 ! start the timing
142 CALL timeset(routinen, handle)
143
144 ! deallocate everything
145 DEALLOCATE (gt_elem%conf_n_acc)
146 DEALLOCATE (gt_elem%conf)
147 DEALLOCATE (gt_elem)
148 ! end the timing
149 CALL timestop(handle)
150 END SUBROUTINE deallocate_global_tree_node
151
152! **************************************************************************************************
153!> \brief allocates an elements of the subtree element structure
154!> \param tmc_params structure for storing all (global) parameters
155!> \param next_el ...
156!> \param nr_dim ...
157!> \author Mandes 11.2012
158! **************************************************************************************************
159 SUBROUTINE allocate_new_sub_tree_node(tmc_params, next_el, nr_dim)
160 TYPE(tmc_param_type), POINTER :: tmc_params
161 TYPE(tree_type), POINTER :: next_el
162 INTEGER :: nr_dim
163
164 CHARACTER(LEN=*), PARAMETER :: routinen = 'allocate_new_sub_tree_node'
165
166 INTEGER :: handle
167
168 cpassert(.NOT. ASSOCIATED(next_el))
169
170 ! start the timing
171 CALL timeset(routinen, handle)
172
173 ALLOCATE (next_el)
174 NULLIFY (next_el%subbox_center, next_el%pos, next_el%mol, next_el%vel, &
175 next_el%frc, next_el%dipole, next_el%elem_stat, &
176 next_el%gt_nodes_references)
177
178 next_el%scf_energies(:) = huge(next_el%scf_energies)
179 next_el%scf_energies_count = 0
180 ALLOCATE (next_el%pos(nr_dim))
181 ALLOCATE (next_el%mol(nr_dim/tmc_params%dim_per_elem))
182 ALLOCATE (next_el%vel(nr_dim))
183 IF (tmc_params%print_dipole) ALLOCATE (next_el%dipole(tmc_params%dim_per_elem))
184 ALLOCATE (next_el%elem_stat(nr_dim))
185 next_el%elem_stat = status_ok
186 ALLOCATE (next_el%subbox_center(tmc_params%dim_per_elem))
187 IF (tmc_params%print_forces .OR. tmc_params%task_type == task_type_gaussian_adaptation) THEN
188 IF (tmc_params%task_type == task_type_gaussian_adaptation) THEN
189 ALLOCATE (next_el%frc(nr_dim*nr_dim))
190 ELSE
191 ALLOCATE (next_el%frc(nr_dim))
192 END IF
193 next_el%frc = 0.0_dp
194 END IF
195 ALLOCATE (next_el%box_scale(3))
196 next_el%pos(:) = -1.0_dp
197 next_el%mol(:) = -1
198 next_el%box_scale(:) = 1.0_dp
199 next_el%scf_energies(:) = 0.0_dp
200 next_el%e_pot_approx = 0.0_dp
201 next_el%potential = 76543.0_dp
202 next_el%vel = 0.0_dp ! standart MC don"t uses velocities, but it is used at least in acceptance check
203 next_el%ekin = 0.0_dp
204 next_el%ekin_before_md = 0.0_dp
205 next_el%sub_tree_nr = 0
206 next_el%nr = -1
207 next_el%rng_seed(:, :, :) = -1.0_dp
208 next_el%move_type = mv_type_none
209
210 ! end the timing
211 CALL timestop(handle)
212 END SUBROUTINE allocate_new_sub_tree_node
213
214! **************************************************************************************************
215!> \brief deallocates an elements of the subtree element structure
216!> \param tree_elem ...
217!> \author Mandes 11.2012
218! **************************************************************************************************
219 SUBROUTINE deallocate_sub_tree_node(tree_elem)
220 TYPE(tree_type), POINTER :: tree_elem
221
222 CHARACTER(LEN=*), PARAMETER :: routinen = 'deallocate_sub_tree_node'
223
224 INTEGER :: handle
225
226 cpassert(ASSOCIATED(tree_elem))
227
228 ! start the timing
229 CALL timeset(routinen, handle)
230
231 ! reference handling
232 ! should be not necessary, subtree element should be only deallocated,
233 ! if no global tree element points to anymore
235
236 IF (ASSOCIATED(tree_elem%box_scale)) DEALLOCATE (tree_elem%box_scale)
237 IF (ASSOCIATED(tree_elem%frc)) DEALLOCATE (tree_elem%frc)
238 IF (ASSOCIATED(tree_elem%subbox_center)) DEALLOCATE (tree_elem%subbox_center)
239 IF (ASSOCIATED(tree_elem%elem_stat)) DEALLOCATE (tree_elem%elem_stat)
240 IF (ASSOCIATED(tree_elem%dipole)) DEALLOCATE (tree_elem%dipole)
241 IF (ASSOCIATED(tree_elem%vel)) DEALLOCATE (tree_elem%vel)
242 IF (ASSOCIATED(tree_elem%mol)) DEALLOCATE (tree_elem%mol)
243 IF (ASSOCIATED(tree_elem%pos)) DEALLOCATE (tree_elem%pos)
244
245 DEALLOCATE (tree_elem)
246 ! end the timing
247 CALL timestop(handle)
248 END SUBROUTINE deallocate_sub_tree_node
249
250 !********************************************************************************
251 ! INITIALIZATION - FINALIZE
252 !********************************************************************************
253
254! **************************************************************************************************
255!> \brief routine initiate the global and subtrees with the first elements
256!> \param start_elem ...
257!> \param tmc_env structure for storing all (global) parameters
258!> \param job_counts ...
259!> \param worker_timings ...
260!> \author Mandes 11.2012
261! **************************************************************************************************
262 SUBROUTINE init_tree_mod(start_elem, tmc_env, job_counts, worker_timings)
263 TYPE(tree_type), POINTER :: start_elem
264 TYPE(tmc_env_type), POINTER :: tmc_env
265 INTEGER, DIMENSION(:) :: job_counts
266 REAL(kind=dp), DIMENSION(4) :: worker_timings
267
268 CHARACTER(LEN=*), PARAMETER :: routinen = 'init_tree_mod'
269
270 INTEGER :: handle, i
271 TYPE(global_tree_type), POINTER :: global_tree
272
273 NULLIFY (global_tree)
274
275 cpassert(ASSOCIATED(start_elem))
276 cpassert(ASSOCIATED(tmc_env))
277 cpassert(ASSOCIATED(tmc_env%m_env))
278
279 ! start the timing
280 CALL timeset(routinen, handle)
281
282 ! allocate everything
283 CALL allocate_new_global_tree_node(next_el=tmc_env%m_env%gt_act, &
284 nr_temp=tmc_env%params%nr_temp)
285
286 ! use initial/default values
287 CALL tmc_env%rng_stream%get( &
288 bg=tmc_env%m_env%gt_act%rng_seed(:, :, 1), &
289 cg=tmc_env%m_env%gt_act%rng_seed(:, :, 2), &
290 ig=tmc_env%m_env%gt_act%rng_seed(:, :, 3))
291
292 global_tree => tmc_env%m_env%gt_act
293 tmc_env%m_env%gt_head => tmc_env%m_env%gt_act
294
295 ! set global random seed
296 CALL tmc_env%rng_stream%set(bg=global_tree%rng_seed(:, :, 1), &
297 cg=global_tree%rng_seed(:, :, 2), &
298 ig=global_tree%rng_seed(:, :, 3))
299 global_tree%rnd_nr = tmc_env%rng_stream%next()
300
301 !-- SUBTREES: set initial values
302 DO i = 1, SIZE(global_tree%conf)
303 CALL allocate_new_sub_tree_node(tmc_env%params, next_el=global_tree%conf(i)%elem, &
304 nr_dim=SIZE(start_elem%pos))
305 global_tree%conf(i)%elem%move_type = 0
306 global_tree%conf(i)%elem%next_elem_nr => tmc_env%m_env%tree_node_count(i)
307 global_tree%conf(i)%elem%parent => null()
308 global_tree%conf(i)%elem%nr = global_tree%conf(i)%elem%next_elem_nr
309 global_tree%conf(i)%elem%sub_tree_nr = i
310 global_tree%conf(i)%elem%elem_stat = status_ok
311 global_tree%conf(i)%elem%pos = start_elem%pos
312 global_tree%conf(i)%elem%mol = start_elem%mol
313 global_tree%conf(i)%elem%e_pot_approx = start_elem%e_pot_approx
314 global_tree%conf(i)%elem%temp_created = i
315 global_tree%conf(i)%elem%stat = status_calculate_energy
316 !it is default already: global_tree%conf(i)%elem%box_scale(:) = 1.0_dp
317 IF (tmc_env%params%task_type == task_type_gaussian_adaptation) THEN
318 global_tree%conf(i)%elem%vel(:) = start_elem%vel(:)
319 global_tree%conf(i)%elem%frc(:) = start_elem%frc(:)
320 global_tree%conf(i)%elem%potential = start_elem%potential
321 global_tree%conf(i)%elem%ekin = start_elem%ekin
322 global_tree%conf(i)%elem%ekin_before_md = start_elem%ekin_before_md
323 END IF
324
325 !-- different random seeds for every subtree
326 CALL tmc_env%rng_stream%reset_to_next_substream()
327 CALL tmc_env%rng_stream%get(bg=global_tree%conf(i)%elem%rng_seed(:, :, 1), &
328 cg=global_tree%conf(i)%elem%rng_seed(:, :, 2), &
329 ig=global_tree%conf(i)%elem%rng_seed(:, :, 3))
330
331 !-- gaussian distributed velocities
332 !-- calculating the kinetic energy of the initial configuration velocity
333 IF (tmc_env%params%task_type == task_type_mc) THEN
334 IF (tmc_env%params%move_types%mv_weight(mv_type_md) > 0.0_dp) THEN
335 CALL init_vel(vel=global_tree%conf(i)%elem%vel, atoms=tmc_env%params%atoms, &
336 temerature=tmc_env%params%Temp(i), &
337 rng_stream=tmc_env%rng_stream, &
338 rnd_seed=global_tree%conf(i)%elem%rng_seed)
339 global_tree%conf(i)%elem%ekin = calc_e_kin(vel=global_tree%conf(i)%elem%vel, &
340 atoms=tmc_env%params%atoms)
341 END IF
342 END IF
343
344 !-- set tree pointer
345 !-- set pointer of first global tree element
346 tmc_env%m_env%st_heads(i)%elem => global_tree%conf(i)%elem
347 tmc_env%m_env%st_clean_ends(i)%elem => global_tree%conf(i)%elem
348 !-- set initial pointer of result lists
349 tmc_env%m_env%result_list(i)%elem => global_tree%conf(i)%elem
350 END DO
351 tmc_env%m_env%tree_node_count(:) = 0 ! initializing the tree node numbering
352
353 !-- initial global tree element
354 tmc_env%m_env%gt_head => global_tree
355 tmc_env%m_env%gt_clean_end => global_tree
356 global_tree%nr = 0
357 global_tree%swaped = .false.
358 global_tree%mv_conf = 1
359 global_tree%mv_next_conf = modulo(global_tree%mv_conf, SIZE(global_tree%conf)) + 1
360 global_tree%conf_n_acc = .true.
361
362 global_tree%stat = status_created
363 global_tree%prob_acc = 1.0_dp
364
365 ! simulated annealing start temperature
366 global_tree%Temp = tmc_env%params%Temp(1)
367 IF (tmc_env%params%nr_temp /= 1 .AND. tmc_env%m_env%temp_decrease /= 1.0_dp) THEN
368 CALL cp_abort(__location__, &
369 "there is no parallel tempering implementation for simulated annealing implemented "// &
370 "(just one Temp per global tree element.")
371 END IF
372
373 !-- IF program is restarted, read restart file
374 IF (tmc_env%m_env%restart_in_file_name /= "") THEN
375 CALL read_restart_file(tmc_env=tmc_env, job_counts=job_counts, &
376 timings=worker_timings, &
377 file_name=tmc_env%m_env%restart_in_file_name)
378
379 tmc_env%m_env%tree_node_count(0) = global_tree%nr
380
381 DO i = 1, SIZE(tmc_env%m_env%result_list(:))
382 tmc_env%m_env%tree_node_count(i) = tmc_env%m_env%result_list(i)%elem%nr
383 global_tree%conf(i)%elem%stat = status_accepted
384 END DO
385 global_tree%prob_acc = 1.0_dp ! accepted (re)start configuration
386 WRITE (tmc_env%m_env%io_unit, *) "TMC| restarting at Markov Chain element(s): ", &
387 tmc_env%m_env%result_count
388 !TODO enable calculation of the approx energy for case of fitting potential
389 ! and changing the potential in between
390 ! BUT check, there is no double counting (of the last/restarted elem) in the trajectory
391 !IF(tmc_env%params%NMC_inp_file/="") &
392 ! global_tree%conf(1)%elem%stat = status_calc_approx_ener
393 global_tree%stat = status_accepted_result
394 ELSE IF (tmc_env%params%NMC_inp_file /= "") THEN
395 global_tree%conf(1)%elem%stat = status_calc_approx_ener
396 ELSE
397 global_tree%conf(1)%elem%stat = status_created
398 END IF
399
400 !-- set reference of global tree node
401 CALL add_to_references(gt_elem=global_tree)
402
403 !-- draw the first global tree node
404 IF (tmc_env%params%DRAW_TREE) THEN
405 CALL create_global_tree_dot(new_element=global_tree, &
406 tmc_params=tmc_env%params)
407 CALL create_global_tree_dot_color(gt_tree_element=global_tree, &
408 tmc_params=tmc_env%params)
409 END IF
410
411 ! end the timing
412 CALL timestop(handle)
413 END SUBROUTINE init_tree_mod
414
415! **************************************************************************************************
416!> \brief distributes the initial energy to all subtree (if no restart) and
417!> call analysis for this element (write trajectory...)
418!> \param gt_tree_ptr global tree head (initial configuration)
419!> \param tmc_env master environment for restart
420!> (if restart the subtree heads are not equal), result counts and lists
421!> \author Mandes 12.2012
422! **************************************************************************************************
423 SUBROUTINE finalize_init(gt_tree_ptr, tmc_env)
424 TYPE(global_tree_type), POINTER :: gt_tree_ptr
425 TYPE(tmc_env_type), POINTER :: tmc_env
426
427 CHARACTER(LEN=*), PARAMETER :: routinen = 'finalize_init'
428
429 INTEGER :: handle, i
430
431 cpassert(ASSOCIATED(gt_tree_ptr))
432 cpassert(.NOT. ASSOCIATED(gt_tree_ptr%parent))
433 cpassert(ASSOCIATED(tmc_env))
434 cpassert(ASSOCIATED(tmc_env%m_env))
435 cpassert(ASSOCIATED(tmc_env%params))
436
437 ! start the timing
438 CALL timeset(routinen, handle)
439
440 gt_tree_ptr%stat = status_accepted_result
441 !-- distribute energy of first element to all subtrees
442 DO i = 1, SIZE(gt_tree_ptr%conf)
443 gt_tree_ptr%conf(i)%elem%stat = status_accepted_result
444 IF (ASSOCIATED(gt_tree_ptr%conf(1)%elem%dipole)) THEN
445 gt_tree_ptr%conf(i)%elem%dipole = gt_tree_ptr%conf(1)%elem%dipole
446 END IF
447 IF (tmc_env%m_env%restart_in_file_name == "") THEN
448 gt_tree_ptr%conf(i)%elem%potential = gt_tree_ptr%conf(1)%elem%potential
449 END IF
450 END DO
451
452 IF (tmc_env%m_env%restart_in_file_name == "") THEN
453 tmc_env%m_env%result_count(:) = tmc_env%m_env%result_count(:) + 1
454 tmc_env%m_env%result_list(:) = gt_tree_ptr%conf(:)
455 !-- write initial elements in result files
456 DO i = 1, SIZE(tmc_env%m_env%result_list)
457 CALL write_result_list_element(result_list=tmc_env%m_env%result_list, &
458 result_count=tmc_env%m_env%result_count, &
459 conf_updated=i, accepted=.true., &
460 tmc_params=tmc_env%params)
461 ! save for analysis
462 IF (tmc_env%tmc_comp_set%para_env_m_ana%num_pe > 1) THEN
463 CALL add_to_list(elem=tmc_env%m_env%result_list(i)%elem, &
464 list=tmc_env%m_env%analysis_list, &
465 nr=tmc_env%m_env%result_count(i), &
466 temp_ind=i)
467 END IF
468 END DO
469 !CALL write_result_list_element(result_list=tmc_env%m_env%result_list, &
470 ! result_count=tmc_env%m_env%result_count,&
471 ! conf_updated=0, accepted=.TRUE., &
472 ! tmc_params=tmc_env%params)
473 END IF
474 ! end the timing
475 CALL timestop(handle)
476 END SUBROUTINE finalize_init
477
478 !============================================================================
479 ! tree node creation
480 !============================================================================
481! **************************************************************************************************
482!> \brief creates new global tree element and if needed new subtree element
483!> \param tmc_env TMC environment with parameters and pointers to gt element
484!> \param stat return status value
485!> \param new_elem return gt element
486!> \param reactivation_cc_count counting the reactivation of subtree elements
487!> \author Mandes 12.2012
488! **************************************************************************************************
489 SUBROUTINE create_new_gt_tree_node(tmc_env, stat, new_elem, &
490 reactivation_cc_count)
491 TYPE(tmc_env_type), POINTER :: tmc_env
492 INTEGER, INTENT(OUT) :: stat
493 TYPE(global_tree_type), INTENT(OUT), POINTER :: new_elem
494 INTEGER :: reactivation_cc_count
495
496 CHARACTER(LEN=*), PARAMETER :: routinen = 'create_new_gt_tree_node'
497 REAL(kind=dp), PARAMETER :: eps_exp_prob = 1.0e-10_dp
498
499 INTEGER :: handle, swap_conf
500 LOGICAL :: keep_on, n_acc
501 REAL(kind=dp) :: prob, rnd, rnd2
502 TYPE(global_tree_type), POINTER :: tmp_elem
503 TYPE(tree_type), POINTER :: tree_elem
504
505 NULLIFY (tmp_elem, tree_elem, new_elem)
506
507 cpassert(ASSOCIATED(tmc_env))
508 cpassert(ASSOCIATED(tmc_env%params))
509 cpassert(ASSOCIATED(tmc_env%m_env))
510 cpassert(ASSOCIATED(tmc_env%m_env%gt_act))
511
512 ! start the timing
513 CALL timeset(routinen, handle)
514
515 stat = tmc_status_failed
516 !-- search most probable end in global tree for new element
517 tmp_elem => tmc_env%m_env%gt_act
518 n_acc = .true.
519
520 !-- search most probable end to create new element
521 CALL most_prob_end(global_tree_elem=tmp_elem, prob=prob, n_acc=n_acc)
522
523 keep_on = .true.
524 IF (ASSOCIATED(tmp_elem) .AND. (exp(prob) < eps_exp_prob)) THEN
525 new_elem => null()
526 stat = tmc_status_failed
527 keep_on = .false.
528 !-- if not found, do something else
529 !-- (posible if just one end for further calculations
530 ! and there a MD move is still calculated)
531 ELSE IF (.NOT. ASSOCIATED(tmp_elem)) THEN
532 new_elem => null()
533 stat = tmc_status_failed
534 keep_on = .false.
535 END IF
536
537 IF (keep_on) THEN
538 ! if global tree element already exist use that one
539 ! (skip creating new element)
540 ! reactivation
541 IF ((n_acc .AND. ASSOCIATED(tmp_elem%acc)) .OR. &
542 ((.NOT. n_acc) .AND. ASSOCIATED(tmp_elem%nacc))) THEN
543
544 !set pointer to the actual element
545 IF (n_acc) THEN
546 new_elem => tmp_elem%acc
547 END IF
548 IF (.NOT. n_acc) THEN
549 new_elem => tmp_elem%nacc
550 END IF
551
552 ! check for existing subtree element
553 cpassert(ASSOCIATED(new_elem%conf(new_elem%mv_conf)%elem))
554 SELECT CASE (new_elem%conf(new_elem%mv_conf)%elem%stat)
557 ! reactivating subtree element
558 ! (but global tree element already exist)
559 CALL add_to_references(gt_elem=new_elem)
560 reactivation_cc_count = reactivation_cc_count + 1
561 CASE DEFAULT
562 CALL cp_abort(__location__, &
563 "global tree node creation using existing sub tree element, "// &
564 "but is not a canceled one, gt elem "// &
565 cp_to_string(new_elem%nr)//" st elem "// &
566 cp_to_string(new_elem%conf(new_elem%mv_conf)%elem%nr)// &
567 " with stat "// &
568 cp_to_string(new_elem%conf(new_elem%mv_conf)%elem%stat))
569 END SELECT
570 ! change the status of the reactivated subtree element
571 ! move is only done by the master,
572 ! when standard MC moves with single potential are done
573 ! the Nested Monte Carlo routine needs to do the configuration
574 ! to have old configuration to see if change is accepted
575 SELECT CASE (new_elem%conf(new_elem%mv_conf)%elem%move_type)
576 CASE (mv_type_md)
577 new_elem%conf(new_elem%mv_conf)%elem%stat = status_calculate_md
578 CASE (mv_type_nmc_moves)
579 IF (new_elem%conf(new_elem%mv_conf)%elem%stat /= status_canceled_nmc) THEN
580 CALL cp_warn(__location__, &
581 "reactivating tree element with wrong status"// &
582 cp_to_string(new_elem%conf(new_elem%mv_conf)%elem%stat))
583 END IF
584 new_elem%conf(new_elem%mv_conf)%elem%stat = status_calculate_nmc_steps
585
586 !IF(DEBUG>=1) WRITE(tmc_out_file_nr,*)"ATTENTION: reactivation of canceled subtree ", &
587 ! new_elem%conf(new_elem%mv_conf)%elem%sub_tree_nr, "elem", new_elem%conf(new_elem%mv_conf)%elem%nr, &
588 ! " of existing gt elem ",new_elem%nr,", again calculate NMC steps"
591 CALL cp_abort(__location__, &
592 "reactivated st element has no NMC or MD move type, "// &
593 "but seems to be canceled. Move type"// &
594 cp_to_string(new_elem%conf(new_elem%mv_conf)%elem%move_type))
595 CASE DEFAULT
596 cpabort("Unknown move type while reactivating subtree element.")
597 END SELECT
598 ELSE
599 !-- if end is found (NOT already existing element), create new elem at the end and if nessecarry new subtree element
600 ! set initial values
601 CALL allocate_new_global_tree_node(next_el=new_elem, &
602 nr_temp=tmc_env%params%nr_temp)
603 tmc_env%m_env%tree_node_count(0) = tmc_env%m_env%tree_node_count(0) + 1
604 new_elem%nr = tmc_env%m_env%tree_node_count(0)
605
606 !-- set pointers to and from element one level up
607 !-- paste new gt tree node element at right end
608 IF (n_acc) THEN
609 IF (ASSOCIATED(tmp_elem%acc)) THEN
610 cpabort("creating new subtree element on an occupied acc branch")
611 END IF
612 tmp_elem%acc => new_elem
613 ELSE
614 IF (ASSOCIATED(tmp_elem%nacc)) THEN
615 cpabort("creating new subtree element on an occupied nacc branch")
616 END IF
617 tmp_elem%nacc => new_elem
618 END IF
619 new_elem%parent => tmp_elem
620
621 !-- adopt acceptance flags of elements (old)
622 new_elem%conf_n_acc(:) = new_elem%parent%conf_n_acc
623 !-- set acceptance flag of modified configuration
624 ! depending on the direction of attaching new element
625 IF (.NOT. new_elem%parent%swaped) THEN
626 ! set the flag for the direction
627 ! (shows if the configuration is assumed to be acc or rej)
628 new_elem%conf_n_acc(new_elem%parent%conf( &
629 new_elem%parent%mv_conf)%elem%sub_tree_nr) = n_acc
630 ELSE
631 !-- in case of swapping the subtree element acceptance do not change
632 !-- in case of NOT accepted branch and swapping before,
633 !-- search last NOT swaped gt tree node to take configurations
634 IF (.NOT. n_acc) THEN
635 DO
636 IF (.NOT. ASSOCIATED(tmp_elem%parent)) EXIT
637 IF (ASSOCIATED(tmp_elem%parent%acc, tmp_elem)) THEN
638 tmp_elem => tmp_elem%parent
639 EXIT
640 END IF
641 tmp_elem => tmp_elem%parent
642 IF (.NOT. tmp_elem%swaped) EXIT
643 END DO
644 END IF
645 END IF
646
647 !-- adapt "old" configurations
648 new_elem%conf(:) = tmp_elem%conf(:)
649
650 !-- set rnd nr generator and set next conf to change
651 CALL tmc_env%rng_stream%set( &
652 bg=new_elem%parent%rng_seed(:, :, 1), &
653 cg=new_elem%parent%rng_seed(:, :, 2), &
654 ig=new_elem%parent%rng_seed(:, :, 3))
655 CALL tmc_env%rng_stream%reset_to_next_substream()
656 ! the random number for acceptance check
657 new_elem%rnd_nr = tmc_env%rng_stream%next()
658
659 ! the next configuration index to move
660 !rnd = tmc_env%rng_stream%next()
661 !new_elem%mv_conf = 1+INT(size(new_elem%conf)*rnd)
662 ! one temperature after each other
663 new_elem%mv_conf = new_elem%parent%mv_next_conf
664 new_elem%mv_next_conf = modulo(new_elem%mv_conf, SIZE(new_elem%conf)) + 1
665
666 ! simulated annealing temperature decrease
667 new_elem%Temp = tmp_elem%Temp
668 IF (n_acc) new_elem%Temp = tmp_elem%Temp*(1 - tmc_env%m_env%temp_decrease)
669
670 !-- rnd for swap
671 rnd = tmc_env%rng_stream%next()
672 rnd2 = tmc_env%rng_stream%next()
673 CALL tmc_env%rng_stream%get(bg=new_elem%rng_seed(:, :, 1), &
674 cg=new_elem%rng_seed(:, :, 2), &
675 ig=new_elem%rng_seed(:, :, 3))
676
677 ! swap moves are not part of the subtree structure,
678 ! because existing elements from DIFFERENT subtrees are swaped
679 ! -- do swap ?!
680 IF (tmc_env%params%move_types%mv_weight(mv_type_swap_conf) >= rnd) THEN
681 ! set the index for the swaping element
682 ! and the conf to move in next move
683 new_elem%mv_next_conf = new_elem%mv_conf
684 ! do swap with conf swap_conf and swap_conf+1
685 swap_conf = 1 + int((tmc_env%params%nr_temp - 1)*rnd2)
686 new_elem%mv_conf = swap_conf
687 !-- swaping pointers to subtree elements
688 ! exchange the pointer to the sub tree elements
689 tree_elem => new_elem%conf(new_elem%mv_conf)%elem
690 new_elem%conf(new_elem%mv_conf)%elem => &
691 new_elem%conf(new_elem%mv_conf + 1)%elem
692 new_elem%conf(new_elem%mv_conf + 1)%elem => tree_elem
693
694 new_elem%stat = status_calculated
695 new_elem%swaped = .true.
696 new_elem%prob_acc = tmc_env%params%move_types%acc_prob( &
697 mv_type_swap_conf, new_elem%mv_conf)
698 CALL add_to_references(gt_elem=new_elem)
699 IF (tmc_env%params%DRAW_TREE) THEN
700 CALL create_global_tree_dot(new_element=new_elem, &
701 tmc_params=tmc_env%params)
702 END IF
703 ! nothing to do for the workers
704 stat = status_calculated
705 keep_on = .false.
706 ELSE
707
708 !-- considered subtree node can already exist,
709 ! calculated somewhere else in the global tree
710 !-- so check if new sub tree node exists, if not, create it
711 !-- check if considered configuration is assumed to be
712 ! on accepted or rejected branch
713 IF (new_elem%conf_n_acc(new_elem%conf(new_elem%mv_conf)%elem%sub_tree_nr)) THEN
714 !-- check if child element in ACCEPTED direction already exist
715 IF (ASSOCIATED(new_elem%conf(new_elem%mv_conf)%elem%acc)) THEN
716 new_elem%conf(new_elem%mv_conf)%elem => &
717 new_elem%conf(new_elem%mv_conf)%elem%acc
718 stat = status_calculated
719 ELSE
720 !-- if not exist create new subtree element
721 CALL create_new_subtree_node(act_gt_el=new_elem, &
722 tmc_env=tmc_env)
723 IF (tmc_env%params%DRAW_TREE) THEN
724 CALL create_dot(new_element=new_elem%conf(new_elem%mv_conf)%elem, &
725 conf=new_elem%conf(new_elem%mv_conf)%elem%sub_tree_nr, &
726 tmc_params=tmc_env%params)
727 END IF
728 END IF
729 ELSE
730 !-- check if child element in REJECTED direction already exist
731 IF (ASSOCIATED(new_elem%conf(new_elem%mv_conf)%elem%nacc)) THEN
732 new_elem%conf(new_elem%mv_conf)%elem => &
733 new_elem%conf(new_elem%mv_conf)%elem%nacc
734 stat = status_calculated
735 ELSE
736 !-- if not exist create new subtree element
737 CALL create_new_subtree_node(act_gt_el=new_elem, &
738 tmc_env=tmc_env)
739 IF (tmc_env%params%DRAW_TREE) THEN
740 CALL create_dot(new_element=new_elem%conf(new_elem%mv_conf)%elem, &
741 conf=new_elem%conf(new_elem%mv_conf)%elem%sub_tree_nr, &
742 tmc_params=tmc_env%params)
743 END IF
744 END IF
745 END IF
746 ! set approximate probability of acceptance
747 ! (initialization with calculated values from
748 ! (#acc elem in traj)/(#elem in traj))
749 new_elem%prob_acc = tmc_env%params%move_types%acc_prob( &
750 new_elem%conf(new_elem%mv_conf)%elem%move_type, new_elem%mv_conf)
751 ! add refence and dot
752 CALL add_to_references(gt_elem=new_elem)
753 IF (tmc_env%params%DRAW_TREE) THEN
754 CALL create_global_tree_dot(new_element=new_elem, &
755 tmc_params=tmc_env%params)
756 END IF
757 END IF ! swap or no swap
758 END IF ! global tree node already exist. Hence the Subtree node also (it is speculative canceled)
759 END IF ! keep on (checking and creating)
760
761 IF (keep_on) THEN ! status changes
762 IF (new_elem%stat == status_accepted_result .OR. &
763 new_elem%stat == status_accepted .OR. &
764 new_elem%stat == status_rejected .OR. &
765 new_elem%stat == status_rejected_result) THEN
766 cpabort("selected existing RESULT gt node")
767 END IF
768 !-- set status of global tree element for decision in master routine
769 SELECT CASE (new_elem%conf(new_elem%mv_conf)%elem%stat)
772 ! energy is already calculated
773 new_elem%stat = status_calculated
774 stat = new_elem%conf(new_elem%mv_conf)%elem%stat
775 IF (tmc_env%params%DRAW_TREE) THEN
776 CALL create_dot_color(tree_element=new_elem%conf(new_elem%mv_conf)%elem, &
777 tmc_params=tmc_env%params)
778 END IF
780 new_elem%stat = new_elem%conf(new_elem%mv_conf)%elem%stat
781 IF (stat /= status_calculated) THEN
782 stat = new_elem%conf(new_elem%mv_conf)%elem%stat
783 IF (tmc_env%params%DRAW_TREE) THEN
784 CALL create_dot_color(tree_element=new_elem%conf(new_elem%mv_conf)%elem, &
785 tmc_params=tmc_env%params)
786 END IF
787 END IF
790 ! if not already in progress, set status for new task message
791 new_elem%stat = new_elem%conf(new_elem%mv_conf)%elem%stat
792 IF (stat /= status_calculated) THEN
793 stat = new_elem%conf(new_elem%mv_conf)%elem%stat
794 IF (tmc_env%params%DRAW_TREE) THEN
795 CALL create_dot_color(tree_element=new_elem%conf(new_elem%mv_conf)%elem, &
796 tmc_params=tmc_env%params)
797 END IF
798 END IF
800 ! configuration is already created,
801 ! but energy has to be calculated (again)
802 new_elem%conf(new_elem%mv_conf)%elem%stat = status_created
803 new_elem%stat = status_created
804 ! creation complete, handle energy calculation at a different position
805 ! (for different worker group)
806 stat = status_calculated
807 IF (tmc_env%params%DRAW_TREE) THEN
808 CALL create_dot_color(tree_element=new_elem%conf(new_elem%mv_conf)%elem, &
809 tmc_params=tmc_env%params)
810 END IF
812 ! reactivation canceled element (but with new global tree element)
813 new_elem%conf(new_elem%mv_conf)%elem%stat = &
815 new_elem%stat = status_calculate_nmc_steps
816 stat = new_elem%conf(new_elem%mv_conf)%elem%stat
817 reactivation_cc_count = reactivation_cc_count + 1
818 IF (tmc_env%params%DRAW_TREE) THEN
819 CALL create_dot_color(tree_element=new_elem%conf(new_elem%mv_conf)%elem, &
820 tmc_params=tmc_env%params)
821 END IF
822 CASE DEFAULT
823 CALL cp_abort(__location__, &
824 "unknown stat "// &
825 cp_to_string(new_elem%conf(new_elem%mv_conf)%elem%stat)// &
826 "of subtree element "// &
827 "for creating new gt element")
828 END SELECT
829
830 ! set stat TMC_STATUS_WAIT_FOR_NEW_TASK if no new calculation necessary
831 ! (energy calculation nodes searched by different routine)
834 END IF
835 ! end the timing
836 CALL timestop(handle)
837
838 END SUBROUTINE create_new_gt_tree_node
839
840! **************************************************************************************************
841!> \brief create new subtree element using pointer of global tree
842!> \param act_gt_el global tree element
843!> \param tmc_env ...
844!> \author Mandes 12.2012
845! **************************************************************************************************
846 SUBROUTINE create_new_subtree_node(act_gt_el, tmc_env)
847 TYPE(global_tree_type), POINTER :: act_gt_el
848 TYPE(tmc_env_type), POINTER :: tmc_env
849
850 CHARACTER(LEN=*), PARAMETER :: routinen = 'create_new_subtree_node'
851
852 INTEGER :: conf, handle, itmp
853 LOGICAL :: mv_rejected, new_subbox
854 REAL(kind=dp) :: rnd
855 TYPE(tree_type), POINTER :: new_elem, parent_elem
856
857 NULLIFY (new_elem, parent_elem)
858
859 cpassert(ASSOCIATED(act_gt_el))
860 cpassert(ASSOCIATED(act_gt_el%conf(act_gt_el%mv_conf)%elem))
861 cpassert(ASSOCIATED(tmc_env))
862 cpassert(ASSOCIATED(tmc_env%params))
863
864 ! start the timing
865 CALL timeset(routinen, handle)
866
867 conf = act_gt_el%mv_conf
868 CALL allocate_new_sub_tree_node(tmc_params=tmc_env%params, &
869 next_el=new_elem, nr_dim=SIZE(act_gt_el%parent%conf(conf)%elem%pos))
870
871 !-- node one level up
872 parent_elem => act_gt_el%conf(conf)%elem
873 new_elem%parent => parent_elem
874
875 !-- set initial values
876 parent_elem%next_elem_nr = parent_elem%next_elem_nr + 1
877 new_elem%nr = parent_elem%next_elem_nr
878 new_elem%rng_seed = parent_elem%rng_seed
879
880 !-- change to real parent element
881 IF (act_gt_el%conf_n_acc(act_gt_el%conf(act_gt_el%mv_conf)%elem%sub_tree_nr)) THEN
882 parent_elem%acc => new_elem
883 ELSE
884 parent_elem%nacc => new_elem
885 END IF
886
887 !-- real parent node (taking the configuration from)
888 ! search parent
889 parent_elem => search_parent_element(current=new_elem)
890 new_elem%pos(:) = parent_elem%pos(:)
891 new_elem%mol(:) = parent_elem%mol(:)
892 new_elem%vel(:) = parent_elem%vel(:)
893 new_elem%ekin = parent_elem%ekin
894 new_elem%e_pot_approx = parent_elem%e_pot_approx
895 new_elem%next_elem_nr => parent_elem%next_elem_nr
896 new_elem%sub_tree_nr = parent_elem%sub_tree_nr
897 new_elem%box_scale = parent_elem%box_scale
898 IF (tmc_env%params%task_type == task_type_gaussian_adaptation) THEN
899 new_elem%frc(:) = parent_elem%frc(:)
900 new_elem%potential = parent_elem%potential
901 new_elem%ekin_before_md = parent_elem%ekin_before_md
902 ELSE
903 new_elem%potential = 97589.0_dp
904 END IF
905
906 ! set new substream of random number generator
907 CALL tmc_env%rng_stream%set( &
908 bg=new_elem%rng_seed(:, :, 1), &
909 cg=new_elem%rng_seed(:, :, 2), &
910 ig=new_elem%rng_seed(:, :, 3))
911 CALL tmc_env%rng_stream%reset_to_next_substream()
912
913 ! set the temperature for the NMC moves
914 rnd = tmc_env%rng_stream%next()
915 IF (tmc_env%params%NMC_inp_file /= "") THEN
916 new_elem%temp_created = int(tmc_env%params%nr_temp*rnd) + 1
917 ELSE
918 new_elem%temp_created = act_gt_el%mv_conf
919 END IF
920
921 ! rnd nr for selecting move
922 rnd = tmc_env%rng_stream%next()
923 !-- set move type
924 new_elem%move_type = select_random_move_type( &
925 move_types=tmc_env%params%move_types, &
926 rnd=rnd)
927 CALL tmc_env%rng_stream%get( &
928 bg=new_elem%rng_seed(:, :, 1), &
929 cg=new_elem%rng_seed(:, :, 2), &
930 ig=new_elem%rng_seed(:, :, 3))
931
932 ! move is only done by the master,
933 ! when standard MC moves with single potential are done
934 ! the Nested Monte Carlo routine needs the old configuration
935 ! to see if change is accepted
936 SELECT CASE (new_elem%move_type)
937 CASE (mv_type_md)
938 ! velocity change have to be done on workers,
939 ! because of velocity change for NMC acceptance check
940 new_elem%stat = status_calculate_md
941 ! set the temperature for creating MD
942 new_elem%temp_created = act_gt_el%mv_conf
943 !-- set the subbox (elements in subbox)
944 CALL elements_in_new_subbox(tmc_params=tmc_env%params, &
945 rng_stream=tmc_env%rng_stream, elem=new_elem, &
946 nr_of_sub_box_elements=itmp)
947 ! the move is performed on a worker group
948 CASE (mv_type_nmc_moves)
949 new_elem%stat = status_calculate_nmc_steps
950 !-- set the subbox (elements in subbox)
951 CALL elements_in_new_subbox(tmc_params=tmc_env%params, &
952 rng_stream=tmc_env%rng_stream, elem=new_elem, &
953 nr_of_sub_box_elements=itmp)
954 ! the move is performed on a worker group
955 ! the following moves new no force_env and can be performed on the master directly
959 new_subbox = .true.
960 ! volume move on whole cell
961 IF (new_elem%move_type == mv_type_volume_move) THEN
962 new_subbox = .false.
963 END IF
964 CALL change_pos(tmc_params=tmc_env%params, &
965 move_types=tmc_env%params%move_types, &
966 rng_stream=tmc_env%rng_stream, elem=new_elem, &
967 mv_conf=conf, new_subbox=new_subbox, &
968 move_rejected=mv_rejected)
969 IF (mv_rejected) THEN
970 new_elem%potential = huge(new_elem%potential)
971 new_elem%e_pot_approx = huge(new_elem%e_pot_approx)
972 new_elem%stat = status_calculated
973 ELSE
974 new_elem%stat = status_created
975 IF (tmc_env%params%NMC_inp_file /= "") THEN
976 new_elem%stat = status_calc_approx_ener
977 END IF
978 END IF
980 ! still could be implemented
981 CASE DEFAULT
982 CALL cp_abort(__location__, &
983 "unknown move type ("//cp_to_string(new_elem%move_type)// &
984 "), while creating subtree element.")
985 END SELECT
986 act_gt_el%conf(act_gt_el%mv_conf)%elem => new_elem
987
988 ! end the timing
989 CALL timestop(handle)
990 cpassert(ASSOCIATED(act_gt_el%conf(act_gt_el%mv_conf)%elem))
991 END SUBROUTINE create_new_subtree_node
992
993 !============================================================================
994 ! tree node deallocation
995 !============================================================================
996! **************************************************************************************************
997!> \brief prepares for deallocation of global tree element
998!> (checks status and set pointers of neighboring elements)
999!> \param gt_ptr the global tree element
1000!> \param draw if present, changes the coleor in the dot file
1001!> \param tmc_env tmc environment
1002!> \author Mandes 12.2012
1003! **************************************************************************************************
1004 SUBROUTINE remove_gt_elem(gt_ptr, draw, tmc_env)
1005 TYPE(global_tree_type), POINTER :: gt_ptr
1006 LOGICAL, OPTIONAL :: draw
1007 TYPE(tmc_env_type), POINTER :: tmc_env
1008
1009 CHARACTER(LEN=*), PARAMETER :: routinen = 'remove_gt_elem'
1010
1011 INTEGER :: handle
1012
1013 cpassert(ASSOCIATED(gt_ptr))
1014 cpassert(ASSOCIATED(tmc_env))
1015
1016 ! start the timing
1017 CALL timeset(routinen, handle)
1018
1019 CALL remove_gt_references(gt_ptr=gt_ptr, tmc_env=tmc_env)
1020
1021 ! set status and draw in tree
1022 IF ((gt_ptr%stat == status_accepted_result) .OR. (gt_ptr%stat == status_rejected_result)) THEN
1023 gt_ptr%stat = status_deleted_result
1024 ELSE
1025 gt_ptr%stat = status_deleted
1026 END IF
1027 IF (tmc_env%params%DRAW_TREE .AND. PRESENT(draw)) THEN
1028 CALL create_global_tree_dot_color(gt_tree_element=gt_ptr, tmc_params=tmc_env%params)
1029 END IF
1030
1031 !remove pointer from tree parent
1032 IF (ASSOCIATED(gt_ptr%parent)) THEN
1033 IF (ASSOCIATED(gt_ptr%parent%acc, gt_ptr)) THEN
1034 gt_ptr%parent%acc => null()
1035 END IF
1036 IF (ASSOCIATED(gt_ptr%parent%nacc, gt_ptr)) THEN
1037 gt_ptr%parent%nacc => null()
1038 END IF
1039 END IF
1040
1041 !remove pointer from tree childs
1042 IF (ASSOCIATED(gt_ptr%acc)) THEN
1043 gt_ptr%acc%parent => null()
1044 END IF
1045
1046 IF (ASSOCIATED(gt_ptr%nacc)) THEN
1047 gt_ptr%nacc%parent => null()
1048 END IF
1049
1050 CALL deallocate_global_tree_node(gt_elem=gt_ptr)
1051 ! end the timing
1052 CALL timestop(handle)
1053
1054 cpassert(.NOT. ASSOCIATED(gt_ptr))
1055 END SUBROUTINE remove_gt_elem
1056
1057! **************************************************************************************************
1058!> \brief prepares for deallocation of sub tree element
1059!> (checks status and set pointers of neighboring elements)
1060!> \param ptr the sub tree element
1061!> \param draw if present, changes the coleor in the dot file
1062!> \param tmc_env tmc environment
1063!> \author Mandes 12.2012
1064! **************************************************************************************************
1065 SUBROUTINE remove_st_elem(ptr, draw, tmc_env)
1066 TYPE(tree_type), POINTER :: ptr
1067 LOGICAL, OPTIONAL :: draw
1068 TYPE(tmc_env_type), POINTER :: tmc_env
1069
1070 CHARACTER(LEN=*), PARAMETER :: routinen = 'remove_st_elem'
1071
1072 INTEGER :: handle
1073 LOGICAL :: ready
1074
1075 ready = .true.
1076 cpassert(ASSOCIATED(ptr))
1077 cpassert(ASSOCIATED(tmc_env))
1078
1079 ! start the timing
1080 CALL timeset(routinen, handle)
1081
1082 ! if there is still e reference to a global tree pointer, do not deallocate element
1083 IF (ASSOCIATED(ptr%gt_nodes_references)) THEN
1084 IF (ASSOCIATED(ptr%parent)) THEN
1085 CALL cp_warn(__location__, &
1086 "try to deallocate subtree element"// &
1087 cp_to_string(ptr%sub_tree_nr)//cp_to_string(ptr%nr)// &
1088 " still with global tree element references e.g."// &
1089 cp_to_string(ptr%gt_nodes_references%gt_elem%nr))
1090 END IF
1091 cpassert(ASSOCIATED(ptr%gt_nodes_references%gt_elem))
1092 ELSE
1093 SELECT CASE (ptr%stat)
1094 ! if element is still in progress, do not delete, wait for responding
1097 ! in case of speculative canceling: should be already canceled
1098 ! try to deallocate subtree element (still in progress)
1099 cpassert(tmc_env%params%SPECULATIVE_CANCELING)
1101 ! do not return in case of finalizing (do not wait for canceling receipt)
1102 IF (PRESENT(draw)) ready = .false.
1103 CASE DEFAULT
1104 END SELECT
1105
1106 ! check if real top to bottom or bottom to top deallocation (no middle element deallocation)
1107 IF (ASSOCIATED(ptr%parent) .AND. &
1108 (ASSOCIATED(ptr%acc) .OR. ASSOCIATED(ptr%nacc))) THEN
1109 cpabort("Invalid association state of parent element")
1110 END IF
1111
1112 IF (ready) THEN
1113 ! set status and draw in tree
1114 IF ((ptr%stat == status_accepted_result) .OR. &
1115 (ptr%stat == status_rejected_result)) THEN
1116 ptr%stat = status_deleted_result
1117 ELSE
1118 ptr%stat = status_deleted
1119 END IF
1120 IF (tmc_env%params%DRAW_TREE .AND. PRESENT(draw)) THEN
1121 CALL create_dot_color(tree_element=ptr, tmc_params=tmc_env%params)
1122 END IF
1123
1124 !remove pointer from tree parent
1125 IF (ASSOCIATED(ptr%parent)) THEN
1126 IF (ASSOCIATED(ptr%parent%acc, ptr)) ptr%parent%acc => null()
1127 IF (ASSOCIATED(ptr%parent%nacc, ptr)) ptr%parent%nacc => null()
1128 END IF
1129
1130 !remove pointer from tree childs
1131 IF (ASSOCIATED(ptr%acc)) ptr%acc%parent => null()
1132 IF (ASSOCIATED(ptr%nacc)) ptr%nacc%parent => null()
1133
1134 ! deallocate
1135 CALL deallocate_sub_tree_node(tree_elem=ptr)
1136 END IF
1137 END IF
1138 ! end the timing
1139 CALL timestop(handle)
1140 END SUBROUTINE remove_st_elem
1141
1142! **************************************************************************************************
1143!> \brief deletes the no more used global tree nodes beside the result nodes
1144!> from begin_ptr to end_ptr
1145!> \param begin_ptr start of the tree region to be cleaned
1146!> \param end_ptr end of the tree region to be cleaned
1147!> \param removed retun value if brance is clean
1148!> \param tmc_env tmc environment
1149!> \author Mandes 12.2012
1150! **************************************************************************************************
1151 RECURSIVE SUBROUTINE remove_unused_g_tree(begin_ptr, end_ptr, removed, tmc_env)
1152 TYPE(global_tree_type), POINTER :: begin_ptr, end_ptr
1153 LOGICAL :: removed
1154 TYPE(tmc_env_type), POINTER :: tmc_env
1155
1156 CHARACTER(LEN=*), PARAMETER :: routinen = 'remove_unused_g_tree'
1157
1158 INTEGER :: handle
1159 LOGICAL :: acc_removed, nacc_removed
1160 TYPE(global_tree_type), POINTER :: acc_ptr, nacc_ptr, tmp_ptr
1161
1162 NULLIFY (acc_ptr, nacc_ptr, tmp_ptr)
1163
1164 cpassert(ASSOCIATED(begin_ptr))
1165 cpassert(ASSOCIATED(end_ptr))
1166 cpassert(ASSOCIATED(tmc_env))
1167
1168 ! start the timing
1169 CALL timeset(routinen, handle)
1170
1171 removed = .false.
1172 acc_removed = .false.
1173 nacc_removed = .false.
1174
1175 IF (.NOT. ASSOCIATED(begin_ptr, end_ptr)) THEN
1176 !-- go until the ends ot he tree, to deallocate revese
1177 !-- check if child nodes exist and possibly deallocate child node
1178 IF (ASSOCIATED(begin_ptr%acc)) THEN
1179 acc_ptr => begin_ptr%acc
1180 CALL remove_unused_g_tree(acc_ptr, end_ptr, acc_removed, tmc_env)
1181 ELSE
1182 acc_removed = .true.
1183 END IF
1184 IF (ASSOCIATED(begin_ptr%nacc)) THEN
1185 nacc_ptr => begin_ptr%nacc
1186 CALL remove_unused_g_tree(nacc_ptr, end_ptr, nacc_removed, tmc_env)
1187 ELSE
1188 nacc_removed = .true.
1189 END IF
1190
1191 !-- deallocate node if no child node exist
1192 IF (acc_removed .AND. nacc_removed) THEN
1193 SELECT CASE (begin_ptr%stat)
1197 ! delete references, cancel elements calculation and deallocate global tree element
1198 tmp_ptr => begin_ptr
1199
1200 CALL remove_gt_elem(gt_ptr=tmp_ptr, draw=.true., tmc_env=tmc_env)
1201 IF (.NOT. ASSOCIATED(tmp_ptr)) removed = .true.
1203 CASE DEFAULT
1204 CALL cp_abort(__location__, &
1205 "try to dealloc unused tree element with status of begin element" &
1206 //cp_to_string(begin_ptr%stat))
1207 END SELECT
1208 END IF
1209 END IF
1210 ! end the timing
1211 CALL timestop(handle)
1212 cpassert(ASSOCIATED(end_ptr))
1213 END SUBROUTINE remove_unused_g_tree
1214
1215! **************************************************************************************************
1216!> \brief deletes the no more used sub tree nodes beside the result nodes
1217!> from begin_ptr to end_ptr
1218!> \param begin_ptr start of the tree region to be cleaned
1219!> \param end_ptr end of the tree region to be cleaned
1220!> \param working_elem_list ...
1221!> \param removed retun value if brance is clean
1222!> \param tmc_env tmc environment
1223!> \author Mandes 12.2012
1224! **************************************************************************************************
1225 RECURSIVE SUBROUTINE remove_unused_s_tree(begin_ptr, end_ptr, working_elem_list, &
1226 removed, tmc_env)
1227 TYPE(tree_type), POINTER :: begin_ptr
1228 TYPE(tree_type), INTENT(IN), POINTER :: end_ptr
1229 TYPE(elem_array_type), DIMENSION(:), POINTER :: working_elem_list
1230 LOGICAL :: removed
1231 TYPE(tmc_env_type), POINTER :: tmc_env
1232
1233 CHARACTER(LEN=*), PARAMETER :: routinen = 'remove_unused_s_tree'
1234
1235 INTEGER :: handle, i
1236 LOGICAL :: acc_removed, nacc_removed, remove_this
1237 TYPE(tree_type), POINTER :: acc_ptr, nacc_ptr, tmp_ptr
1238
1239 NULLIFY (acc_ptr, nacc_ptr, tmp_ptr)
1240 remove_this = .false.
1241 removed = .false.
1242 acc_removed = .false.
1243 nacc_removed = .false.
1244
1245 ! start the timing
1246 CALL timeset(routinen, handle)
1247
1248 cpassert(ASSOCIATED(begin_ptr))
1249 cpassert(ASSOCIATED(end_ptr))
1250 cpassert(ASSOCIATED(working_elem_list))
1251 cpassert(ASSOCIATED(tmc_env))
1252
1253 !-- if element is last checked in trajectory, go back
1254 IF (.NOT. ASSOCIATED(begin_ptr, end_ptr)) THEN
1255 !-- go until the ends on the tree, to deallocate revesely
1256 !-- check if child nodes exist and possibly deallocate child node
1257 IF (ASSOCIATED(begin_ptr%acc)) THEN
1258 acc_ptr => begin_ptr%acc
1259 CALL remove_unused_s_tree(acc_ptr, end_ptr, working_elem_list, &
1260 acc_removed, tmc_env)
1261 ELSE
1262 acc_removed = .true.
1263 END IF
1264 IF (ASSOCIATED(begin_ptr%nacc)) THEN
1265 nacc_ptr => begin_ptr%nacc
1266 CALL remove_unused_s_tree(nacc_ptr, end_ptr, working_elem_list, &
1267 nacc_removed, tmc_env)
1268 ELSE
1269 nacc_removed = .true.
1270 END IF
1271
1272 !IF (DEBUG>=20) WRITE(tmc_out_file_nr,*)"try to dealloc: node", begin_ptr%nr," sides are removed: ", &
1273 ! acc_removed, nacc_removed
1274
1275 !-- deallocate node if NO child node exist
1276 ! unused trajectory is deleted when cleaned part is updated
1277 IF (acc_removed .AND. nacc_removed) THEN
1278 SELECT CASE (begin_ptr%stat)
1280 remove_this = .true.
1283 remove_this = .true.
1284 ! not to cancel, because still in progress
1288 remove_this = .false.
1289 ! -- delete when calculation is finished or aborted
1290 ! removed should still be .FALSE.
1291 CASE DEFAULT
1292 CALL cp_abort(__location__, &
1293 "unknown status "//cp_to_string(begin_ptr%stat)// &
1294 "of sub tree element "// &
1295 cp_to_string(begin_ptr%sub_tree_nr)//" "// &
1296 cp_to_string(begin_ptr%nr))
1297 END SELECT
1298
1299 ! delete element
1300 IF (remove_this) THEN
1301 !-- mark as deleted and draw it in tree
1302 IF (.NOT. ASSOCIATED(begin_ptr%parent)) THEN
1303 CALL cp_abort(__location__, &
1304 "try to remove unused subtree element "// &
1305 cp_to_string(begin_ptr%sub_tree_nr)//" "// &
1306 cp_to_string(begin_ptr%nr)// &
1307 " but parent does not exist")
1308 END IF
1309 tmp_ptr => begin_ptr
1310 ! check if a working group is still working on this element
1311 removed = .true.
1312 DO i = 1, SIZE(working_elem_list(:))
1313 IF (ASSOCIATED(working_elem_list(i)%elem)) THEN
1314 IF (ASSOCIATED(working_elem_list(i)%elem, tmp_ptr)) THEN
1315 removed = .false.
1316 END IF
1317 END IF
1318 END DO
1319 IF (removed) THEN
1320 !IF (DEBUG>=20) WRITE(tmc_out_file_nr,*)"deallocation of node ", begin_ptr%nr, "with status ", begin_ptr%stat
1321 ! if all groups are finished with this element, we can deallocate
1322 CALL remove_st_elem(ptr=tmp_ptr, draw=.true., tmc_env=tmc_env)
1323 IF (.NOT. ASSOCIATED(tmp_ptr)) THEN
1324 removed = .true.
1325 ELSE
1326 removed = .false.
1327 END IF
1328 END IF
1329 END IF
1330 END IF
1331 END IF
1332 ! end the timing
1333 CALL timestop(handle)
1334 END SUBROUTINE remove_unused_s_tree
1335
1336! **************************************************************************************************
1337!> \brief deallocates all result nodes (remaining Markov Chain)
1338!> from the tree root to the end of clean tree of the global tree
1339!> \param end_of_clean_tree ...
1340!> \param actual_ptr ...
1341!> \param tmc_env TMC environment for deallocation
1342!> \author Mandes 12.2012
1343! **************************************************************************************************
1344 RECURSIVE SUBROUTINE remove_result_g_tree(end_of_clean_tree, actual_ptr, &
1345 tmc_env)
1346 TYPE(global_tree_type), POINTER :: end_of_clean_tree, actual_ptr
1347 TYPE(tmc_env_type), POINTER :: tmc_env
1348
1349 CHARACTER(LEN=*), PARAMETER :: routinen = 'remove_result_g_tree'
1350
1351 INTEGER :: handle
1352 TYPE(global_tree_type), POINTER :: tmp_ptr
1353
1354 cpassert(ASSOCIATED(end_of_clean_tree))
1355 cpassert(ASSOCIATED(actual_ptr))
1356
1357 ! start the timing
1358 CALL timeset(routinen, handle)
1359
1360 !-- going up to the head ot the subtree
1361 IF (ASSOCIATED(actual_ptr%parent)) THEN
1362 CALL remove_result_g_tree(end_of_clean_tree=end_of_clean_tree, &
1363 actual_ptr=actual_ptr%parent, &
1364 tmc_env=tmc_env)
1365 END IF
1366 !-- new tree head has no parent
1367 IF (.NOT. ASSOCIATED(actual_ptr, end_of_clean_tree)) THEN
1368 !-- deallocate node
1369 !IF(DEBUG>=20) WRITE(tmc_out_file_nr,*)"dealloc gt result tree element: ",actual_ptr%nr
1370 tmp_ptr => actual_ptr
1371 CALL remove_gt_elem(gt_ptr=tmp_ptr, draw=.true., tmc_env=tmc_env)
1372 actual_ptr => tmp_ptr
1373 END IF
1374 ! end the timing
1375 CALL timestop(handle)
1376 END SUBROUTINE remove_result_g_tree
1377
1378! **************************************************************************************************
1379!> \brief deallocates all result nodes (remaining Markov Chain)
1380!> from the tree root to the end of clean tree of one sub tree
1381!> top to buttom deallocation
1382!> \param end_of_clean_tree ...
1383!> \param actual_ptr ...
1384!> \param tmc_env TMC environment for deallocation
1385!> \author Mandes 12.2012
1386! **************************************************************************************************
1387 RECURSIVE SUBROUTINE remove_result_s_tree(end_of_clean_tree, actual_ptr, &
1388 tmc_env)
1389 TYPE(tree_type), POINTER :: end_of_clean_tree, actual_ptr
1390 TYPE(tmc_env_type), POINTER :: tmc_env
1391
1392 CHARACTER(LEN=*), PARAMETER :: routinen = 'remove_result_s_tree'
1393
1394 INTEGER :: handle
1395 TYPE(tree_type), POINTER :: tmp_ptr
1396
1397 cpassert(ASSOCIATED(end_of_clean_tree))
1398 cpassert(ASSOCIATED(actual_ptr))
1399 cpassert(ASSOCIATED(tmc_env))
1400
1401 ! start the timing
1402 CALL timeset(routinen, handle)
1403
1404 !-- going up to the head ot the subtree
1405 IF (ASSOCIATED(actual_ptr%parent)) THEN
1406 CALL remove_result_s_tree(end_of_clean_tree, actual_ptr%parent, &
1407 tmc_env)
1408 END IF
1409
1410 !-- new tree head has no parent
1411 IF (.NOT. ASSOCIATED(actual_ptr, end_of_clean_tree)) THEN
1412 ! in trajectory just one direction should exist
1413 cpassert(.NOT. (ASSOCIATED(actual_ptr%acc) .AND. ASSOCIATED(actual_ptr%nacc)))
1414 ! the parent should be deleted already, but global tree is allocated to the second last accepted, &
1415 ! hence there could be still a reference to an element...
1416 IF (.NOT. ASSOCIATED(actual_ptr%parent)) THEN
1417 !-- deallocate node
1418 tmp_ptr => actual_ptr
1419 CALL remove_st_elem(ptr=tmp_ptr, draw=.true., tmc_env=tmc_env)
1420 actual_ptr => tmp_ptr
1421 END IF
1422 END IF
1423 ! end the timing
1424 CALL timestop(handle)
1425 END SUBROUTINE remove_result_s_tree
1426
1427! **************************************************************************************************
1428!> \brief deallocates the no more used tree nodes beside the result nodes
1429!> from begin_ptr to end_ptr
1430!> in global and subtrees
1431!> \param working_elem_list list of actual calculating elements for canceling
1432!> \param tmc_env TMC environment
1433!> \author Mandes 12.2012
1434! **************************************************************************************************
1435 SUBROUTINE remove_all_trees(working_elem_list, tmc_env)
1436 TYPE(elem_array_type), DIMENSION(:), POINTER :: working_elem_list
1437 TYPE(tmc_env_type), POINTER :: tmc_env
1438
1439 CHARACTER(LEN=*), PARAMETER :: routinen = 'remove_all_trees'
1440
1441 INTEGER :: handle, i, tree
1442 LOGICAL :: change_trajec, flag
1443 TYPE(global_tree_type), POINTER :: tmp_gt_ptr
1444 TYPE(tree_type), POINTER :: last_acc_st_elem, tmp_ptr
1445
1446 NULLIFY (last_acc_st_elem, tmp_ptr, tmp_gt_ptr)
1447
1448 cpassert(ASSOCIATED(working_elem_list))
1449 cpassert(ASSOCIATED(tmc_env))
1450 cpassert(ASSOCIATED(tmc_env%m_env))
1451 cpassert(ASSOCIATED(tmc_env%m_env%gt_act))
1452 cpassert(ASSOCIATED(tmc_env%m_env%gt_clean_end))
1453 cpassert(ASSOCIATED(tmc_env%m_env%result_list))
1454 cpassert(ASSOCIATED(tmc_env%m_env%st_clean_ends))
1455
1456 flag = .false.
1457 change_trajec = .false.
1458
1459 ! start the timing
1460 CALL timeset(routinen, handle)
1461
1462 !-- deallocate unused pt tree
1463 CALL remove_unused_g_tree(begin_ptr=tmc_env%m_env%gt_clean_end, &
1464 end_ptr=tmc_env%m_env%gt_act, removed=flag, &
1465 tmc_env=tmc_env)
1466 tmp_gt_ptr => tmc_env%m_env%gt_clean_end
1467 CALL search_end_of_clean_g_tree(last_acc=tmc_env%m_env%gt_clean_end, &
1468 tree_ptr=tmp_gt_ptr)
1469 !-- deallocate unused pt trajectory tree elements
1470 IF (tmc_env%params%USE_REDUCED_TREE) THEN
1471 tmp_gt_ptr => tmc_env%m_env%gt_clean_end
1472 CALL remove_result_g_tree(end_of_clean_tree=tmc_env%m_env%gt_clean_end, &
1473 actual_ptr=tmp_gt_ptr, tmc_env=tmc_env)
1474
1475 !check if something changed, if not no deallocation of result subtree necessary
1476 IF (.NOT. ASSOCIATED(tmc_env%m_env%gt_head, tmc_env%m_env%gt_clean_end)) THEN
1477 change_trajec = .true.
1478 END IF
1479 tmc_env%m_env%gt_head => tmc_env%m_env%gt_clean_end
1480 cpassert(.NOT. ASSOCIATED(tmc_env%m_env%gt_head%parent))
1481 !IF (DEBUG>=20) WRITE(tmc_out_file_nr,*)"new head of pt tree is ",tmc_env%m_env%gt_head%nr
1482 END IF
1483
1484 !-- deallocate the subtrees
1485 ! do for all temperatures respectively all subtrees
1486 DO tree = 1, tmc_env%params%nr_temp
1487 ! get last checked element in trajectory related to the subtree (resultlist order is NOT subtree order)
1488 conf_loop: DO i = 1, SIZE(tmc_env%m_env%result_list)
1489 last_acc_st_elem => tmc_env%m_env%result_list(i)%elem
1490 IF (last_acc_st_elem%sub_tree_nr == tree) THEN
1491 EXIT conf_loop
1492 END IF
1493 END DO conf_loop
1494 cpassert(last_acc_st_elem%sub_tree_nr == tree)
1495 CALL remove_unused_s_tree(begin_ptr=tmc_env%m_env%st_clean_ends(tree)%elem, &
1496 end_ptr=last_acc_st_elem, working_elem_list=working_elem_list, &
1497 removed=flag, tmc_env=tmc_env)
1498 CALL search_end_of_clean_tree(tree_ptr=tmc_env%m_env%st_clean_ends(tree)%elem, &
1499 last_acc=last_acc_st_elem)
1500 END DO
1501 !-- deallocate the trajectory subtree elements
1502 IF (tmc_env%params%USE_REDUCED_TREE .AND. change_trajec) THEN
1503 DO tree = 1, tmc_env%params%nr_temp
1504 tmp_ptr => tmc_env%m_env%st_clean_ends(tree)%elem
1505 cpassert(tmp_ptr%sub_tree_nr == tree)
1506 CALL remove_result_s_tree(end_of_clean_tree=tmc_env%m_env%st_clean_ends(tree)%elem, &
1507 actual_ptr=tmp_ptr, tmc_env=tmc_env)
1508 tmc_env%m_env%st_heads(tree)%elem => tmc_env%m_env%st_clean_ends(tree)%elem
1509 !IF(DEBUG>=20) &
1510 ! WRITE(tmc_out_file_nr,*)"new head of tree ",tree," is ",&
1511 ! tmc_env%m_env%st_heads(tree)%elem%nr
1512 END DO
1513 END IF
1514
1515 ! end the timing
1516 CALL timestop(handle)
1517 cpassert(ASSOCIATED(tmc_env%m_env%gt_act))
1518 cpassert(ASSOCIATED(tmc_env%m_env%gt_clean_end))
1519 END SUBROUTINE remove_all_trees
1520
1521! **************************************************************************************************
1522!> \brief deallocates the whole global tree, to clean up
1523!> \param begin_ptr pointer to global tree head
1524!> \param removed flag, if the this element is removed
1525!> \param tmc_env ...
1526!> \author Mandes 01.2013
1527! **************************************************************************************************
1528 RECURSIVE SUBROUTINE dealloc_whole_g_tree(begin_ptr, removed, tmc_env)
1529 TYPE(global_tree_type), POINTER :: begin_ptr
1530 LOGICAL :: removed
1531 TYPE(tmc_env_type), POINTER :: tmc_env
1532
1533 LOGICAL :: acc_removed, nacc_removed
1534 TYPE(global_tree_type), POINTER :: acc_ptr, nacc_ptr, tmp_ptr
1535
1536 cpassert(ASSOCIATED(begin_ptr))
1537 cpassert(ASSOCIATED(tmc_env))
1538
1539 IF (ASSOCIATED(begin_ptr%acc)) THEN
1540 acc_ptr => begin_ptr%acc
1541 CALL dealloc_whole_g_tree(acc_ptr, acc_removed, tmc_env)
1542 ELSE
1543 acc_removed = .true.
1544 END IF
1545 IF (ASSOCIATED(begin_ptr%nacc)) THEN
1546 nacc_ptr => begin_ptr%nacc
1547 CALL dealloc_whole_g_tree(nacc_ptr, nacc_removed, tmc_env)
1548 ELSE
1549 nacc_removed = .true.
1550 END IF
1551
1552 !-- deallocate node if no child node exist
1553 IF (acc_removed .AND. nacc_removed) THEN
1554 CALL search_and_remove_reference_in_list(gt_ptr=begin_ptr, &
1555 elem=begin_ptr%conf(begin_ptr%mv_conf)%elem, tmc_env=tmc_env)
1556 tmp_ptr => begin_ptr
1557 CALL remove_gt_elem(gt_ptr=tmp_ptr, draw=.false., tmc_env=tmc_env)
1558 !CALL deallocate_global_tree_node(gt_elem=tmp_ptr)
1559 removed = .true.
1560 END IF
1561 END SUBROUTINE dealloc_whole_g_tree
1562! **************************************************************************************************
1563!> \brief deallocates the whole sub tree, to clean up
1564!> \param begin_ptr pointer to sub tree head
1565!> \param removed flag, if the this element is removed
1566!> \param tmc_params ...
1567!> \author Mandes 01.2013
1568! **************************************************************************************************
1569 RECURSIVE SUBROUTINE dealloc_whole_subtree(begin_ptr, removed, tmc_params)
1570 TYPE(tree_type), POINTER :: begin_ptr
1571 LOGICAL :: removed
1572 TYPE(tmc_param_type), POINTER :: tmc_params
1573
1574 LOGICAL :: acc_removed, nacc_removed
1575 TYPE(tree_type), POINTER :: acc_ptr, nacc_ptr, tmp_ptr
1576
1577 cpassert(ASSOCIATED(begin_ptr))
1578 cpassert(ASSOCIATED(tmc_params))
1579
1580 IF (ASSOCIATED(begin_ptr%acc)) THEN
1581 acc_ptr => begin_ptr%acc
1582 CALL dealloc_whole_subtree(acc_ptr, acc_removed, tmc_params)
1583 ELSE
1584 acc_removed = .true.
1585 END IF
1586 IF (ASSOCIATED(begin_ptr%nacc)) THEN
1587 nacc_ptr => begin_ptr%nacc
1588 CALL dealloc_whole_subtree(nacc_ptr, nacc_removed, tmc_params)
1589 ELSE
1590 nacc_removed = .true.
1591 END IF
1592
1593 !-- deallocate node if no child node exist
1594 IF (acc_removed .AND. nacc_removed) THEN
1595 tmp_ptr => begin_ptr
1596 CALL deallocate_sub_tree_node(tree_elem=begin_ptr)
1597 removed = .true.
1598 END IF
1599 END SUBROUTINE dealloc_whole_subtree
1600
1601 !============================================================================
1602 ! finalizing module (deallocating everything)
1603 !============================================================================
1604! **************************************************************************************************
1605!> \brief deallocating every tree node of every trees (clean up)
1606!> \param tmc_env TMC environment structure
1607!> \author Mandes 01.2013
1608! **************************************************************************************************
1609 SUBROUTINE finalize_trees(tmc_env)
1610 TYPE(tmc_env_type), POINTER :: tmc_env
1611
1612 INTEGER :: i
1613 LOGICAL :: flag
1614 TYPE(global_tree_type), POINTER :: global_tree
1615
1616 cpassert(ASSOCIATED(tmc_env))
1617 cpassert(ASSOCIATED(tmc_env%m_env))
1618
1619 global_tree => tmc_env%m_env%gt_act
1620 !-- deallocate pt tree
1621 ! start with searching the head
1622 DO WHILE (ASSOCIATED(global_tree%parent))
1623 global_tree => global_tree%parent
1624 END DO
1625 CALL dealloc_whole_g_tree(begin_ptr=global_tree, removed=flag, &
1626 tmc_env=tmc_env)
1627
1628 !-- deallocate subtrees
1629 trees_loop: DO i = 1, SIZE(tmc_env%m_env%st_clean_ends(:))
1630 DO WHILE (ASSOCIATED(tmc_env%m_env%st_clean_ends(i)%elem%parent))
1631 tmc_env%m_env%st_clean_ends(i)%elem => &
1632 tmc_env%m_env%st_clean_ends(i)%elem%parent
1633 END DO
1634 CALL dealloc_whole_subtree(begin_ptr=tmc_env%m_env%st_clean_ends(i)%elem, &
1635 removed=flag, tmc_params=tmc_env%params)
1636 END DO trees_loop
1637 DEALLOCATE (tmc_env%params%atoms)
1638 END SUBROUTINE finalize_trees
1639
1640END MODULE tmc_tree_build
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
various routines to log and control the output. The idea is that decisions about where to log should ...
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Definition list.F:24
Timing routines for accounting.
Definition timings.F:17
calculation section for TreeMonteCarlo
subroutine, public init_vel(vel, atoms, temerature, rng_stream, rnd_seed)
routine sets initial velocity, using the Box-Muller Method for Normal (Gaussian) Deviates
real(kind=dp) function, public calc_e_kin(vel, atoms)
routine calculates the kinetic energy, using the velocities and atom mass, both in atomic units
module for printing tree structures in GraphViz dot files for visualizing the trees
subroutine, public create_dot(new_element, conf, tmc_params)
interfaces the creating of a branch for subtree elements
subroutine, public create_global_tree_dot_color(gt_tree_element, tmc_params)
interfaces the change of color for global tree node on the basis of the element status
subroutine, public create_global_tree_dot(new_element, tmc_params)
creates new dot and arrow from element one level up (for subtree) additional handling of nodes with s...
subroutine, public create_dot_color(tree_element, tmc_params)
interfaces the change of color for subtree elements on the basis of the element status
writing and printing the files, trajectory (pos, cell, dipoles) as well as restart files
Definition tmc_file_io.F:20
subroutine, public write_result_list_element(result_list, result_count, conf_updated, accepted, tmc_params)
select the correct configuration to print out the (coordinates, forces, cell ...)
subroutine, public read_restart_file(tmc_env, job_counts, timings, file_name)
reads the TMC restart file with all last configurations and counters etc.
acceptance ratio handling of the different Monte Carlo Moves types For each move type and each temper...
integer function, public select_random_move_type(move_types, rnd)
selects a move type related to the weighings and the entered rnd nr
tree nodes creation, searching, deallocation, references etc.
integer, parameter, public mv_type_mol_rot
integer, parameter, public mv_type_volume_move
integer, parameter, public mv_type_proton_reorder
integer, parameter, public mv_type_swap_conf
integer, parameter, public mv_type_md
integer, parameter, public mv_type_mol_trans
integer, parameter, public mv_type_atom_swap
integer, parameter, public mv_type_gausian_adapt
integer, parameter, public mv_type_atom_trans
integer, parameter, public mv_type_nmc_moves
integer, parameter, public mv_type_none
different move types are applied
Definition tmc_moves.F:15
subroutine, public elements_in_new_subbox(tmc_params, rng_stream, elem, nr_of_sub_box_elements)
set a new random sub box center and counte the number of atoms in it
Definition tmc_moves.F:471
subroutine, public change_pos(tmc_params, move_types, rng_stream, elem, mv_conf, new_subbox, move_rejected)
applying the preselected move type
Definition tmc_moves.F:70
tree nodes creation, searching, deallocation, references etc.
Definition tmc_stati.F:15
integer, parameter, public tmc_status_failed
Definition tmc_stati.F:57
integer, parameter, public task_type_gaussian_adaptation
Definition tmc_stati.F:47
integer, parameter, public tmc_status_wait_for_new_task
Definition tmc_stati.F:52
integer, parameter, public task_type_mc
Definition tmc_stati.F:44
tree nodes creation, deallocation, references etc.
subroutine, public init_tree_mod(start_elem, tmc_env, job_counts, worker_timings)
routine initiate the global and subtrees with the first elements
subroutine, public deallocate_sub_tree_node(tree_elem)
deallocates an elements of the subtree element structure
subroutine, public create_new_gt_tree_node(tmc_env, stat, new_elem, reactivation_cc_count)
creates new global tree element and if needed new subtree element
subroutine, public finalize_init(gt_tree_ptr, tmc_env)
distributes the initial energy to all subtree (if no restart) and call analysis for this element (wri...
recursive subroutine, public remove_unused_g_tree(begin_ptr, end_ptr, removed, tmc_env)
deletes the no more used global tree nodes beside the result nodes from begin_ptr to end_ptr
subroutine, public remove_all_trees(working_elem_list, tmc_env)
deallocates the no more used tree nodes beside the result nodes from begin_ptr to end_ptr in global a...
subroutine, public finalize_trees(tmc_env)
deallocating every tree node of every trees (clean up)
subroutine, public allocate_new_sub_tree_node(tmc_params, next_el, nr_dim)
allocates an elements of the subtree element structure
global tree references
subroutine, public search_and_remove_reference_in_list(gt_ptr, elem, tmc_env)
removes the global tree references of this actual global tree element from all related sub tree eleme...
subroutine, public add_to_references(gt_elem)
adds global tree reference to the modified sub tree element(s)
subroutine, public remove_subtree_element_of_all_references(ptr)
removes the pointers to a certain subtree element from every related global tree element
subroutine, public remove_gt_references(gt_ptr, tmc_env)
removes the global tree references of this actual global tree element from all related sub tree eleme...
tree nodes search etc.
recursive subroutine, public search_end_of_clean_g_tree(last_acc, tree_ptr)
searches last element on trajectory, until where the sides of the tree are deleted (of global tree) a...
recursive type(tree_type) function, pointer, public search_parent_element(current)
searching the parent element (last accepted configuration before)
recursive subroutine, public most_prob_end(global_tree_elem, prob, n_acc, search_energy_node)
search most probable end in global tree to create a new tree node using the acceptance probabilities ...
recursive subroutine, public search_end_of_clean_tree(tree_ptr, last_acc)
searches last element on trajectory, until where the sides of the tree are deleted (in sub tree) also...
module handles definition of the tree nodes for the global and
integer, parameter, public status_deleted
integer, parameter, public status_accepted
integer, parameter, public status_calculate_energy
integer, parameter, public status_calculate_md
subroutine, public add_to_list(elem, list, temp_ind, nr)
add a certain element to the specified element list at the beginning
integer, parameter, public status_canceled_ener
integer, parameter, public status_calculated
integer, parameter, public status_cancel_ener
integer, parameter, public status_cancel_nmc
integer, parameter, public status_canceled_nmc
integer, parameter, public status_calc_approx_ener
integer, parameter, public status_ok
integer, parameter, public status_rejected
integer, parameter, public status_calculate_nmc_steps
integer, parameter, public status_accepted_result
integer, parameter, public status_deleted_result
integer, parameter, public status_created
integer, parameter, public status_rejected_result
module handles definition of the tree nodes for the global and
Definition tmc_types.F:34