74 #include "../base/base_uses.f90"
80 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'tmc_master'
84 INTEGER,
PARAMETER :: DEBUG = 0
97 SUBROUTINE cancel_calculations(cancel_list, work_list, cancel_count, &
99 TYPE(elem_list_type),
POINTER :: cancel_list
100 TYPE(elem_array_type),
DIMENSION(:),
POINTER :: work_list
101 INTEGER :: cancel_count
102 TYPE(mp_para_env_type),
POINTER :: para_env
103 TYPE(tmc_env_type),
POINTER :: tmc_env
105 INTEGER :: i, stat, wg
106 TYPE(elem_list_type),
POINTER :: tmp_element
108 IF (.NOT.
ASSOCIATED(cancel_list))
RETURN
109 NULLIFY (tmp_element)
111 cpassert(
ASSOCIATED(tmc_env))
112 cpassert(
ASSOCIATED(tmc_env%params))
113 cpassert(
ASSOCIATED(tmc_env%m_env))
114 cpassert(
ASSOCIATED(work_list))
115 cpassert(
ASSOCIATED(para_env))
121 working_elem_loop:
DO i = 1,
SIZE(work_list)
124 IF ((.NOT. work_list(i)%canceled) .AND. &
125 ASSOCIATED(work_list(i)%elem))
THEN
126 IF (
ASSOCIATED(cancel_list%elem, work_list(i)%elem))
THEN
129 EXIT working_elem_loop
132 END DO working_elem_loop
139 WRITE (tmc_env%m_env%io_unit, *) &
140 "TMC|master: cancel group "//cp_to_string(wg)
142 para_env=para_env, tmc_params=tmc_env%params)
143 work_list(wg)%canceled = .true.
146 cancel_count = cancel_count + 1
149 IF (.NOT.
ASSOCIATED(cancel_list%next))
THEN
150 DEALLOCATE (cancel_list)
151 cancel_list => null()
152 EXIT cancel_elem_loop
154 tmp_element => cancel_list%next
155 DEALLOCATE (cancel_list)
156 cancel_list => tmp_element
158 END DO cancel_elem_loop
159 END SUBROUTINE cancel_calculations
169 SUBROUTINE send_analysis_tasks(ana_list, ana_worker_info, para_env, tmc_env)
170 TYPE(elem_list_type),
POINTER :: ana_list
171 TYPE(elem_array_type),
DIMENSION(:),
POINTER :: ana_worker_info
172 TYPE(mp_para_env_type),
POINTER :: para_env
173 TYPE(tmc_env_type),
POINTER :: tmc_env
175 INTEGER :: dest, stat, wg
176 TYPE(elem_list_type),
POINTER :: list_tmp
180 cpassert(
ASSOCIATED(ana_worker_info))
181 cpassert(
ASSOCIATED(para_env))
183 wg_loop:
DO wg = 1,
SIZE(ana_worker_info)
184 IF (.NOT.
ASSOCIATED(ana_list))
EXIT wg_loop
185 IF (.NOT. ana_worker_info(wg)%busy)
THEN
189 para_env=para_env, tmc_params=tmc_env%params, &
191 IF (.NOT.
ASSOCIATED(ana_list%next))
THEN
192 DEALLOCATE (ana_list)
195 list_tmp => ana_list%next
196 DEALLOCATE (ana_list)
201 END SUBROUTINE send_analysis_tasks
211 TYPE(tmc_env_type),
POINTER :: tmc_env
212 TYPE(global_environment_type),
POINTER :: globenv
214 CHARACTER(LEN=*),
PARAMETER :: routinen =
'do_tmc_master'
216 INTEGER :: cancel_count, handle, last_output, reactivation_cc_count, &
217 reactivation_ener_count, restart_count, restarted_elem_nr, stat, walltime_delay, &
218 walltime_offset, wg, worker_counter
219 INTEGER(KIND=int_8) :: mem
220 INTEGER,
DIMENSION(6) :: nr_of_job
221 INTEGER,
DIMENSION(:),
POINTER :: tree_elem_counters, tree_elem_heads
222 LOGICAL :: external_stop, flag, l_update_tree
223 REAL(kind=
dp) :: run_time_start
224 REAL(kind=
dp),
DIMENSION(4) :: worker_timings_aver
225 REAL(kind=
dp),
DIMENSION(:),
POINTER :: efficiency
226 TYPE(elem_array_type),
DIMENSION(:),
POINTER :: ana_worker_info, worker_info
227 TYPE(global_tree_type),
POINTER :: gt_elem_tmp
228 TYPE(tree_type),
POINTER :: init_conf
230 external_stop = .false.
231 restarted_elem_nr = 0
232 NULLIFY (init_conf, worker_info, ana_worker_info, gt_elem_tmp, tree_elem_counters)
234 cpassert(
ASSOCIATED(tmc_env))
236 cpassert(tmc_env%tmc_comp_set%group_nr == 0)
237 cpassert(
ASSOCIATED(tmc_env%tmc_comp_set))
238 cpassert(
ASSOCIATED(tmc_env%tmc_comp_set%para_env_m_w))
240 cpassert(
ASSOCIATED(tmc_env%m_env))
244 CALL timeset(routinen, handle)
250 IF (tmc_env%params%DRAW_TREE) &
258 reactivation_ener_count = 0
259 reactivation_cc_count = 0
261 tmc_env%m_env%result_count = 0
262 l_update_tree = .false.
267 worker_timings_aver(:) = 0.0_dp
270 ALLOCATE (worker_info(tmc_env%tmc_comp_set%para_env_m_w%num_pe - 1))
271 ALLOCATE (ana_worker_info(tmc_env%tmc_comp_set%para_env_m_ana%num_pe - 1))
278 para_env=tmc_env%tmc_comp_set%para_env_m_w, &
279 tmc_params=tmc_env%params, &
280 wait_for_message=.true.)
284 para_env=tmc_env%tmc_comp_set%para_env_m_w, &
285 tmc_params=tmc_env%params, &
286 elem=init_conf, success=flag, wait_for_message=.true.)
288 CALL cp_abort(__location__, &
289 "receiving start configuration failed, received stat "// &
294 para_env=tmc_env%tmc_comp_set%para_env_m_first_w)
300 move_types=tmc_env%params%move_types, &
301 mol_array=init_conf%mol)
302 IF (
ASSOCIATED(tmc_env%params%nmc_move_types)) &
304 move_types=tmc_env%params%nmc_move_types, &
305 mol_array=init_conf%mol)
312 job_counts=nr_of_job, &
313 worker_timings=worker_timings_aver)
316 IF (tmc_env%m_env%restart_out_step .NE. 0)
THEN
317 restart_count = int(tmc_env%m_env%result_count(0)/ &
318 REAL(tmc_env%m_env%restart_out_step, kind=
dp)) + 1
320 restarted_elem_nr = tmc_env%m_env%result_count(0)
325 DO wg = 1, tmc_env%tmc_comp_set%para_env_m_w%num_pe - 1
328 para_env=tmc_env%tmc_comp_set%para_env_m_w, &
329 tmc_params=tmc_env%params)
333 IF (tmc_env%tmc_comp_set%para_env_m_ana%num_pe .GT. 1)
THEN
334 DO wg = 1, tmc_env%tmc_comp_set%para_env_m_ana%num_pe - 1
337 para_env=tmc_env%tmc_comp_set%para_env_m_ana, &
338 result_count=tmc_env%m_env%result_count, &
339 tmc_params=tmc_env%params, &
341 wait_for_message=.true.)
345 para_env=tmc_env%tmc_comp_set%para_env_m_ana)
351 IF (tmc_env%params%print_test_output .OR. debug .GT. 0) &
352 WRITE (tmc_env%m_env%io_unit, *)
"TMC|first_global_tree_rnd_nr_X= ", &
353 tmc_env%m_env%gt_head%rnd_nr
358 IF (tmc_env%tmc_comp_set%group_cc_nr .GT. 0) &
359 wg = tmc_env%tmc_comp_set%group_ener_nr + 1
362 para_env=tmc_env%tmc_comp_set%para_env_m_w, &
363 tmc_params=tmc_env%params, &
364 elem=tmc_env%m_env%gt_head%conf(1)%elem)
365 worker_info(wg)%busy = .true.
366 worker_info(wg)%elem => tmc_env%m_env%gt_head%conf(1)%elem
367 init_conf => tmc_env%m_env%gt_head%conf(1)%elem
368 ELSE IF (tmc_env%m_env%gt_head%conf(1)%elem%stat .EQ.
status_created)
THEN
369 init_conf => tmc_env%m_env%gt_head%conf(1)%elem
383 worker_request_loop:
DO
387 para_env=tmc_env%tmc_comp_set%para_env_m_w, &
388 tmc_params=tmc_env%params, &
389 elem_array=worker_info(:), success=flag)
391 IF (flag .EQV. .false.)
EXIT worker_request_loop
395 WRITE (tmc_env%m_env%io_unit, *) &
396 "TMC|master: recv stat "//cp_to_string(stat)// &
397 " of canceled worker group"
398 cycle worker_request_loop
403 IF (.NOT.
ASSOCIATED(worker_info(wg)%elem)) &
404 CALL cp_abort(__location__, &
405 "no tree elem exist when receiving stat "// &
406 cp_to_string(stat)//
"of group"//cp_to_string(wg))
409 WRITE (tmc_env%m_env%io_unit, *) &
410 "TMC|master: received stat "//cp_to_string(stat)// &
411 " of sub tree "//cp_to_string(worker_info(wg)%elem%sub_tree_nr)// &
412 " elem"//cp_to_string(worker_info(wg)%elem%nr)// &
413 " with stat"//cp_to_string(worker_info(wg)%elem%stat)// &
414 " of group"//cp_to_string(wg)//
" group canceled ", worker_info(wg)%canceled
422 cpassert(worker_info(wg)%canceled)
423 worker_info(wg)%canceled = .false.
424 worker_info(wg)%busy = .false.
426 IF (
ASSOCIATED(worker_info(wg)%elem))
THEN
427 SELECT CASE (worker_info(wg)%elem%stat)
430 worker_timings_aver(4) = (worker_timings_aver(4)*nr_of_job(6) + &
431 (
m_walltime() - worker_info(wg)%start_time))/real(nr_of_job(6) + 1, kind=
dp)
432 nr_of_job(6) = nr_of_job(6) + 1
435 worker_info(wg)%elem%potential = 8000.0_dp
436 IF (tmc_env%params%DRAW_TREE)
THEN
438 tmc_params=tmc_env%params)
442 worker_timings_aver(3) = (worker_timings_aver(3)*nr_of_job(5) + &
443 (
m_walltime() - worker_info(wg)%start_time))/real(nr_of_job(5) + 1, kind=
dp)
444 nr_of_job(5) = nr_of_job(5) + 1
447 worker_info(wg)%elem%potential = 8000.0_dp
448 IF (tmc_env%params%DRAW_TREE)
THEN
450 tmc_params=tmc_env%params)
455 worker_info(wg)%elem => null()
463 nr_of_job(3) = nr_of_job(3) + 1
464 worker_info(wg)%busy = .false.
466 IF (tmc_env%params%DRAW_TREE)
THEN
468 tmc_params=tmc_env%params)
470 worker_info(wg)%elem => null()
475 IF (.NOT. worker_info(wg)%canceled) worker_info(wg)%busy = .false.
477 worker_timings_aver(1) = (worker_timings_aver(1)*nr_of_job(3) + &
478 (
m_walltime() - worker_info(wg)%start_time))/real(nr_of_job(3) + 1, kind=
dp)
479 nr_of_job(3) = nr_of_job(3) + 1
481 worker_info(wg)%start_time =
m_walltime() - worker_info(wg)%start_time
482 CALL set_walltime_delay(worker_info(wg)%start_time, walltime_delay)
484 IF (tmc_env%params%DRAW_TREE)
THEN
486 tmc_params=tmc_env%params)
490 IF (tmc_env%params%NMC_inp_file .EQ.
"")
THEN
491 worker_info(wg)%elem%potential = worker_info(wg)%elem%e_pot_approx
494 IF (.NOT. (
ASSOCIATED(worker_info(wg)%elem, init_conf)))
THEN
498 IF (tmc_env%params%DRAW_TREE)
THEN
500 tmc_params=tmc_env%params)
503 CALL cancel_calculations(cancel_list=tmc_env%m_env%cancelation_list, &
504 work_list=worker_info, &
505 para_env=tmc_env%tmc_comp_set%para_env_m_w, &
507 cancel_count=cancel_count)
508 worker_info(wg)%elem => null()
511 IF (tmc_env%tmc_comp_set%group_cc_nr .LE. 0 &
512 .AND. (.NOT. worker_info(wg)%canceled))
THEN
517 para_env=tmc_env%tmc_comp_set%para_env_m_w, &
518 tmc_params=tmc_env%params, &
519 elem=worker_info(wg)%elem)
520 worker_info(wg)%busy = .true.
521 nr_of_job(2) = nr_of_job(2) + 1
522 IF (tmc_env%params%DRAW_TREE)
THEN
524 tmc_params=tmc_env%params)
529 worker_info(wg)%elem => null()
535 worker_timings_aver(2) = (worker_timings_aver(2)*nr_of_job(4) + &
536 (
m_walltime() - worker_info(wg)%start_time))/real(nr_of_job(4) + 1, kind=
dp)
537 nr_of_job(4) = nr_of_job(4) + 1
539 worker_info(wg)%start_time =
m_walltime() - worker_info(wg)%start_time
540 CALL set_walltime_delay(worker_info(wg)%start_time, walltime_delay)
542 IF (.NOT. worker_info(wg)%canceled) &
543 worker_info(wg)%busy = .false.
545 IF (
ASSOCIATED(worker_info(wg)%elem, init_conf))
THEN
549 IF (tmc_env%params%DRAW_TREE)
THEN
551 tmc_params=tmc_env%params)
553 tmc_params=tmc_env%params)
558 IF (tmc_env%params%DRAW_TREE) &
560 tmc_params=tmc_env%params)
567 IF (tmc_env%params%all_conf_file_name .NE.
"")
THEN
569 file_name=tmc_env%params%all_conf_file_name, &
570 tmc_params=tmc_env%params, &
571 conf_nr=nr_of_job(4))
576 CALL cancel_calculations(cancel_list=tmc_env%m_env%cancelation_list, &
577 work_list=worker_info, &
578 para_env=tmc_env%tmc_comp_set%para_env_m_w, &
580 cancel_count=cancel_count)
582 WRITE (tmc_env%m_env%io_unit, *) &
583 "TMC|master: handled energy result of sub tree ", &
584 worker_info(wg)%elem%sub_tree_nr,
" elem ", worker_info(wg)%elem%nr, &
585 " with stat", worker_info(wg)%elem%stat
586 worker_info(wg)%elem => null()
590 IF (.NOT. (
ASSOCIATED(worker_info(wg)%elem, init_conf)) .AND. &
598 CALL cancel_calculations(cancel_list=tmc_env%m_env%cancelation_list, &
599 work_list=worker_info, &
600 para_env=tmc_env%tmc_comp_set%para_env_m_w, &
602 cancel_count=cancel_count)
604 ana_worker_info(wg)%busy = .false.
605 ana_worker_info(wg)%elem => null()
607 cpabort(
"received message with unknown info/stat type")
609 END DO worker_request_loop
611 CALL tree_update(tmc_env=tmc_env, result_acc=flag, &
612 something_updated=l_update_tree)
613 IF (debug .GE. 2 .AND. l_update_tree) &
614 WRITE (tmc_env%m_env%io_unit, *) &
615 "TMC|master: tree updated "//cp_to_string(l_update_tree)// &
616 " of with gt elem "//cp_to_string(tmc_env%m_env%gt_act%nr)// &
617 " with stat"//cp_to_string(tmc_env%m_env%gt_act%stat)
619 CALL send_analysis_tasks(ana_list=tmc_env%m_env%analysis_list, &
620 ana_worker_info=ana_worker_info, &
621 para_env=tmc_env%tmc_comp_set%para_env_m_ana, &
630 CALL external_control(should_stop=external_stop, flag=
"TMC", globenv=globenv)
631 IF ((any(tmc_env%m_env%result_count(1:) .GE. tmc_env%m_env%num_MC_elem) &
634 tmc_env%m_env%walltime - walltime_delay - walltime_offset) .OR. &
636 WRITE (tmc_env%m_env%io_unit, fmt=
"(/,T2,A)") repeat(
"=", 79)
638 IF (.NOT. any(tmc_env%m_env%result_count(1:) &
639 .GE. tmc_env%m_env%num_MC_elem))
THEN
640 WRITE (tmc_env%m_env%io_unit, *)
"Walltime exceeded.", &
641 m_walltime() - run_time_start,
" of ", tmc_env%m_env%walltime - walltime_delay - walltime_offset, &
642 "(incl. delay", walltime_delay,
"and offset", walltime_offset,
") left"
645 IF (tmc_env%params%print_test_output) &
646 WRITE (tmc_env%m_env%io_unit, *)
"Total energy: ", &
647 tmc_env%m_env%result_list(1)%elem%potential
649 IF (tmc_env%m_env%restart_out_step .NE. 0) &
658 IF (l_update_tree)
THEN
660 WRITE (tmc_env%m_env%io_unit, *) &
661 "TMC|master: start remove elem and cancel calculation"
670 CALL cancel_calculations(cancel_list=tmc_env%m_env%cancelation_list, &
671 work_list=worker_info, &
672 cancel_count=cancel_count, &
673 para_env=tmc_env%tmc_comp_set%para_env_m_w, &
680 worker_counter = worker_counter + 1
681 wg =
modulo(worker_counter, tmc_env%tmc_comp_set%para_env_m_w%num_pe - 1) + 1
683 IF (debug .GE. 16 .AND. all(worker_info(:)%busy)) &
684 WRITE (tmc_env%m_env%io_unit, *)
"all workers are busy"
686 IF (.NOT. worker_info(wg)%busy)
THEN
688 WRITE (tmc_env%m_env%io_unit, *) &
689 "TMC|master: search new task for worker ", wg
691 IF (tmc_env%tmc_comp_set%group_cc_nr .LE. 0)
THEN
694 new_gt_elem=gt_elem_tmp, stat=stat, &
695 react_count=reactivation_ener_count)
698 new_elem=gt_elem_tmp, &
699 reactivation_cc_count=reactivation_cc_count)
701 ELSEIF (wg .GT. tmc_env%tmc_comp_set%group_ener_nr)
THEN
706 new_elem=gt_elem_tmp, &
707 reactivation_cc_count=reactivation_cc_count)
715 new_gt_elem=gt_elem_tmp, stat=stat, &
716 react_count=reactivation_ener_count)
720 WRITE (tmc_env%m_env%io_unit, *) &
721 "TMC|master: send task with elem stat "//cp_to_string(stat)// &
722 " to group "//cp_to_string(wg)
736 para_env=tmc_env%tmc_comp_set%para_env_m_w, &
737 tmc_params=tmc_env%params, &
738 elem=gt_elem_tmp%conf(gt_elem_tmp%mv_conf)%elem)
739 nr_of_job(1) = nr_of_job(1) + 1
744 IF (tmc_env%params%DRAW_TREE) &
745 CALL create_dot_color(tree_element=gt_elem_tmp%conf(gt_elem_tmp%mv_conf)%elem, &
746 tmc_params=tmc_env%params)
749 para_env=tmc_env%tmc_comp_set%para_env_m_w, &
750 tmc_params=tmc_env%params, &
751 elem=gt_elem_tmp%conf(gt_elem_tmp%mv_conf)%elem)
752 nr_of_job(2) = nr_of_job(2) + 1
756 para_env=tmc_env%tmc_comp_set%para_env_m_w, &
757 tmc_params=tmc_env%params, &
758 elem=gt_elem_tmp%conf(gt_elem_tmp%mv_conf)%elem)
760 nr_of_job(1) = nr_of_job(1) + 1
765 para_env=tmc_env%tmc_comp_set%para_env_m_w, &
766 tmc_params=tmc_env%params, &
767 elem=gt_elem_tmp%conf(gt_elem_tmp%mv_conf)%elem)
768 nr_of_job(1) = nr_of_job(1) + 1
773 CALL cp_abort(__location__, &
774 "new task of tree element"// &
775 cp_to_string(gt_elem_tmp%nr)// &
776 "has unknown status"//cp_to_string(stat))
778 worker_info(wg)%elem => gt_elem_tmp%conf(gt_elem_tmp%mv_conf)%elem
779 worker_info(wg)%busy = .true.
784 IF (nr_of_job(4) .GT. last_output .AND. &
785 (
modulo(nr_of_job(4), tmc_env%m_env%info_out_step_size) .EQ. 0) .AND. &
787 last_output = nr_of_job(4)
788 WRITE (tmc_env%m_env%io_unit, fmt=
"(/,T2,A)") repeat(
"-", 79)
789 WRITE (tmc_env%m_env%io_unit, *) &
790 "Tasks submitted: E ", nr_of_job(2),
", cc", nr_of_job(1)
791 WRITE (tmc_env%m_env%io_unit, *) &
792 "Results received: E ", nr_of_job(4),
", cc", nr_of_job(3)
793 WRITE (tmc_env%m_env%io_unit, *) &
794 "Configurations used:", tmc_env%m_env%result_count(0), &
795 ", sub trees", tmc_env%m_env%result_count(1:)
798 tmc_params=tmc_env%params)
799 ALLOCATE (tree_elem_counters(0:
SIZE(tmc_env%params%Temp)))
800 ALLOCATE (tree_elem_heads(0:
SIZE(tmc_env%params%Temp)))
802 end_of_clean_trees=tmc_env%m_env%st_clean_ends, &
803 counters=tree_elem_counters, head_elements_nr=tree_elem_heads)
804 WRITE (tmc_env%m_env%io_unit, *)
"nodes in trees", tree_elem_counters(:)
805 WRITE (tmc_env%m_env%io_unit, *)
"tree heads ", tree_elem_heads(:)
806 IF (tmc_env%params%NMC_inp_file .NE.
"")
THEN
808 counters=tree_elem_counters)
809 WRITE (tmc_env%m_env%io_unit, fmt=*) &
810 "ener prepared ", tree_elem_counters
812 IF (tmc_env%params%SPECULATIVE_CANCELING) &
813 WRITE (tmc_env%m_env%io_unit, *) &
814 "canceled cc|E: ", nr_of_job(5:6), &
815 ", reactivated: cc ", &
816 reactivation_cc_count, &
817 ", reactivated: E ", &
818 reactivation_ener_count
819 WRITE (tmc_env%m_env%io_unit, fmt=
'(A,2F10.2)') &
820 " Average time for cc/ener calc ", &
821 worker_timings_aver(1), worker_timings_aver(2)
822 IF (tmc_env%params%SPECULATIVE_CANCELING) &
823 WRITE (tmc_env%m_env%io_unit, fmt=
'(A,2F10.2)') &
824 " Average time until cancel cc/ener calc ", &
825 worker_timings_aver(3), worker_timings_aver(4)
826 IF (tmc_env%params%esimate_acc_prob) &
827 WRITE (tmc_env%m_env%io_unit, *) &
828 "Estimate correct (acc/Nacc) | wrong (acc/nacc)", &
829 tmc_env%m_env%estim_corr_wrong(1), &
830 tmc_env%m_env%estim_corr_wrong(3),
" | ", &
831 tmc_env%m_env%estim_corr_wrong(2), &
832 tmc_env%m_env%estim_corr_wrong(4)
833 WRITE (tmc_env%m_env%io_unit, *) &
834 "Time: ", int(
m_walltime() - run_time_start),
"of", &
835 int(tmc_env%m_env%walltime - walltime_delay - walltime_offset), &
838 WRITE (tmc_env%m_env%io_unit, *) &
839 "Memory used: ", int(mem/(1024*1024), kind=kind(0)),
"MiBytes"
840 CALL m_flush(tmc_env%m_env%io_unit)
841 DEALLOCATE (tree_elem_heads)
842 DEALLOCATE (tree_elem_counters)
845 IF (tmc_env%m_env%restart_out_step .GT. 0 .AND. &
846 tmc_env%m_env%result_count(0) .GT. &
847 restart_count*tmc_env%m_env%restart_out_step)
THEN
850 restart_count = restart_count + 1
857 WRITE (tmc_env%m_env%io_unit, fmt=
"(/,T2,A)") repeat(
"=", 79)
858 WRITE (unit=tmc_env%m_env%io_unit, fmt=
"(T2,A,T35,A,T80,A)")
"=", &
859 "finalizing TMC",
"="
860 WRITE (tmc_env%m_env%io_unit, *)
"acceptance rates:"
862 tmc_params=tmc_env%params)
863 WRITE (tmc_env%m_env%io_unit, fmt=
"(/,T2,A)") repeat(
"-", 79)
865 ALLOCATE (efficiency(0:tmc_env%params%nr_temp))
867 WRITE (tmc_env%m_env%io_unit, *)
"Efficiencies:"
868 WRITE (tmc_env%m_env%io_unit, fmt=
"(A,F5.2,A,1000F5.2)") &
869 " (MC elements/calculated configuration) global:", &
870 efficiency(0),
" sub tree(s): ", efficiency(1:)
871 DEALLOCATE (efficiency)
872 IF (tmc_env%tmc_comp_set%group_cc_nr .GT. 0) &
873 WRITE (tmc_env%m_env%io_unit, fmt=
"(A,1000F5.2)") &
874 " (MC elements/created configuration) :", &
875 tmc_env%m_env%result_count(:)/real(nr_of_job(3), kind=
dp)
876 WRITE (tmc_env%m_env%io_unit, fmt=
"(A,1000F5.2)") &
877 " (MC elements/energy calculated configuration):", &
878 tmc_env%m_env%result_count(:)/real(nr_of_job(4), kind=
dp)
879 IF (tmc_env%params%NMC_inp_file .NE.
"")
THEN
880 WRITE (tmc_env%m_env%io_unit, *) &
881 "Amount of canceled elements (E/cc):", &
882 tmc_env%m_env%count_cancel_ener, tmc_env%m_env%count_cancel_NMC
883 WRITE (tmc_env%m_env%io_unit, *) &
884 " reactivated E ", reactivation_ener_count
885 WRITE (tmc_env%m_env%io_unit, *) &
886 " reactivated cc ", reactivation_cc_count
888 WRITE (tmc_env%m_env%io_unit, fmt=
"(A,F10.2)") &
889 " computing time of one Markov chain element ", &
890 (
m_walltime() - run_time_start)/real(tmc_env%m_env%result_count(0) - &
891 restarted_elem_nr, kind=
dp)
892 WRITE (tmc_env%m_env%io_unit, fmt=
"(A,F10.2)")
" TMC run time[s]: ",
m_walltime() - run_time_start
893 WRITE (tmc_env%m_env%io_unit, fmt=
"(/,T2,A)") repeat(
"=", 79)
896 WRITE (tmc_env%m_env%io_unit, *)
"stopping workers"
898 worker_info=worker_info, &
899 tmc_params=tmc_env%params)
900 DEALLOCATE (worker_info)
902 worker_info=ana_worker_info, &
903 tmc_params=tmc_env%params)
904 DEALLOCATE (ana_worker_info)
912 IF (tmc_env%params%DRAW_TREE) &
915 WRITE (tmc_env%m_env%io_unit, *)
"TMC master: all work done."
918 CALL timestop(handle)
929 SUBROUTINE set_walltime_delay(time, walltime_delay)
930 REAL(kind=
dp) :: time
931 INTEGER :: walltime_delay
933 cpassert(time .GE. 0.0_dp)
935 IF (time .GT. walltime_delay)
THEN
936 walltime_delay = int(time) + 1
938 END SUBROUTINE set_walltime_delay
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
Handles all functions related to the CELL.
subroutine, public init_cell(cell, hmat, periodic)
Initialise/readjust a simulation cell after hmat has been changed.
Routines to handle the external control of CP2K.
subroutine, public external_control(should_stop, flag, globenv, target_time, start_time, force_check)
External manipulations during a run : when the <PROJECT_NAME>.EXIT_$runtype command is sent the progr...
various routines to log and control the output. The idea is that decisions about where to log should ...
Define type storing the global information of a run. Keep the amount of stored data small....
Defines the basic variable types.
integer, parameter, public int_8
integer, parameter, public dp
Machine interface based on Fortran 2003 and POSIX.
subroutine, public m_memory(mem)
Returns the total amount of memory [bytes] in use, if known, zero otherwise.
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Interface to the message passing library MPI.
Timing routines for accounting.
calculation section for TreeMonteCarlo
subroutine, public get_subtree_efficiency(tmc_env, eff)
calculated the rate of used tree elements to created tree elements for every temperature
to decrease the used memory size, just actual needed tree elements should be stored in memory,...
subroutine, public free_cancelation_list(cancel_list)
for correct finalizing deallocate the cancelation list
module for printing tree structures in GraphViz dot files for visualizing the trees
subroutine, public finalize_draw_tree(tmc_params)
close the dot files (write tails)
subroutine, public init_draw_trees(tmc_params)
initializes the dot files (open and write headers)
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_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 print_restart_file(tmc_env, job_counts, timings)
prints out the TMC restart files with all last configurations and counters etc.
subroutine, public write_element_in_file(elem, tmc_params, temp_index, file_name, conf_nr, conf_info)
writes the trajectory element in a file from sub tree element
module contains the master routine handling the tree creation, communication with workers and task di...
subroutine, public do_tmc_master(tmc_env, globenv)
global master handling tree creation and communication/work distribution with workers
set up the different message for different tasks A TMC message consists of 3 parts (messages) 1: firs...
subroutine, public tmc_message(msg_type, send_recv, dest, para_env, tmc_params, elem, elem_array, list_elem, result_count, wait_for_message, success)
tmc message handling, packing messages with integer and real data type. Send first info message with ...
subroutine, public communicate_atom_types(atoms, source, para_env)
routines send atom names to the global master (using broadcast in a specialized group consisting of t...
subroutine, public stop_whole_group(para_env, worker_info, tmc_params)
send stop command to all group participants
logical, parameter, public send_msg
logical, parameter, public recv_msg
acceptance ratio handling of the different Monte Carlo Moves types For each move type and each temper...
subroutine, public check_moves(tmc_params, move_types, mol_array)
checks if the moves are possible
subroutine, public print_move_types(init, file_io, tmc_params)
routine pronts out the probabilities and sized for each type and temperature the output is divided in...
tree nodes creation, searching, deallocation, references etc.
integer, parameter, public tmc_status_failed
integer, parameter, public tmc_stat_analysis_request
integer, parameter, public tmc_status_worker_init
integer, parameter, public tmc_stat_md_result
integer, parameter, public tmc_stat_md_request
integer, parameter, public tmc_stat_approx_energy_result
integer, parameter, public tmc_stat_start_conf_result
integer, parameter, public tmc_status_wait_for_new_task
integer, parameter, public tmc_stat_nmc_result
integer, parameter, public tmc_stat_analysis_result
integer, parameter, public tmc_stat_init_analysis
integer, parameter, public tmc_stat_energy_result
integer, parameter, public tmc_stat_scf_step_ener_receive
integer, parameter, public tmc_stat_approx_energy_request
integer, parameter, public tmc_stat_start_conf_request
integer, parameter, public tmc_canceling_receipt
integer, parameter, public tmc_stat_energy_request
integer, parameter, public tmc_stat_nmc_request
integer, parameter, public tmc_canceling_message
tree nodes acceptance code is separated in 3 parts, first the acceptance criteria,...
subroutine, public tree_update(tmc_env, result_acc, something_updated)
searching tree nodes to check for Markov Chain, elements are marked and stored in lists ....
subroutine, public check_acceptance_of_depending_subtree_nodes(tree_elem, tmc_env)
check acceptance of energy calculated element and related childs, when ready
subroutine, public check_elements_for_acc_prob_update(tree_elem, tmc_env)
updates the subtree acceptance probability the swap probabilities are handled within the certain chec...
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...
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 search_next_energy_calc(gt_head, new_gt_elem, stat, react_count)
gt_head head of the global tree
subroutine, public count_nodes_in_trees(global_tree_ptr, end_of_clean_trees, counters, head_elements_nr)
counts the number of existing nodes in global and subtrees
subroutine, public count_prepared_nodes_in_trees(global_tree_ptr, counters)
searches for created configurations in all subtrees
module handles definition of the tree nodes for the global and the subtrees binary tree parent elemen...
integer, parameter, public status_accepted
integer, parameter, public status_calculate_energy
integer, parameter, public status_calculate_md
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_rejected
integer, parameter, public status_calculate_nmc_steps
integer, parameter, public status_created
module handles definition of the tree nodes for the global and the subtrees binary tree parent elemen...