45 #include "../base/base_uses.f90"
51 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'tmc_tree_acceptance'
58 INTEGER,
PARAMETER :: DEBUG = 0
81 temperature, diff_pot_check, accept, rnd_nr, &
83 TYPE(tree_type),
POINTER :: tree_element, parent_element
84 TYPE(tmc_param_type),
POINTER :: tmc_params
85 REAL(kind=
dp) :: temperature
86 LOGICAL :: diff_pot_check, accept
87 REAL(kind=
dp) :: rnd_nr
88 LOGICAL,
OPTIONAL :: approx_ener
90 CHARACTER(LEN=*),
PARAMETER :: routinen =
'acceptance_check'
93 REAL(kind=
dp) :: ekin_last_acc, elem_ener, kb, parent_ener
95 cpassert(
ASSOCIATED(tree_element))
96 cpassert(
ASSOCIATED(parent_element))
97 cpassert(
ASSOCIATED(tmc_params))
98 cpassert(temperature .GT. 0.0_dp)
99 cpassert(rnd_nr .GE. 0.0_dp .AND. rnd_nr .LE. 1.0_dp)
104 CALL timeset(routinen, handle)
115 IF (diff_pot_check .AND. (tmc_params%NMC_inp_file .NE.
""))
THEN
116 IF ((tree_element%potential .EQ. huge(tree_element%potential)) .OR. &
117 tree_element%e_pot_approx .EQ. huge(tree_element%e_pot_approx))
THEN
118 elem_ener = huge(elem_ener)
122 elem_ener = 1.0_dp/(kb*temperature)*tree_element%potential &
123 - 1.0_dp/(kb*tmc_params%Temp(tree_element%temp_created)) &
124 *tree_element%e_pot_approx
126 parent_ener = 1.0_dp/(kb*temperature)*parent_element%potential &
127 - 1.0_dp/(kb*tmc_params%Temp(tree_element%temp_created)) &
128 *parent_element%e_pot_approx
131 IF (elem_ener .LE. parent_ener)
THEN
136 exp(-(elem_ener - parent_ener)))
THEN
144 IF (tree_element%move_type .EQ.
mv_type_md)
THEN
145 ekin_last_acc = tree_element%ekin_before_md
148 ekin_last_acc = parent_element%ekin
151 IF (
PRESENT(approx_ener))
THEN
152 elem_ener = tree_element%e_pot_approx &
154 parent_ener = parent_element%e_pot_approx &
157 elem_ener = tree_element%potential &
159 parent_ener = parent_element%potential &
164 IF (elem_ener .LE. parent_ener)
THEN
169 exp(-1.0_dp/(kb*temperature)*(elem_ener - parent_ener)))
THEN
178 IF (diff_pot_check)
THEN
179 cpassert(
ASSOCIATED(tmc_params%prior_NMC_acc))
180 tmc_params%prior_NMC_acc%counter = tmc_params%prior_NMC_acc%counter + 1
181 tmc_params%prior_NMC_acc%aver = (tmc_params%prior_NMC_acc%aver*(tmc_params%prior_NMC_acc%counter - 1) + &
182 ((elem_ener - parent_ener)))/real(tmc_params%prior_NMC_acc%counter, kind=
dp)
183 tmc_params%prior_NMC_acc%aver_2 = (tmc_params%prior_NMC_acc%aver_2*(tmc_params%prior_NMC_acc%counter - 1) + &
184 (elem_ener - parent_ener)**2)/real(tmc_params%prior_NMC_acc%counter, kind=
dp)
188 CALL timestop(handle)
205 SUBROUTINE swap_acceptance_check(tree_elem, conf1, conf2, tmc_params, accept)
206 TYPE(global_tree_type),
POINTER :: tree_elem
207 TYPE(tree_type),
POINTER :: conf1, conf2
208 TYPE(tmc_param_type),
POINTER :: tmc_params
211 CHARACTER(LEN=*),
PARAMETER :: routinen =
'swap_acceptance_check'
214 REAL(kind=
dp) :: delta, elem1_ener, elem2_ener, kb, vol1, &
219 cpassert(
ASSOCIATED(tree_elem))
220 cpassert(tree_elem%rnd_nr .GE. 0.0_dp)
221 cpassert(
ASSOCIATED(conf1))
222 cpassert(
ASSOCIATED(conf2))
223 cpassert(
ASSOCIATED(tmc_params))
226 CALL timeset(routinen, handle)
228 IF (tmc_params%pressure .GT. 0.0_dp)
THEN
230 elem1_ener = conf1%potential &
232 elem2_ener = conf2%potential &
236 IF (tree_elem%rnd_nr .LT. exp((1.0_dp/(kb*tmc_params%Temp(tree_elem%mv_conf)) - &
237 1.0_dp/(kb*tmc_params%Temp(tree_elem%mv_conf + 1))) &
238 *(elem2_ener - elem1_ener)))
THEN
245 CALL get_scaled_cell(cell=tmc_params%cell, box_scale=conf1%box_scale, &
247 CALL get_scaled_cell(cell=tmc_params%cell, box_scale=conf2%box_scale, &
250 delta = (1.0_dp/(kb*tmc_params%Temp(tree_elem%mv_conf)) &
251 - 1.0_dp/(kb*tmc_params%Temp(tree_elem%mv_conf + 1)))* &
252 ((conf2%potential + conf2%ekin) - (conf1%potential + conf1%ekin)) + &
253 (1.0_dp/(kb*tmc_params%Temp(tree_elem%mv_conf))*tmc_params%pressure &
254 - 1.0_dp/(kb*tmc_params%Temp(tree_elem%mv_conf + 1))*tmc_params%pressure)* &
256 IF (tree_elem%rnd_nr .LT. exp(delta))
THEN
263 CALL timestop(handle)
264 END SUBROUTINE swap_acceptance_check
279 SUBROUTINE volume_acceptance_check(parent_elem, new_elem, temperature, &
280 rnd_nr, tmc_params, accept)
281 TYPE(tree_type),
POINTER :: parent_elem, new_elem
282 REAL(kind=
dp) :: temperature, rnd_nr
283 TYPE(tmc_param_type),
POINTER :: tmc_params
286 CHARACTER(LEN=*),
PARAMETER :: routinen =
'volume_acceptance_check'
289 REAL(kind=
dp) :: d_enthalpy, kb, n_vol, p_vol
293 cpassert(
ASSOCIATED(parent_elem))
294 cpassert(
ASSOCIATED(new_elem))
295 cpassert(temperature .GT. 0.0_dp)
296 cpassert(rnd_nr .GT. 0.0_dp)
297 cpassert(
ASSOCIATED(tmc_params))
298 cpassert(tmc_params%pressure .GE. 0.0_dp)
301 CALL timeset(routinen, handle)
303 CALL get_scaled_cell(cell=tmc_params%cell, box_scale=parent_elem%box_scale, &
305 CALL get_scaled_cell(cell=tmc_params%cell, box_scale=new_elem%box_scale, &
311 d_enthalpy = (new_elem%potential - parent_elem%potential) + &
312 tmc_params%pressure*(n_vol - p_vol) - &
313 kb*temperature*(
SIZE(new_elem%pos)/ &
314 tmc_params%dim_per_elem)* &
317 IF (tmc_params%v_isotropic)
THEN
318 d_enthalpy = (new_elem%potential - parent_elem%potential) + &
319 tmc_params%pressure*(n_vol - p_vol) - &
320 kb*temperature*((
SIZE(new_elem%pos)/ &
321 tmc_params%dim_per_elem) + 2/real(3, kind=
dp))* &
324 d_enthalpy = (new_elem%potential - parent_elem%potential) + &
325 tmc_params%pressure*(n_vol - p_vol) - &
326 kb*temperature*(
SIZE(new_elem%pos)/ &
327 tmc_params%dim_per_elem)* &
332 IF (d_enthalpy .LE. 0.0_dp)
THEN
335 IF (rnd_nr .LT. exp(-1.0_dp/(kb*temperature)*d_enthalpy))
THEN
342 CALL timestop(handle)
343 END SUBROUTINE volume_acceptance_check
356 TYPE(tree_type),
POINTER :: tree_elem
357 TYPE(tmc_env_type),
POINTER :: tmc_env
359 CHARACTER(LEN=*),
PARAMETER :: routinen =
'check_acceptance_of_depending_subtree_nodes'
362 LOGICAL :: parent_ready
363 TYPE(tree_type),
POINTER :: act_elem, parent_elem
365 NULLIFY (parent_elem, act_elem)
367 cpassert(
ASSOCIATED(tmc_env))
368 cpassert(
ASSOCIATED(tree_elem))
370 cpassert(
ASSOCIATED(tree_elem%parent))
373 CALL timeset(routinen, handle)
375 act_elem => tree_elem
380 cpassert(.NOT.
ASSOCIATED(act_elem, parent_elem))
383 SELECT CASE (parent_elem%stat)
387 parent_ready = .false.
390 parent_ready = .true.
392 cpabort(
"unknown parent element status"//cp_to_string(parent_elem%stat))
396 IF (parent_ready)
THEN
398 CALL check_and_change_status_of_subtree_elem(act_elem=act_elem, &
399 parent_elem=parent_elem, tmc_env=tmc_env)
403 parent_elem => tree_elem
404 IF (
ASSOCIATED(tree_elem%acc))
THEN
405 act_elem => tree_elem%acc
407 CALL check_and_change_status_of_subtree_elem(act_elem=act_elem, &
408 parent_elem=parent_elem, tmc_env=tmc_env)
413 IF (.NOT.
ASSOCIATED(act_elem%nacc))
EXIT nacc_loop
414 act_elem => act_elem%nacc
416 CALL check_and_change_status_of_subtree_elem(act_elem=act_elem, &
417 parent_elem=parent_elem, tmc_env=tmc_env)
423 CALL timestop(handle)
433 SUBROUTINE check_and_change_status_of_subtree_elem(act_elem, parent_elem, tmc_env)
434 TYPE(tree_type),
POINTER :: act_elem, parent_elem
435 TYPE(tmc_env_type),
POINTER :: tmc_env
437 CHARACTER(LEN=*),
PARAMETER :: routinen =
'check_and_change_status_of_subtree_elem'
440 LOGICAL :: flag, result_acc
441 TYPE(global_tree_type),
POINTER :: tmp_gt_ptr
442 TYPE(gt_elem_list_type),
POINTER :: tmp_gt_list_ptr
444 NULLIFY (tmp_gt_list_ptr, tmp_gt_ptr)
447 CALL timeset(routinen, handle)
449 cpassert(
ASSOCIATED(tmc_env))
450 cpassert(
ASSOCIATED(tmc_env%params))
451 cpassert(
ASSOCIATED(act_elem))
452 cpassert(
ASSOCIATED(parent_elem))
454 mark_used(parent_elem)
458 tmp_gt_list_ptr => act_elem%gt_nodes_references
461 DO WHILE (
ASSOCIATED(tmp_gt_list_ptr))
465 CALL check_elements(gt_act_elem=tmp_gt_list_ptr%gt_elem, tmc_env=tmc_env, &
466 check_done=flag, result_acc=result_acc)
469 CALL prob_update(move_types=tmc_env%params%move_types, elem=act_elem, &
470 acc=result_acc, prob_opt=tmc_env%params%esimate_acc_prob)
474 IF (result_acc .EQV. .true.)
THEN
476 IF (
ASSOCIATED(tmp_gt_list_ptr%gt_elem%nacc))
THEN
477 tmp_gt_ptr => tmp_gt_list_ptr%gt_elem%nacc
479 end_ptr=tmp_gt_list_ptr%gt_elem, removed=flag, &
485 IF (
ASSOCIATED(tmp_gt_list_ptr%gt_elem%acc))
THEN
486 tmp_gt_ptr => tmp_gt_list_ptr%gt_elem%acc
488 end_ptr=tmp_gt_list_ptr%gt_elem, removed=flag, &
493 IF (tmc_env%params%DRAW_TREE) &
495 tmc_params=tmc_env%params)
497 tmp_gt_list_ptr => tmp_gt_list_ptr%next
500 CALL timestop(handle)
501 END SUBROUTINE check_and_change_status_of_subtree_elem
512 SUBROUTINE subtree_configuration_stat_change(gt_ptr, stat, tmc_params)
513 TYPE(global_tree_type),
POINTER :: gt_ptr
515 TYPE(tmc_param_type),
POINTER :: tmc_params
517 CHARACTER(LEN=*),
PARAMETER :: routinen =
'subtree_configuration_stat_change'
520 TYPE(tree_type),
POINTER :: ptr
524 cpassert(
ASSOCIATED(gt_ptr))
525 cpassert(
ASSOCIATED(tmc_params))
528 CALL timeset(routinen, handle)
532 IF (.NOT. gt_ptr%swaped)
THEN
533 ptr => gt_ptr%conf(gt_ptr%mv_conf)%elem
544 CALL cp_abort(__location__, &
545 "unknown global tree status"// &
549 IF (tmc_params%DRAW_TREE) &
554 CALL timestop(handle)
555 END SUBROUTINE subtree_configuration_stat_change
563 SUBROUTINE elem_ready_to_check(elem, ready)
564 TYPE(tree_type),
POINTER :: elem
567 CHARACTER(LEN=*),
PARAMETER :: routinen =
'elem_ready_to_check'
571 cpassert(
ASSOCIATED(elem))
574 CALL timeset(routinen, handle)
578 SELECT CASE (elem%stat)
586 CALL cp_abort(__location__, &
587 "status of actual tree node is unknown" &
588 //cp_to_string(elem%stat))
591 CALL timestop(handle)
592 END SUBROUTINE elem_ready_to_check
602 SUBROUTINE check_elements(gt_act_elem, tmc_env, check_done, result_acc)
603 TYPE(global_tree_type),
POINTER :: gt_act_elem
604 TYPE(tmc_env_type),
POINTER :: tmc_env
605 LOGICAL :: check_done, result_acc
607 CHARACTER(LEN=*),
PARAMETER :: routinen =
'check_elements'
610 LOGICAL :: act_ready, tmp_ready
611 TYPE(tree_type),
POINTER :: act_element, tmp_element
613 NULLIFY (act_element, tmp_element)
616 cpassert(
ASSOCIATED(gt_act_elem))
617 cpassert(
ASSOCIATED(tmc_env))
618 cpassert(
ASSOCIATED(tmc_env%m_env))
621 CALL timeset(routinen, handle)
625 SELECT CASE (gt_act_elem%stat)
633 CALL cp_abort(__location__, &
634 "undefinite status of already checked elements:" &
635 //cp_to_string(gt_act_elem%stat))
640 IF (.NOT. check_done)
THEN
645 cpassert(
ASSOCIATED(act_element))
646 cpassert(
ASSOCIATED(tmp_element))
649 CALL elem_ready_to_check(elem=act_element, ready=act_ready)
650 CALL elem_ready_to_check(elem=tmp_element, ready=tmp_ready)
653 IF (act_ready .AND. tmp_ready)
THEN
655 IF (gt_act_elem%swaped)
THEN
656 CALL swap_acceptance_check(tree_elem=gt_act_elem, conf1=act_element, &
657 conf2=tmp_element, tmc_params=tmc_env%params, &
661 CALL volume_acceptance_check(parent_elem=tmp_element, new_elem=act_element, &
662 temperature=tmc_env%params%Temp(gt_act_elem%mv_conf), &
663 rnd_nr=gt_act_elem%rnd_nr, &
664 tmc_params=tmc_env%params, accept=result_acc)
666 IF (tmc_env%m_env%temp_decrease .NE. 1.0_dp)
THEN
667 CALL acceptance_check(tree_element=act_element, parent_element=tmp_element, &
668 tmc_params=tmc_env%params, temperature=gt_act_elem%Temp, &
669 diff_pot_check=.true., accept=result_acc, &
670 rnd_nr=gt_act_elem%rnd_nr)
672 CALL acceptance_check(tree_element=act_element, parent_element=tmp_element, &
673 tmc_params=tmc_env%params, &
674 temperature=tmc_env%params%Temp(gt_act_elem%mv_conf), &
675 diff_pot_check=.true., accept=result_acc, &
676 rnd_nr=gt_act_elem%rnd_nr)
683 SELECT CASE (gt_act_elem%stat)
688 IF (gt_act_elem%conf(gt_act_elem%mv_conf)%elem%stat .NE. gt_act_elem%stat) &
689 gt_act_elem%stat = gt_act_elem%conf(gt_act_elem%mv_conf)%elem%stat
692 CALL cp_abort(__location__, &
693 "status of actual checked node is unknown" &
694 //cp_to_string(gt_act_elem%stat))
699 CALL timestop(handle)
700 END SUBROUTINE check_elements
713 TYPE(tmc_env_type),
POINTER :: tmc_env
714 LOGICAL :: result_acc, something_updated
716 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tree_update'
718 INTEGER :: handle, itmp
720 TYPE(global_tree_type),
POINTER :: gt_act_elem
721 TYPE(tree_type),
POINTER :: act_element, tmp_element
723 NULLIFY (gt_act_elem, tmp_element, act_element)
725 cpassert(
ASSOCIATED(tmc_env))
728 CALL timeset(routinen, handle)
731 something_updated = .false.
733 gt_act_elem => tmc_env%m_env%gt_act
734 search_calculated_element_loop:
DO
735 NULLIFY (act_element, tmp_element)
738 IF (.NOT. found)
EXIT search_calculated_element_loop
741 CALL check_elements(gt_act_elem=gt_act_elem, tmc_env=tmc_env, &
742 check_done=found, result_acc=result_acc)
744 IF (.NOT. found)
EXIT search_calculated_element_loop
748 elem1=act_element, elem2=tmp_element)
753 tmc_env%m_env%result_count(gt_act_elem%mv_conf) = &
754 tmc_env%m_env%result_count(gt_act_elem%mv_conf) + 1
757 IF (gt_act_elem%swaped) &
758 tmc_env%m_env%result_count(gt_act_elem%mv_conf + 1) = &
759 tmc_env%m_env%result_count(gt_act_elem%mv_conf + 1) + 1
761 tmc_env%m_env%result_count(0) = tmc_env%m_env%result_count(0) + 1
764 something_updated = .true.
774 IF (.NOT. result_acc)
THEN
775 IF (gt_act_elem%prob_acc .GT. 0.0_dp)
THEN
776 IF (gt_act_elem%prob_acc .GE. 0.5_dp)
THEN
778 tmc_env%m_env%estim_corr_wrong(4) = tmc_env%m_env%estim_corr_wrong(4) + 1
779 IF (debug .GT. 0)
WRITE (tmc_env%m_env%io_unit, *) &
780 "Wrong guess for NACC (elem/estim acc prob)", gt_act_elem%nr, gt_act_elem%prob_acc
782 tmc_env%m_env%estim_corr_wrong(3) = tmc_env%m_env%estim_corr_wrong(3) + 1
786 gt_act_elem%prob_acc = 0.0_dp
787 itmp = gt_act_elem%conf(gt_act_elem%mv_conf)%elem%sub_tree_nr
791 IF (gt_act_elem%prob_acc .GT. 0.0_dp)
THEN
792 IF (gt_act_elem%prob_acc .LE. 0.5_dp)
THEN
794 tmc_env%m_env%estim_corr_wrong(2) = tmc_env%m_env%estim_corr_wrong(2) + 1
795 IF (debug .GT. 0)
WRITE (tmc_env%m_env%io_unit, *) &
796 "wrong guess for ACC (elem/estim acc prob)", gt_act_elem%nr, gt_act_elem%prob_acc
798 tmc_env%m_env%estim_corr_wrong(1) = tmc_env%m_env%estim_corr_wrong(1) + 1
802 gt_act_elem%prob_acc = 1.0_dp
805 IF (.NOT. gt_act_elem%swaped)
THEN
807 tmc_env%m_env%result_list(gt_act_elem%mv_conf)%elem => &
808 gt_act_elem%conf(gt_act_elem%mv_conf)%elem
812 tmc_env%m_env%result_list(gt_act_elem%mv_conf)%elem => act_element
813 tmc_env%m_env%result_list(gt_act_elem%mv_conf + 1)%elem => tmp_element
815 tmc_env%m_env%gt_act => gt_act_elem
819 IF (.NOT. gt_act_elem%swaped) &
820 CALL subtree_configuration_stat_change(gt_ptr=gt_act_elem, &
821 stat=gt_act_elem%stat, &
822 tmc_params=tmc_env%params)
824 IF (tmc_env%params%DRAW_TREE) &
826 tmc_params=tmc_env%params)
829 CALL prob_update(move_types=tmc_env%params%move_types, &
831 prob_opt=tmc_env%params%esimate_acc_prob)
835 result_count=tmc_env%m_env%result_count, &
836 conf_updated=gt_act_elem%mv_conf, accepted=result_acc, &
837 tmc_params=tmc_env%params)
838 IF (gt_act_elem%swaped) &
840 result_count=tmc_env%m_env%result_count, &
841 conf_updated=gt_act_elem%mv_conf + 1, accepted=result_acc, &
842 tmc_params=tmc_env%params)
845 IF (tmc_env%tmc_comp_set%para_env_m_ana%num_pe .GT. 1 .AND. result_acc)
THEN
846 CALL add_to_list(elem=tmc_env%m_env%result_list(gt_act_elem%mv_conf)%elem, &
847 list=tmc_env%m_env%analysis_list, &
848 temp_ind=gt_act_elem%mv_conf, &
849 nr=tmc_env%m_env%result_count(gt_act_elem%mv_conf))
850 IF (gt_act_elem%swaped)
THEN
851 CALL add_to_list(elem=tmc_env%m_env%result_list(gt_act_elem%mv_conf + 1)%elem, &
852 list=tmc_env%m_env%analysis_list, &
853 temp_ind=gt_act_elem%mv_conf + 1, &
854 nr=tmc_env%m_env%result_count(gt_act_elem%mv_conf + 1))
857 END DO search_calculated_element_loop
860 CALL timestop(handle)
874 FUNCTION ready_for_update_acc_prob(elem)
RESULT(ready)
875 TYPE(tree_type),
POINTER :: elem
878 cpassert(
ASSOCIATED(elem))
880 IF ((elem%scf_energies_count .GE. 4) &
884 END FUNCTION ready_for_update_acc_prob
895 TYPE(tree_type),
POINTER :: tree_elem
896 TYPE(tmc_env_type),
POINTER :: tmc_env
898 CHARACTER(LEN=*),
PARAMETER :: routinen =
'check_elements_for_acc_prob_update'
901 TYPE(tree_type),
POINTER :: act_elem, parent_elem
903 NULLIFY (parent_elem, act_elem)
905 cpassert(
ASSOCIATED(tree_elem))
906 cpassert(
ASSOCIATED(tmc_env))
909 CALL timeset(routinen, handle)
911 act_elem => tree_elem
913 IF (tmc_env%params%esimate_acc_prob .AND. &
914 ready_for_update_acc_prob(act_elem))
THEN
921 CALL update_prob_gt_node_list(reference_list=act_elem%gt_nodes_references, &
922 act_elem=act_elem, parent_elem=parent_elem, act_parent=.true., &
927 parent_elem => tree_elem
930 IF (
ASSOCIATED(tree_elem%acc))
THEN
931 act_elem => tree_elem%acc
933 CALL update_prob_gt_node_list(reference_list=act_elem%gt_nodes_references, &
934 act_elem=act_elem, parent_elem=parent_elem, act_parent=.false., &
940 IF (.NOT.
ASSOCIATED(act_elem%nacc))
EXIT nacc_loop
941 act_elem => act_elem%nacc
942 CALL update_prob_gt_node_list(reference_list=act_elem%gt_nodes_references, &
943 act_elem=act_elem, parent_elem=parent_elem, act_parent=.false., &
948 CALL timestop(handle)
963 SUBROUTINE update_prob_gt_node_list(reference_list, act_elem, parent_elem, act_parent, tmc_env)
964 TYPE(gt_elem_list_type),
POINTER :: reference_list
965 TYPE(tree_type),
POINTER :: act_elem, parent_elem
966 LOGICAL :: act_parent
967 TYPE(tmc_env_type),
POINTER :: tmc_env
969 CHARACTER(LEN=*),
PARAMETER :: routinen =
'update_prob_gt_node_list'
971 INTEGER :: handle, integration_steps
972 REAL(kind=
dp) :: kb, tmp_prob
973 TYPE(gt_elem_list_type),
POINTER :: tmp_pt_ptr
974 TYPE(tree_type),
POINTER :: tmp_elem, tmp_parent_elem
978 NULLIFY (tmp_pt_ptr, tmp_elem, tmp_parent_elem)
980 IF (.NOT.
ASSOCIATED(reference_list))
RETURN
982 cpassert(
ASSOCIATED(reference_list%gt_elem))
983 cpassert(
ASSOCIATED(act_elem))
984 cpassert(
ASSOCIATED(parent_elem))
987 CALL timeset(routinen, handle)
990 IF (ready_for_update_acc_prob(act_elem))
THEN
994 integration_steps = 100
996 tmp_pt_ptr => reference_list
998 reference_loop:
DO WHILE (
ASSOCIATED(tmp_pt_ptr))
1000 IF (tmp_pt_ptr%gt_elem%swaped)
THEN
1001 NULLIFY (tmp_elem, tmp_parent_elem)
1004 elem1=tmp_elem, elem2=tmp_parent_elem)
1006 IF (act_parent .AND.
ASSOCIATED(act_elem, tmp_elem) .AND. &
1007 ready_for_update_acc_prob(elem=tmp_parent_elem))
THEN
1010 elem_new=act_elem, &
1011 e_classical_diff=0.0_dp, &
1012 rnd_nr=tmp_pt_ptr%gt_elem%rnd_nr, &
1013 beta=1.0_dp/(kb*(tmc_env%params%Temp(tmp_pt_ptr%gt_elem%mv_conf) - &
1014 tmc_env%params%Temp(tmp_pt_ptr%gt_elem%mv_conf + 1))), &
1015 tmc_params=tmc_env%params)
1017 tmp_pt_ptr => tmp_pt_ptr%next
1018 cycle reference_loop
1022 IF (ready_for_update_acc_prob(parent_elem))
THEN
1024 elem_new=act_elem, &
1025 e_classical_diff=act_elem%e_pot_approx - parent_elem%e_pot_approx, &
1026 rnd_nr=tmp_pt_ptr%gt_elem%rnd_nr, &
1027 beta=1.0_dp/(kb*tmc_env%params%Temp(tmp_pt_ptr%gt_elem%mv_conf)), &
1028 tmc_params=tmc_env%params)
1032 IF (tmp_prob .GE. 0.0_dp)
THEN
1033 tmp_pt_ptr%gt_elem%prob_acc = tmp_prob
1035 IF (tmc_env%params%SPECULATIVE_CANCELING) &
1037 prob=tmp_pt_ptr%gt_elem%prob_acc, tmc_env=tmc_env)
1041 tmp_pt_ptr => tmp_pt_ptr%next
1042 END DO reference_loop
1045 CALL timestop(handle)
1046 END SUBROUTINE update_prob_gt_node_list
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 ...
Definition of physical constants:
real(kind=dp), parameter, public boltzmann
real(kind=dp), parameter, public joule
calculation section for TreeMonteCarlo
subroutine, public get_scaled_cell(cell, box_scale, scaled_hmat, scaled_cell, vol, abc, vec)
handles properties and calculations of a scaled cell
real(kind=dp) function, public compute_estimated_prob(elem_old, elem_new, E_classical_diff, rnd_nr, beta, tmc_params)
extimates the probability of acceptance considering the intermetiate step energies
module for printing tree structures in GraphViz dot files for visualizing the trees
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 write_result_list_element(result_list, result_count, conf_updated, accepted, tmc_params)
select the correct configuration to print out the (coordinates, forces, cell ...)
acceptance ratio handling of the different Monte Carlo Moves types For each move type and each temper...
subroutine, public prob_update(move_types, pt_el, elem, acc, subbox, prob_opt)
adaptation of acceptance probability of every kind of change/move and the overall acc prob,...
tree nodes creation, searching, deallocation, references etc.
integer, parameter, public mv_type_volume_move
integer, parameter, public mv_type_md
tree nodes creation, searching, deallocation, references etc.
integer, parameter, public task_type_gaussian_adaptation
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...
subroutine, public acceptance_check(tree_element, parent_element, tmc_params, temperature, diff_pot_check, accept, rnd_nr, approx_ener)
standard Monte Carlo and 2 potential acceptance check acceptance check of move from old(last accepted...
tree nodes creation, deallocation, references etc.
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
recursive type(tree_type) function, pointer, public search_parent_element(current)
searching the parent element (last accepted configuration before)
recursive subroutine, public search_canceling_elements(pt_elem_in, prob, tmc_env)
searches in all branches down below the entered global tree element for elements to cancel,...
subroutine, public get_subtree_elements_to_check(gt_act_elem, elem1, elem2)
get the changed element of the actual global tree element and its related last accepted parent
recursive subroutine, public search_next_gt_element_to_check(ptr, found)
search the next global element in the Markov Chain to check
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_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...