73#include "../base/base_uses.f90"
79 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'tmc_tree_build'
98 SUBROUTINE allocate_new_global_tree_node(next_el, nr_temp)
99 TYPE(global_tree_type),
POINTER :: next_el
102 CHARACTER(LEN=*),
PARAMETER :: routineN =
'allocate_new_global_tree_node'
104 INTEGER :: handle, itmp
106 cpassert(.NOT.
ASSOCIATED(next_el))
109 CALL timeset(routinen, handle)
113 ALLOCATE (next_el%conf(nr_temp))
114 ALLOCATE (next_el%conf_n_acc(nr_temp))
115 next_el%rnd_nr = -1.0_dp
118 NULLIFY (next_el%conf(itmp)%elem)
119 next_el%conf_n_acc(itmp) = .false.
122 next_el%swaped = .false.
124 CALL timestop(handle)
125 END SUBROUTINE allocate_new_global_tree_node
132 SUBROUTINE deallocate_global_tree_node(gt_elem)
133 TYPE(global_tree_type),
POINTER :: gt_elem
135 CHARACTER(LEN=*),
PARAMETER :: routineN =
'deallocate_global_tree_node'
139 cpassert(
ASSOCIATED(gt_elem))
142 CALL timeset(routinen, handle)
145 DEALLOCATE (gt_elem%conf_n_acc)
146 DEALLOCATE (gt_elem%conf)
149 CALL timestop(handle)
150 END SUBROUTINE deallocate_global_tree_node
164 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_new_sub_tree_node'
168 cpassert(.NOT.
ASSOCIATED(next_el))
171 CALL timeset(routinen, handle)
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)
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))
186 ALLOCATE (next_el%subbox_center(tmc_params%dim_per_elem))
189 ALLOCATE (next_el%frc(nr_dim*nr_dim))
191 ALLOCATE (next_el%frc(nr_dim))
195 ALLOCATE (next_el%box_scale(3))
196 next_el%pos(:) = -1.0_dp
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
203 next_el%ekin = 0.0_dp
204 next_el%ekin_before_md = 0.0_dp
205 next_el%sub_tree_nr = 0
207 next_el%rng_seed(:, :, :) = -1.0
211 CALL timestop(handle)
222 CHARACTER(LEN=*),
PARAMETER :: routinen =
'deallocate_sub_tree_node'
226 cpassert(
ASSOCIATED(tree_elem))
229 CALL timeset(routinen, handle)
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)
245 DEALLOCATE (tree_elem)
247 CALL timestop(handle)
265 INTEGER,
DIMENSION(:) :: job_counts
266 REAL(kind=
dp),
DIMENSION(4) :: worker_timings
268 CHARACTER(LEN=*),
PARAMETER :: routinen =
'init_tree_mod'
273 NULLIFY (global_tree)
275 cpassert(
ASSOCIATED(start_elem))
276 cpassert(
ASSOCIATED(tmc_env))
277 cpassert(
ASSOCIATED(tmc_env%m_env))
280 CALL timeset(routinen, handle)
283 CALL allocate_new_global_tree_node(next_el=tmc_env%m_env%gt_act, &
284 nr_temp=tmc_env%params%nr_temp)
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))
292 global_tree => tmc_env%m_env%gt_act
293 tmc_env%m_env%gt_head => tmc_env%m_env%gt_act
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()
302 DO i = 1,
SIZE(global_tree%conf)
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
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
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))
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)
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
349 tmc_env%m_env%result_list(i)%elem => global_tree%conf(i)%elem
351 tmc_env%m_env%tree_node_count(:) = 0
354 tmc_env%m_env%gt_head => global_tree
355 tmc_env%m_env%gt_clean_end => global_tree
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.
363 global_tree%prob_acc = 1.0_dp
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.")
374 IF (tmc_env%m_env%restart_in_file_name /=
"")
THEN
377 file_name=tmc_env%m_env%restart_in_file_name)
379 tmc_env%m_env%tree_node_count(0) = global_tree%nr
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
385 global_tree%prob_acc = 1.0_dp
386 WRITE (tmc_env%m_env%io_unit, *)
"TMC| restarting at Markov Chain element(s): ", &
387 tmc_env%m_env%result_count
394 ELSE IF (tmc_env%params%NMC_inp_file /=
"")
THEN
404 IF (tmc_env%params%DRAW_TREE)
THEN
406 tmc_params=tmc_env%params)
408 tmc_params=tmc_env%params)
412 CALL timestop(handle)
427 CHARACTER(LEN=*),
PARAMETER :: routinen =
'finalize_init'
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))
438 CALL timeset(routinen, handle)
442 DO i = 1,
SIZE(gt_tree_ptr%conf)
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
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
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(:)
456 DO i = 1,
SIZE(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)
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), &
475 CALL timestop(handle)
490 reactivation_cc_count)
492 INTEGER,
INTENT(OUT) :: stat
494 INTEGER :: reactivation_cc_count
496 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_new_gt_tree_node'
498 INTEGER :: handle, swap_conf
499 LOGICAL :: keep_on, n_acc
500 REAL(kind=
dp) :: prob, rnd, rnd2
504 NULLIFY (tmp_elem, tree_elem, new_elem)
506 cpassert(
ASSOCIATED(tmc_env))
507 cpassert(
ASSOCIATED(tmc_env%params))
508 cpassert(
ASSOCIATED(tmc_env%m_env))
509 cpassert(
ASSOCIATED(tmc_env%m_env%gt_act))
512 CALL timeset(routinen, handle)
516 tmp_elem => tmc_env%m_env%gt_act
520 CALL most_prob_end(global_tree_elem=tmp_elem, prob=prob, n_acc=n_acc)
523 IF (
ASSOCIATED(tmp_elem) .AND. (exp(prob) < 1.0e-10))
THEN
530 ELSE IF (.NOT.
ASSOCIATED(tmp_elem))
THEN
540 IF ((n_acc .AND.
ASSOCIATED(tmp_elem%acc)) .OR. &
541 ((.NOT. n_acc) .AND.
ASSOCIATED(tmp_elem%nacc)))
THEN
545 new_elem => tmp_elem%acc
547 IF (.NOT. n_acc)
THEN
548 new_elem => tmp_elem%nacc
552 cpassert(
ASSOCIATED(new_elem%conf(new_elem%mv_conf)%elem))
553 SELECT CASE (new_elem%conf(new_elem%mv_conf)%elem%stat)
559 reactivation_cc_count = reactivation_cc_count + 1
561 CALL cp_abort(__location__, &
562 "global tree node creation using existing sub tree element, "// &
563 "but is not a canceled one, gt elem "// &
565 cp_to_string(new_elem%conf(new_elem%mv_conf)%elem%nr)// &
567 cp_to_string(new_elem%conf(new_elem%mv_conf)%elem%stat))
574 SELECT CASE (new_elem%conf(new_elem%mv_conf)%elem%move_type)
579 CALL cp_warn(__location__, &
580 "reactivating tree element with wrong status"// &
581 cp_to_string(new_elem%conf(new_elem%mv_conf)%elem%stat))
590 CALL cp_abort(__location__, &
591 "reactivated st element has no NMC or MD move type, "// &
592 "but seems to be canceled. Move type"// &
593 cp_to_string(new_elem%conf(new_elem%mv_conf)%elem%move_type))
595 cpabort(
"Unknown move type while reactivating subtree element.")
600 CALL allocate_new_global_tree_node(next_el=new_elem, &
601 nr_temp=tmc_env%params%nr_temp)
602 tmc_env%m_env%tree_node_count(0) = tmc_env%m_env%tree_node_count(0) + 1
603 new_elem%nr = tmc_env%m_env%tree_node_count(0)
608 IF (
ASSOCIATED(tmp_elem%acc))
THEN
609 cpabort(
"creating new subtree element on an occupied acc branch")
611 tmp_elem%acc => new_elem
613 IF (
ASSOCIATED(tmp_elem%nacc))
THEN
614 cpabort(
"creating new subtree element on an occupied nacc branch")
616 tmp_elem%nacc => new_elem
618 new_elem%parent => tmp_elem
621 new_elem%conf_n_acc(:) = new_elem%parent%conf_n_acc
624 IF (.NOT. new_elem%parent%swaped)
THEN
627 new_elem%conf_n_acc(new_elem%parent%conf( &
628 new_elem%parent%mv_conf)%elem%sub_tree_nr) = n_acc
633 IF (.NOT. n_acc)
THEN
635 IF (.NOT.
ASSOCIATED(tmp_elem%parent))
EXIT
636 IF (
ASSOCIATED(tmp_elem%parent%acc, tmp_elem))
THEN
637 tmp_elem => tmp_elem%parent
640 tmp_elem => tmp_elem%parent
641 IF (.NOT. tmp_elem%swaped)
EXIT
647 new_elem%conf(:) = tmp_elem%conf(:)
650 CALL tmc_env%rng_stream%set( &
651 bg=new_elem%parent%rng_seed(:, :, 1), &
652 cg=new_elem%parent%rng_seed(:, :, 2), &
653 ig=new_elem%parent%rng_seed(:, :, 3))
654 CALL tmc_env%rng_stream%reset_to_next_substream()
656 new_elem%rnd_nr = tmc_env%rng_stream%next()
662 new_elem%mv_conf = new_elem%parent%mv_next_conf
663 new_elem%mv_next_conf =
modulo(new_elem%mv_conf,
SIZE(new_elem%conf)) + 1
666 new_elem%Temp = tmp_elem%Temp
667 IF (n_acc) new_elem%Temp = tmp_elem%Temp*(1 - tmc_env%m_env%temp_decrease)
670 rnd = tmc_env%rng_stream%next()
671 rnd2 = tmc_env%rng_stream%next()
672 CALL tmc_env%rng_stream%get(bg=new_elem%rng_seed(:, :, 1), &
673 cg=new_elem%rng_seed(:, :, 2), &
674 ig=new_elem%rng_seed(:, :, 3))
682 new_elem%mv_next_conf = new_elem%mv_conf
684 swap_conf = 1 + int((tmc_env%params%nr_temp - 1)*rnd2)
685 new_elem%mv_conf = swap_conf
688 tree_elem => new_elem%conf(new_elem%mv_conf)%elem
689 new_elem%conf(new_elem%mv_conf)%elem => &
690 new_elem%conf(new_elem%mv_conf + 1)%elem
691 new_elem%conf(new_elem%mv_conf + 1)%elem => tree_elem
694 new_elem%swaped = .true.
695 new_elem%prob_acc = tmc_env%params%move_types%acc_prob( &
698 IF (tmc_env%params%DRAW_TREE)
THEN
700 tmc_params=tmc_env%params)
712 IF (new_elem%conf_n_acc(new_elem%conf(new_elem%mv_conf)%elem%sub_tree_nr))
THEN
714 IF (
ASSOCIATED(new_elem%conf(new_elem%mv_conf)%elem%acc))
THEN
715 new_elem%conf(new_elem%mv_conf)%elem => &
716 new_elem%conf(new_elem%mv_conf)%elem%acc
720 CALL create_new_subtree_node(act_gt_el=new_elem, &
722 IF (tmc_env%params%DRAW_TREE)
THEN
723 CALL create_dot(new_element=new_elem%conf(new_elem%mv_conf)%elem, &
724 conf=new_elem%conf(new_elem%mv_conf)%elem%sub_tree_nr, &
725 tmc_params=tmc_env%params)
730 IF (
ASSOCIATED(new_elem%conf(new_elem%mv_conf)%elem%nacc))
THEN
731 new_elem%conf(new_elem%mv_conf)%elem => &
732 new_elem%conf(new_elem%mv_conf)%elem%nacc
736 CALL create_new_subtree_node(act_gt_el=new_elem, &
738 IF (tmc_env%params%DRAW_TREE)
THEN
739 CALL create_dot(new_element=new_elem%conf(new_elem%mv_conf)%elem, &
740 conf=new_elem%conf(new_elem%mv_conf)%elem%sub_tree_nr, &
741 tmc_params=tmc_env%params)
748 new_elem%prob_acc = tmc_env%params%move_types%acc_prob( &
749 new_elem%conf(new_elem%mv_conf)%elem%move_type, new_elem%mv_conf)
752 IF (tmc_env%params%DRAW_TREE)
THEN
754 tmc_params=tmc_env%params)
765 cpabort(
"selected existing RESULT gt node")
768 SELECT CASE (new_elem%conf(new_elem%mv_conf)%elem%stat)
773 stat = new_elem%conf(new_elem%mv_conf)%elem%stat
774 IF (tmc_env%params%DRAW_TREE)
THEN
776 tmc_params=tmc_env%params)
779 new_elem%stat = new_elem%conf(new_elem%mv_conf)%elem%stat
781 stat = new_elem%conf(new_elem%mv_conf)%elem%stat
782 IF (tmc_env%params%DRAW_TREE)
THEN
784 tmc_params=tmc_env%params)
790 new_elem%stat = new_elem%conf(new_elem%mv_conf)%elem%stat
792 stat = new_elem%conf(new_elem%mv_conf)%elem%stat
793 IF (tmc_env%params%DRAW_TREE)
THEN
795 tmc_params=tmc_env%params)
806 IF (tmc_env%params%DRAW_TREE)
THEN
808 tmc_params=tmc_env%params)
812 new_elem%conf(new_elem%mv_conf)%elem%stat = &
815 stat = new_elem%conf(new_elem%mv_conf)%elem%stat
816 reactivation_cc_count = reactivation_cc_count + 1
817 IF (tmc_env%params%DRAW_TREE)
THEN
819 tmc_params=tmc_env%params)
822 CALL cp_abort(__location__, &
824 cp_to_string(new_elem%conf(new_elem%mv_conf)%elem%stat)// &
825 "of subtree element "// &
826 "for creating new gt element")
835 CALL timestop(handle)
845 SUBROUTINE create_new_subtree_node(act_gt_el, tmc_env)
849 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_new_subtree_node'
851 INTEGER :: conf, handle, itmp
852 LOGICAL :: mv_rejected, new_subbox
854 TYPE(
tree_type),
POINTER :: new_elem, parent_elem
856 NULLIFY (new_elem, parent_elem)
858 cpassert(
ASSOCIATED(act_gt_el))
859 cpassert(
ASSOCIATED(act_gt_el%conf(act_gt_el%mv_conf)%elem))
860 cpassert(
ASSOCIATED(tmc_env))
861 cpassert(
ASSOCIATED(tmc_env%params))
864 CALL timeset(routinen, handle)
866 conf = act_gt_el%mv_conf
868 next_el=new_elem, nr_dim=
SIZE(act_gt_el%parent%conf(conf)%elem%pos))
871 parent_elem => act_gt_el%conf(conf)%elem
872 new_elem%parent => parent_elem
875 parent_elem%next_elem_nr = parent_elem%next_elem_nr + 1
876 new_elem%nr = parent_elem%next_elem_nr
877 new_elem%rng_seed = parent_elem%rng_seed
880 IF (act_gt_el%conf_n_acc(act_gt_el%conf(act_gt_el%mv_conf)%elem%sub_tree_nr))
THEN
881 parent_elem%acc => new_elem
883 parent_elem%nacc => new_elem
889 new_elem%pos(:) = parent_elem%pos(:)
890 new_elem%mol(:) = parent_elem%mol(:)
891 new_elem%vel(:) = parent_elem%vel(:)
892 new_elem%ekin = parent_elem%ekin
893 new_elem%e_pot_approx = parent_elem%e_pot_approx
894 new_elem%next_elem_nr => parent_elem%next_elem_nr
895 new_elem%sub_tree_nr = parent_elem%sub_tree_nr
896 new_elem%box_scale = parent_elem%box_scale
898 new_elem%frc(:) = parent_elem%frc(:)
899 new_elem%potential = parent_elem%potential
900 new_elem%ekin_before_md = parent_elem%ekin_before_md
902 new_elem%potential = 97589.0_dp
906 CALL tmc_env%rng_stream%set( &
907 bg=new_elem%rng_seed(:, :, 1), &
908 cg=new_elem%rng_seed(:, :, 2), &
909 ig=new_elem%rng_seed(:, :, 3))
910 CALL tmc_env%rng_stream%reset_to_next_substream()
913 rnd = tmc_env%rng_stream%next()
914 IF (tmc_env%params%NMC_inp_file /=
"")
THEN
915 new_elem%temp_created = int(tmc_env%params%nr_temp*rnd) + 1
917 new_elem%temp_created = act_gt_el%mv_conf
921 rnd = tmc_env%rng_stream%next()
924 move_types=tmc_env%params%move_types, &
926 CALL tmc_env%rng_stream%get( &
927 bg=new_elem%rng_seed(:, :, 1), &
928 cg=new_elem%rng_seed(:, :, 2), &
929 ig=new_elem%rng_seed(:, :, 3))
935 SELECT CASE (new_elem%move_type)
941 new_elem%temp_created = act_gt_el%mv_conf
944 rng_stream=tmc_env%rng_stream, elem=new_elem, &
945 nr_of_sub_box_elements=itmp)
951 rng_stream=tmc_env%rng_stream, elem=new_elem, &
952 nr_of_sub_box_elements=itmp)
964 move_types=tmc_env%params%move_types, &
965 rng_stream=tmc_env%rng_stream, elem=new_elem, &
966 mv_conf=conf, new_subbox=new_subbox, &
967 move_rejected=mv_rejected)
968 IF (mv_rejected)
THEN
969 new_elem%potential = huge(new_elem%potential)
970 new_elem%e_pot_approx = huge(new_elem%e_pot_approx)
974 IF (tmc_env%params%NMC_inp_file /=
"")
THEN
981 CALL cp_abort(__location__, &
982 "unknown move type ("//
cp_to_string(new_elem%move_type)// &
983 "), while creating subtree element.")
985 act_gt_el%conf(act_gt_el%mv_conf)%elem => new_elem
988 CALL timestop(handle)
989 cpassert(
ASSOCIATED(act_gt_el%conf(act_gt_el%mv_conf)%elem))
990 END SUBROUTINE create_new_subtree_node
1003 SUBROUTINE remove_gt_elem(gt_ptr, draw, tmc_env)
1005 LOGICAL,
OPTIONAL :: draw
1008 CHARACTER(LEN=*),
PARAMETER :: routinen =
'remove_gt_elem'
1012 cpassert(
ASSOCIATED(gt_ptr))
1013 cpassert(
ASSOCIATED(tmc_env))
1016 CALL timeset(routinen, handle)
1026 IF (tmc_env%params%DRAW_TREE .AND.
PRESENT(draw))
THEN
1031 IF (
ASSOCIATED(gt_ptr%parent))
THEN
1032 IF (
ASSOCIATED(gt_ptr%parent%acc, gt_ptr))
THEN
1033 gt_ptr%parent%acc => null()
1035 IF (
ASSOCIATED(gt_ptr%parent%nacc, gt_ptr))
THEN
1036 gt_ptr%parent%nacc => null()
1041 IF (
ASSOCIATED(gt_ptr%acc))
THEN
1042 gt_ptr%acc%parent => null()
1045 IF (
ASSOCIATED(gt_ptr%nacc))
THEN
1046 gt_ptr%nacc%parent => null()
1049 CALL deallocate_global_tree_node(gt_elem=gt_ptr)
1051 CALL timestop(handle)
1053 cpassert(.NOT.
ASSOCIATED(gt_ptr))
1054 END SUBROUTINE remove_gt_elem
1064 SUBROUTINE remove_st_elem(ptr, draw, tmc_env)
1066 LOGICAL,
OPTIONAL :: draw
1069 CHARACTER(LEN=*),
PARAMETER :: routinen =
'remove_st_elem'
1075 cpassert(
ASSOCIATED(ptr))
1076 cpassert(
ASSOCIATED(tmc_env))
1079 CALL timeset(routinen, handle)
1082 IF (
ASSOCIATED(ptr%gt_nodes_references))
THEN
1083 IF (
ASSOCIATED(ptr%parent))
THEN
1084 CALL cp_warn(__location__, &
1085 "try to deallocate subtree element"// &
1087 " still with global tree element references e.g."// &
1090 cpassert(
ASSOCIATED(ptr%gt_nodes_references%gt_elem))
1092 SELECT CASE (ptr%stat)
1098 cpassert(tmc_env%params%SPECULATIVE_CANCELING)
1101 IF (
PRESENT(draw)) ready = .false.
1106 IF (
ASSOCIATED(ptr%parent) .AND. &
1107 (
ASSOCIATED(ptr%acc) .OR.
ASSOCIATED(ptr%nacc)))
THEN
1108 cpabort(
"Invalid association state of parent element")
1119 IF (tmc_env%params%DRAW_TREE .AND.
PRESENT(draw))
THEN
1124 IF (
ASSOCIATED(ptr%parent))
THEN
1125 IF (
ASSOCIATED(ptr%parent%acc, ptr)) ptr%parent%acc => null()
1126 IF (
ASSOCIATED(ptr%parent%nacc, ptr)) ptr%parent%nacc => null()
1130 IF (
ASSOCIATED(ptr%acc)) ptr%acc%parent => null()
1131 IF (
ASSOCIATED(ptr%nacc)) ptr%nacc%parent => null()
1138 CALL timestop(handle)
1139 END SUBROUTINE remove_st_elem
1155 CHARACTER(LEN=*),
PARAMETER :: routinen =
'remove_unused_g_tree'
1158 LOGICAL :: acc_removed, nacc_removed
1161 NULLIFY (acc_ptr, nacc_ptr, tmp_ptr)
1163 cpassert(
ASSOCIATED(begin_ptr))
1164 cpassert(
ASSOCIATED(end_ptr))
1165 cpassert(
ASSOCIATED(tmc_env))
1168 CALL timeset(routinen, handle)
1171 acc_removed = .false.
1172 nacc_removed = .false.
1174 IF (.NOT.
ASSOCIATED(begin_ptr, end_ptr))
THEN
1177 IF (
ASSOCIATED(begin_ptr%acc))
THEN
1178 acc_ptr => begin_ptr%acc
1181 acc_removed = .true.
1183 IF (
ASSOCIATED(begin_ptr%nacc))
THEN
1184 nacc_ptr => begin_ptr%nacc
1187 nacc_removed = .true.
1191 IF (acc_removed .AND. nacc_removed)
THEN
1192 SELECT CASE (begin_ptr%stat)
1197 tmp_ptr => begin_ptr
1199 CALL remove_gt_elem(gt_ptr=tmp_ptr, draw=.true., tmc_env=tmc_env)
1200 IF (.NOT.
ASSOCIATED(tmp_ptr)) removed = .true.
1203 CALL cp_abort(__location__, &
1204 "try to dealloc unused tree element with status of begin element" &
1210 CALL timestop(handle)
1211 cpassert(
ASSOCIATED(end_ptr))
1224 RECURSIVE SUBROUTINE remove_unused_s_tree(begin_ptr, end_ptr, working_elem_list, &
1227 TYPE(
tree_type),
INTENT(IN),
POINTER :: end_ptr
1232 CHARACTER(LEN=*),
PARAMETER :: routinen =
'remove_unused_s_tree'
1234 INTEGER :: handle, i
1235 LOGICAL :: acc_removed, nacc_removed, remove_this
1236 TYPE(
tree_type),
POINTER :: acc_ptr, nacc_ptr, tmp_ptr
1238 NULLIFY (acc_ptr, nacc_ptr, tmp_ptr)
1239 remove_this = .false.
1241 acc_removed = .false.
1242 nacc_removed = .false.
1245 CALL timeset(routinen, handle)
1247 cpassert(
ASSOCIATED(begin_ptr))
1248 cpassert(
ASSOCIATED(end_ptr))
1249 cpassert(
ASSOCIATED(working_elem_list))
1250 cpassert(
ASSOCIATED(tmc_env))
1253 IF (.NOT.
ASSOCIATED(begin_ptr, end_ptr))
THEN
1256 IF (
ASSOCIATED(begin_ptr%acc))
THEN
1257 acc_ptr => begin_ptr%acc
1258 CALL remove_unused_s_tree(acc_ptr, end_ptr, working_elem_list, &
1259 acc_removed, tmc_env)
1261 acc_removed = .true.
1263 IF (
ASSOCIATED(begin_ptr%nacc))
THEN
1264 nacc_ptr => begin_ptr%nacc
1265 CALL remove_unused_s_tree(nacc_ptr, end_ptr, working_elem_list, &
1266 nacc_removed, tmc_env)
1268 nacc_removed = .true.
1276 IF (acc_removed .AND. nacc_removed)
THEN
1277 SELECT CASE (begin_ptr%stat)
1279 remove_this = .true.
1282 remove_this = .true.
1287 remove_this = .false.
1291 CALL cp_abort(__location__, &
1293 "of sub tree element "// &
1299 IF (remove_this)
THEN
1301 IF (.NOT.
ASSOCIATED(begin_ptr%parent))
THEN
1302 CALL cp_abort(__location__, &
1303 "try to remove unused subtree element "// &
1306 " but parent does not exist")
1308 tmp_ptr => begin_ptr
1311 DO i = 1,
SIZE(working_elem_list(:))
1312 IF (
ASSOCIATED(working_elem_list(i)%elem))
THEN
1313 IF (
ASSOCIATED(working_elem_list(i)%elem, tmp_ptr))
THEN
1321 CALL remove_st_elem(ptr=tmp_ptr, draw=.true., tmc_env=tmc_env)
1322 IF (.NOT.
ASSOCIATED(tmp_ptr))
THEN
1332 CALL timestop(handle)
1333 END SUBROUTINE remove_unused_s_tree
1343 RECURSIVE SUBROUTINE remove_result_g_tree(end_of_clean_tree, actual_ptr, &
1348 CHARACTER(LEN=*),
PARAMETER :: routinen =
'remove_result_g_tree'
1353 cpassert(
ASSOCIATED(end_of_clean_tree))
1354 cpassert(
ASSOCIATED(actual_ptr))
1357 CALL timeset(routinen, handle)
1360 IF (
ASSOCIATED(actual_ptr%parent))
THEN
1361 CALL remove_result_g_tree(end_of_clean_tree=end_of_clean_tree, &
1362 actual_ptr=actual_ptr%parent, &
1366 IF (.NOT.
ASSOCIATED(actual_ptr, end_of_clean_tree))
THEN
1369 tmp_ptr => actual_ptr
1370 CALL remove_gt_elem(gt_ptr=tmp_ptr, draw=.true., tmc_env=tmc_env)
1371 actual_ptr => tmp_ptr
1374 CALL timestop(handle)
1375 END SUBROUTINE remove_result_g_tree
1386 RECURSIVE SUBROUTINE remove_result_s_tree(end_of_clean_tree, actual_ptr, &
1388 TYPE(
tree_type),
POINTER :: end_of_clean_tree, actual_ptr
1391 CHARACTER(LEN=*),
PARAMETER :: routinen =
'remove_result_s_tree'
1396 cpassert(
ASSOCIATED(end_of_clean_tree))
1397 cpassert(
ASSOCIATED(actual_ptr))
1398 cpassert(
ASSOCIATED(tmc_env))
1401 CALL timeset(routinen, handle)
1404 IF (
ASSOCIATED(actual_ptr%parent))
THEN
1405 CALL remove_result_s_tree(end_of_clean_tree, actual_ptr%parent, &
1410 IF (.NOT.
ASSOCIATED(actual_ptr, end_of_clean_tree))
THEN
1412 cpassert(.NOT. (
ASSOCIATED(actual_ptr%acc) .AND.
ASSOCIATED(actual_ptr%nacc)))
1415 IF (.NOT.
ASSOCIATED(actual_ptr%parent))
THEN
1417 tmp_ptr => actual_ptr
1418 CALL remove_st_elem(ptr=tmp_ptr, draw=.true., tmc_env=tmc_env)
1419 actual_ptr => tmp_ptr
1423 CALL timestop(handle)
1424 END SUBROUTINE remove_result_s_tree
1438 CHARACTER(LEN=*),
PARAMETER :: routinen =
'remove_all_trees'
1440 INTEGER :: handle, i, tree
1441 LOGICAL :: change_trajec, flag
1443 TYPE(
tree_type),
POINTER :: last_acc_st_elem, tmp_ptr
1445 NULLIFY (last_acc_st_elem, tmp_ptr, tmp_gt_ptr)
1447 cpassert(
ASSOCIATED(working_elem_list))
1448 cpassert(
ASSOCIATED(tmc_env))
1449 cpassert(
ASSOCIATED(tmc_env%m_env))
1450 cpassert(
ASSOCIATED(tmc_env%m_env%gt_act))
1451 cpassert(
ASSOCIATED(tmc_env%m_env%gt_clean_end))
1452 cpassert(
ASSOCIATED(tmc_env%m_env%result_list))
1453 cpassert(
ASSOCIATED(tmc_env%m_env%st_clean_ends))
1456 change_trajec = .false.
1459 CALL timeset(routinen, handle)
1463 end_ptr=tmc_env%m_env%gt_act, removed=flag, &
1465 tmp_gt_ptr => tmc_env%m_env%gt_clean_end
1467 tree_ptr=tmp_gt_ptr)
1469 IF (tmc_env%params%USE_REDUCED_TREE)
THEN
1470 tmp_gt_ptr => tmc_env%m_env%gt_clean_end
1471 CALL remove_result_g_tree(end_of_clean_tree=tmc_env%m_env%gt_clean_end, &
1472 actual_ptr=tmp_gt_ptr, tmc_env=tmc_env)
1475 IF (.NOT.
ASSOCIATED(tmc_env%m_env%gt_head, tmc_env%m_env%gt_clean_end))
THEN
1476 change_trajec = .true.
1478 tmc_env%m_env%gt_head => tmc_env%m_env%gt_clean_end
1479 cpassert(.NOT.
ASSOCIATED(tmc_env%m_env%gt_head%parent))
1485 DO tree = 1, tmc_env%params%nr_temp
1487 conf_loop:
DO i = 1,
SIZE(tmc_env%m_env%result_list)
1488 last_acc_st_elem => tmc_env%m_env%result_list(i)%elem
1489 IF (last_acc_st_elem%sub_tree_nr == tree)
THEN
1493 cpassert(last_acc_st_elem%sub_tree_nr == tree)
1494 CALL remove_unused_s_tree(begin_ptr=tmc_env%m_env%st_clean_ends(tree)%elem, &
1495 end_ptr=last_acc_st_elem, working_elem_list=working_elem_list, &
1496 removed=flag, tmc_env=tmc_env)
1498 last_acc=last_acc_st_elem)
1501 IF (tmc_env%params%USE_REDUCED_TREE .AND. change_trajec)
THEN
1502 DO tree = 1, tmc_env%params%nr_temp
1503 tmp_ptr => tmc_env%m_env%st_clean_ends(tree)%elem
1504 cpassert(tmp_ptr%sub_tree_nr == tree)
1505 CALL remove_result_s_tree(end_of_clean_tree=tmc_env%m_env%st_clean_ends(tree)%elem, &
1506 actual_ptr=tmp_ptr, tmc_env=tmc_env)
1507 tmc_env%m_env%st_heads(tree)%elem => tmc_env%m_env%st_clean_ends(tree)%elem
1515 CALL timestop(handle)
1516 cpassert(
ASSOCIATED(tmc_env%m_env%gt_act))
1517 cpassert(
ASSOCIATED(tmc_env%m_env%gt_clean_end))
1527 RECURSIVE SUBROUTINE dealloc_whole_g_tree(begin_ptr, removed, tmc_env)
1532 LOGICAL :: acc_removed, nacc_removed
1535 cpassert(
ASSOCIATED(begin_ptr))
1536 cpassert(
ASSOCIATED(tmc_env))
1538 IF (
ASSOCIATED(begin_ptr%acc))
THEN
1539 acc_ptr => begin_ptr%acc
1540 CALL dealloc_whole_g_tree(acc_ptr, acc_removed, tmc_env)
1542 acc_removed = .true.
1544 IF (
ASSOCIATED(begin_ptr%nacc))
THEN
1545 nacc_ptr => begin_ptr%nacc
1546 CALL dealloc_whole_g_tree(nacc_ptr, nacc_removed, tmc_env)
1548 nacc_removed = .true.
1552 IF (acc_removed .AND. nacc_removed)
THEN
1554 elem=begin_ptr%conf(begin_ptr%mv_conf)%elem, tmc_env=tmc_env)
1555 tmp_ptr => begin_ptr
1556 CALL remove_gt_elem(gt_ptr=tmp_ptr, draw=.false., tmc_env=tmc_env)
1560 END SUBROUTINE dealloc_whole_g_tree
1568 RECURSIVE SUBROUTINE dealloc_whole_subtree(begin_ptr, removed, tmc_params)
1573 LOGICAL :: acc_removed, nacc_removed
1574 TYPE(
tree_type),
POINTER :: acc_ptr, nacc_ptr, tmp_ptr
1576 cpassert(
ASSOCIATED(begin_ptr))
1577 cpassert(
ASSOCIATED(tmc_params))
1579 IF (
ASSOCIATED(begin_ptr%acc))
THEN
1580 acc_ptr => begin_ptr%acc
1581 CALL dealloc_whole_subtree(acc_ptr, acc_removed, tmc_params)
1583 acc_removed = .true.
1585 IF (
ASSOCIATED(begin_ptr%nacc))
THEN
1586 nacc_ptr => begin_ptr%nacc
1587 CALL dealloc_whole_subtree(nacc_ptr, nacc_removed, tmc_params)
1589 nacc_removed = .true.
1593 IF (acc_removed .AND. nacc_removed)
THEN
1594 tmp_ptr => begin_ptr
1598 END SUBROUTINE dealloc_whole_subtree
1615 cpassert(
ASSOCIATED(tmc_env))
1616 cpassert(
ASSOCIATED(tmc_env%m_env))
1618 global_tree => tmc_env%m_env%gt_act
1621 DO WHILE (
ASSOCIATED(global_tree%parent))
1622 global_tree => global_tree%parent
1624 CALL dealloc_whole_g_tree(begin_ptr=global_tree, removed=flag, &
1628 trees_loop:
DO i = 1,
SIZE(tmc_env%m_env%st_clean_ends(:))
1629 DO WHILE (
ASSOCIATED(tmc_env%m_env%st_clean_ends(i)%elem%parent))
1630 tmc_env%m_env%st_clean_ends(i)%elem => &
1631 tmc_env%m_env%st_clean_ends(i)%elem%parent
1633 CALL dealloc_whole_subtree(begin_ptr=tmc_env%m_env%st_clean_ends(i)%elem, &
1634 removed=flag, tmc_params=tmc_env%params)
1636 DEALLOCATE (tmc_env%params%atoms)
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.
integer, parameter, public dp
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Timing routines for accounting.
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
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
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
subroutine, public change_pos(tmc_params, move_types, rng_stream, elem, mv_conf, new_subbox, move_rejected)
applying the preselected move type
tree nodes creation, searching, deallocation, references etc.
integer, parameter, public tmc_status_failed
integer, parameter, public task_type_gaussian_adaptation
integer, parameter, public tmc_status_wait_for_new_task
integer, parameter, public task_type_mc
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
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...
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 the subtrees binary tree parent elemen...
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 the subtrees binary tree parent elemen...