76 CHARACTER(LEN=default_string_length) :: inp_kind_name
77 INTEGER :: i, i_rep, i_tmp, ind, n_items, &
78 n_nmc_items, n_rep_val, nmc_steps
79 LOGICAL :: explicit, flag
80 REAL(kind=
dp) :: delta_x, init_acc_prob, mv_prob, &
81 mv_prob_sum, nmc_init_acc_prob, &
82 nmc_prob, nmc_prob_sum, prob_ex
86 NULLIFY (move_types, move_type_section, nmc_section)
97 init_acc_prob = 0.0_dp
105 DO i_rep = 1, n_items
108 mv_prob_sum = mv_prob_sum + mv_prob
117 IF (tmc_params%NMC_inp_file ==
"")
THEN
118 cpabort(
"Please specify a valid approximate potential.")
123 IF (nmc_steps <= 0)
THEN
124 cpabort(
"Please specify a valid amount of NMC steps (NR_NMC_STEPS {INTEGER}).")
130 r_val=nmc_init_acc_prob)
131 IF (nmc_init_acc_prob <= 0.0_dp)
THEN
132 CALL cp_abort(__location__, &
133 "Please select a valid initial acceptance probability (>0.0) "// &
141 nmc_prob_sum = 0.0_dp
142 DO i_rep = 1, n_nmc_items
145 nmc_prob_sum = nmc_prob_sum + mv_prob
150 mv_prob_sum = mv_prob_sum + nmc_prob
152 IF (n_items + n_nmc_items > 0)
THEN
156 IF (mv_prob_sum <= 0.0)
THEN
157 CALL cp_abort(__location__, &
158 "The probabilities to perform the moves are "// &
159 "in total less equal 0")
163 DO i_tmp = 1, n_items + n_nmc_items
165 IF (i_tmp > n_items)
THEN
166 i_rep = i_tmp - n_items
170 nmc_prob/real(mv_prob_sum, kind=
dp)
175 mv_prob_sum = nmc_prob_sum
178 move_types => tmc_params%nmc_move_types
184 move_types => tmc_params%move_types
188 c_val=inp_kind_name, i_rep_section=i_rep)
195 IF (mv_prob < 0.0_dp)
THEN
196 CALL cp_abort(__location__, &
197 "Please select a valid move probability (>0.0) "// &
198 "for the move type "//inp_kind_name)
202 IF (init_acc_prob < 0.0_dp)
THEN
203 CALL cp_abort(__location__, &
204 "Please select a valid initial acceptance probability (>0.0) "// &
205 "for the move type "//inp_kind_name)
208 SELECT CASE (inp_kind_name)
210 CASE (
"ATOM_TRANS",
"MOL_TRANS")
211 SELECT CASE (inp_kind_name)
217 cpabort(
"move type is not defined in the translation types")
220 SELECT CASE (tmc_params%task_type)
222 delta_x = delta_x/au2a
226 cpabort(
"move type atom / mol trans is not defined for this TMC run type")
232 SELECT CASE (tmc_params%task_type)
234 delta_x = delta_x*
pi/180.0_dp
236 cpabort(
"move type MOL_ROT is not defined for this TMC run type")
239 CASE (
"PROT_REORDER")
246 delta_x = delta_x*
pi/180.0_dp
247 tmc_params%print_forces = .true.
253 IF (tmc_params%nr_temp <= 1)
THEN
256 CALL cp_warn(__location__, &
257 "Configurational swap disabled, because "// &
258 "Parallel Tempering requires more than one temperature.")
264 IF (tmc_params%pressure >= 0.0_dp)
THEN
265 delta_x = delta_x/au2a
266 tmc_params%print_cell = .true.
268 CALL cp_warn(__location__, &
269 "no valid pressure defined, but volume move defined. "// &
270 "Consequently, the volume move is disabled.")
281 IF (n_rep_val > 0)
THEN
282 ALLOCATE (move_types%atom_lists(n_rep_val))
285 i_rep_section=i_rep, i_rep_val=i, &
286 c_vals=move_types%atom_lists(i)%atoms)
287 IF (
SIZE(move_types%atom_lists(i)%atoms) <= 1)
THEN
288 cpabort(
"ATOM_SWAP requires minimum two atom kinds selected. ")
295 init_acc_prob = 0.5_dp
297 cpabort(
"A unknown move type is selected: "//inp_kind_name)
300 IF (delta_x < 0.0_dp)
THEN
301 CALL cp_abort(__location__, &
302 "Please select a valid move size (>0.0) "// &
303 "for the move type "//inp_kind_name)
306 IF (move_types%mv_weight(ind) > 0.0)
THEN
307 cpabort(
"TMC: Each move type can be set only once. ")
311 move_types%mv_size(ind, :) = delta_x
313 move_types%mv_weight(ind) = mv_prob/mv_prob_sum
315 move_types%acc_prob(ind, :) = init_acc_prob
318 cpabort(
"No move type selected, please select at least one.")
320 mv_prob_sum = sum(tmc_params%move_types%mv_weight(:))
322 cpassert(abs(mv_prob_sum - 1.0_dp) < 0.01_dp)
323 IF (
ASSOCIATED(tmc_params%nmc_move_types))
THEN
324 mv_prob_sum = sum(tmc_params%nmc_move_types%mv_weight(:))
325 cpassert(abs(mv_prob_sum - 1.0_dp) < 10*epsilon(1.0_dp))
443 CHARACTER(LEN=10) :: c_t
444 CHARACTER(LEN=50) :: fmt_c, fmt_i, fmt_r
445 CHARACTER(LEN=500) :: c_a, c_b, c_c, c_d, c_e, c_tit, c_tmp
446 INTEGER :: column_size, move, nr_nmc_moves, temper, &
448 LOGICAL :: subbox_out, type_title
453 c_a =
""; c_b =
""; c_c =
""
454 c_d =
""; c_e =
""; c_tit =
""
458 cpassert(file_io > 0)
459 cpassert(
ASSOCIATED(tmc_params%move_types))
463 IF (.NOT. init .AND. &
465 any(tmc_params%sub_box_size > 0.0_dp)) subbox_out = .true.
468 WRITE (fmt_c,
'("(A,1X,A", I0, ")")') column_size
469 WRITE (fmt_i,
'("(A,1X,I", I0, ")")') column_size
470 WRITE (fmt_r,
'("(A,1X,F", I0, ".3)")') column_size
475 IF (
ASSOCIATED(tmc_params%nmc_move_types))
THEN
476 nr_nmc_moves =
SIZE(tmc_params%nmc_move_types%mv_weight(1:))
479 temp_loop:
DO temper = 1, tmc_params%nr_temp
480 c_tit =
""; c_a =
""; c_b =
""; c_c =
""
481 IF (init .AND. temper > 1)
EXIT temp_loop
482 WRITE (c_t,
"(F10.2)") tmc_params%Temp(temper)
483 typ_loop:
DO move = 0,
SIZE(tmc_params%move_types%mv_weight) + nr_nmc_moves
485 IF (move <=
SIZE(tmc_params%move_types%mv_weight))
THEN
487 move_types => tmc_params%move_types
489 typ = move -
SIZE(tmc_params%move_types%mv_weight)
490 move_types => tmc_params%nmc_move_types
495 IF (type_title)
WRITE (c_tit, trim(fmt_c))
" type temperature |"
496 IF (init)
WRITE (c_b, trim(fmt_c))
" I I |"
497 IF (init)
WRITE (c_c, trim(fmt_c))
" V V |"
498 IF (.NOT. init)
WRITE (c_a, trim(fmt_c))
"probs T="//c_t//
" |"
499 IF (.NOT. init)
WRITE (c_b, trim(fmt_c))
"counts T="//c_t//
" |"
500 IF (.NOT. init)
WRITE (c_c, trim(fmt_c))
"nr_acc T="//c_t//
" |"
502 WRITE (c_d, trim(fmt_c))
"sb_acc T="//c_t//
" |"
503 WRITE (c_e, trim(fmt_c))
"sb_cou T="//c_t//
" |"
508 WRITE (c_tit, trim(fmt_c)) trim(c_tmp),
" trajec"
512 WRITE (c_b, trim(fmt_c)) trim(c_tmp),
" weight->"
516 WRITE (c_c, trim(fmt_c)) trim(c_tmp),
" size ->"
520 WRITE (c_a, trim(fmt_r)) trim(c_tmp), &
521 move_types%acc_prob(typ, temper)
525 WRITE (c_b, trim(fmt_i)) trim(c_tmp), &
526 move_types%mv_count(typ, temper)
530 WRITE (c_c, trim(fmt_i)) trim(c_tmp), &
531 move_types%acc_count(typ, temper)
535 WRITE (c_d, trim(fmt_c)) trim(c_tmp),
"."
537 WRITE (c_e, trim(fmt_c)) trim(c_tmp),
"."
541 IF (move_types%mv_weight(typ) > 0.0_dp)
THEN
545 WRITE (c_b, trim(fmt_r)) trim(c_tmp), move_types%mv_weight(typ)
549 temper == tmc_params%nr_temp)
THEN
552 WRITE (c_a, trim(fmt_c)) trim(c_tmp),
"---"
557 WRITE (c_a, trim(fmt_r)) trim(c_tmp), move_types%acc_prob(typ, temper)
562 WRITE (c_b, trim(fmt_i)) trim(c_tmp), move_types%mv_count(typ, temper)
566 WRITE (c_c, trim(fmt_i)) trim(c_tmp), move_types%acc_count(typ, temper)
570 IF (move >
SIZE(tmc_params%move_types%mv_weight))
THEN
572 WRITE (c_d, trim(fmt_r)) trim(c_tmp), &
573 move_types%subbox_acc_count(typ, temper)/ &
574 REAL(max(1, move_types%subbox_count(typ, temper)), kind=
dp)
576 WRITE (c_e, trim(fmt_i)) trim(c_tmp), &
577 move_types%subbox_count(typ, temper)
580 WRITE (c_d, trim(fmt_c)) trim(c_tmp),
"-"
582 WRITE (c_e, trim(fmt_c)) trim(c_tmp),
"-"
590 WRITE (c_tit, trim(fmt_c)) trim(c_tmp),
"atom trans."
594 WRITE (c_c, trim(fmt_r)) trim(c_tmp), &
595 move_types%mv_size(typ, temper)*au2a
600 WRITE (c_tit, trim(fmt_c)) trim(c_tmp),
"mol trans"
604 WRITE (c_c, trim(fmt_r)) trim(c_tmp), &
605 move_types%mv_size(typ, temper)*au2a
610 WRITE (c_tit, trim(fmt_c)) trim(c_tmp),
"mol rot"
614 WRITE (c_c, trim(fmt_r)) trim(c_tmp), &
615 move_types%mv_size(typ, temper)/(
pi/180.0_dp)
618 cpwarn(
"md_time_step and nr md_steps not implemented...")
631 WRITE (c_tit, trim(fmt_c)) trim(c_tmp),
"H-Reorder"
635 WRITE (c_c, trim(fmt_c)) trim(c_tmp),
"XXX"
640 WRITE (c_tit, trim(fmt_c)) trim(c_tmp),
"PT(swap)"
644 WRITE (c_c, trim(fmt_c)) trim(c_tmp),
"XXX"
649 WRITE (c_tit, trim(fmt_c)) trim(c_tmp),
"NMC:"
653 WRITE (c_c, trim(fmt_i)) trim(c_tmp), &
654 int(move_types%mv_size(typ, temper))
659 WRITE (c_tit, trim(fmt_c)) trim(c_tmp),
"volume"
663 WRITE (c_c, trim(fmt_r)) trim(c_tmp), &
664 move_types%mv_size(typ, temper)*au2a
669 WRITE (c_tit, trim(fmt_c)) trim(c_tmp),
"atom swap"
673 WRITE (c_c, trim(fmt_c)) trim(c_tmp),
"XXX"
678 WRITE (c_tit, trim(fmt_c)) trim(c_tmp),
"gauss adap"
682 WRITE (c_c, trim(fmt_r)) trim(c_tmp), &
683 move_types%mv_size(typ, temper)
686 CALL cp_warn(__location__, &
687 "unknown move type "//
cp_to_string(typ)//
" with weight"// &
693 IF (init)
WRITE (unit=file_io, fmt=
"(/,T2,A)") repeat(
"-", 79)
694 IF (type_title .AND. temper <= 1)
WRITE (file_io, *) trim(c_tit)
695 IF (.NOT. init)
WRITE (file_io, *) trim(c_a)
696 WRITE (file_io, *) trim(c_b)
697 WRITE (file_io, *) trim(c_c)
698 IF (subbox_out)
WRITE (file_io, *) trim(c_d)
699 IF (subbox_out)
WRITE (file_io, *) trim(c_e)
700 IF (init)
WRITE (unit=file_io, fmt=
"(/,T2,A)") repeat(
"-", 79)
716 SUBROUTINE prob_update(move_types, pt_el, elem, acc, subbox, prob_opt)
719 TYPE(
tree_type),
OPTIONAL,
POINTER :: elem
720 LOGICAL,
INTENT(IN),
OPTIONAL :: acc, subbox
721 LOGICAL,
INTENT(IN) :: prob_opt
723 CHARACTER(LEN=*),
PARAMETER :: routinen =
'prob_update'
725 INTEGER :: change_res, change_sb_type, change_type, &
726 conf_moved, handle, mv_type
728 cpassert(
ASSOCIATED(move_types))
729 cpassert(.NOT. (
PRESENT(pt_el) .AND.
PRESENT(subbox)))
732 CALL timeset(routinen, handle)
741 IF (
PRESENT(pt_el))
THEN
742 cpassert(
ASSOCIATED(pt_el))
743 conf_moved = pt_el%mv_conf
744 SELECT CASE (pt_el%stat)
748 IF (pt_el%swaped)
THEN
755 IF (pt_el%swaped)
THEN
760 CALL cp_abort(__location__, &
766 IF (
PRESENT(elem))
THEN
767 cpassert(
ASSOCIATED(elem))
769 conf_moved = elem%temp_created
770 mv_type = elem%move_type
772 cpassert(
PRESENT(acc))
773 IF (
PRESENT(subbox))
THEN
776 move_types%subbox_acc_count(mv_type, conf_moved) = move_types%subbox_acc_count(mv_type, conf_moved) + 1
778 move_types%subbox_count(mv_type, conf_moved) = move_types%subbox_count(mv_type, conf_moved) + 1
796 IF (change_type > 0)
THEN
797 move_types%acc_count(mv_type, conf_moved) = move_types%acc_count(mv_type, conf_moved) + 1
801 IF (change_res > 0)
THEN
802 move_types%acc_count(0, conf_moved) = move_types%acc_count(0, conf_moved) + 1
805 IF (conf_moved > 0) move_types%mv_count(0, conf_moved) = move_types%mv_count(0, conf_moved) + abs(change_res)
806 IF (mv_type >= 0 .AND. conf_moved > 0)
THEN
807 move_types%mv_count(mv_type, conf_moved) = move_types%mv_count(mv_type, conf_moved) + abs(change_type)
811 WHERE (move_types%mv_count > 0) &
812 move_types%acc_prob(:, :) = move_types%acc_count(:, :)/real(move_types%mv_count(:, :), kind=
dp)
815 CALL timestop(handle)
828 SUBROUTINE add_mv_prob(move_types, prob_opt, mv_counter, acc_counter, &
829 subbox_counter, subbox_acc_counter)
832 INTEGER,
DIMENSION(:, :),
OPTIONAL :: mv_counter, acc_counter, subbox_counter, &
835 cpassert(
ASSOCIATED(move_types))
836 cpassert(
PRESENT(mv_counter) .OR.
PRESENT(subbox_counter))
838 IF (
PRESENT(mv_counter))
THEN
839 cpassert(
PRESENT(acc_counter))
840 move_types%mv_count(:, :) = move_types%mv_count(:, :) + mv_counter(:, :)
841 move_types%acc_count(:, :) = move_types%acc_count(:, :) + acc_counter(:, :)
843 WHERE (move_types%mv_count > 0) &
844 move_types%acc_prob(:, :) = move_types%acc_count(:, :)/real(move_types%mv_count(:, :), kind=
dp)
848 IF (
PRESENT(subbox_counter))
THEN
849 cpassert(
PRESENT(subbox_acc_counter))
850 move_types%subbox_count(:, :) = move_types%subbox_count(:, :) + subbox_counter(:, :)
851 move_types%subbox_acc_count(:, :) = move_types%subbox_acc_count(:, :) + subbox_acc_counter(:, :)