77#include "../base/base_uses.f90"
83 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'tmc_setup'
97 SUBROUTINE do_tmc(input_declaration, root_section, para_env, globenv)
103 CHARACTER(LEN=*),
PARAMETER :: routinen =
'do_tmc'
105 INTEGER :: bcast_output_unit, handle, i, ierr, &
107 LOGICAL :: init_rng, success
108 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: init_rng_seed
116 CALL timeset(routinen, handle)
120 NULLIFY (logger, logger_sub, tmc_env, tmc_ana_env_list)
125 IF (output_unit > 0)
THEN
132 WRITE (unit=output_unit, fmt=
"(/,T2,A)") repeat(
"-", 79)
133 WRITE (unit=output_unit, fmt=
"(/,T2,A)")
"The TMC output files are:"
134 WRITE (unit=output_unit, fmt=
"(/,T2,A)") &
136 WRITE (unit=output_unit, fmt=
"(/,T2,A)") &
138 WRITE (unit=output_unit, fmt=
"(/,T2,A)") &
140 WRITE (unit=output_unit, fmt=
"(/,T2,A)") repeat(
"-", 79)
142 bcast_output_unit = output_unit
143 CALL para_env%bcast(bcast_output_unit)
147 CALL tmc_preread_input(root_section, tmc_env)
148 CALL tmc_redistributing_cores(tmc_env%tmc_comp_set, para_env, &
149 ana_on_the_fly=tmc_env%tmc_comp_set%ana_on_the_fly, &
154 IF (tmc_env%tmc_comp_set%group_nr == 0)
THEN
156 ELSE IF (tmc_env%tmc_comp_set%group_nr /= 0)
THEN
160 CALL tmc_read_input(root_section, tmc_env)
165 IF (tmc_env%tmc_comp_set%group_nr == 0)
THEN
166 IF (tmc_env%m_env%rnd_init > 0)
THEN
168 ALLOCATE (init_rng_seed(3, 2))
169 init_rng_seed(:, :) = &
170 reshape([tmc_env%m_env%rnd_init*42.0_dp, &
171 tmc_env%m_env%rnd_init*54.0_dp, &
172 tmc_env%m_env%rnd_init*63.0_dp, &
173 tmc_env%m_env%rnd_init*98.0_dp, &
174 tmc_env%m_env%rnd_init*10.0_dp, &
175 tmc_env%m_env%rnd_init*2.0_dp], &
178 name=
"TMC_deterministic_rng_stream", &
179 seed=init_rng_seed(:, :), &
181 DEALLOCATE (init_rng_seed)
186 name=
"TMC_rng_stream", &
192 IF (tmc_env%tmc_comp_set%group_nr == 0)
THEN
194 CALL cp_logger_create(logger_sub, para_env=tmc_env%tmc_comp_set%para_env_m_only, &
206 file_action=
"WRITE", file_position=
"APPEND", &
207 unit_number=tmc_env%m_env%io_unit)
211 CALL tmc_print_params(tmc_env)
213 tmc_params=tmc_env%params)
216 IF (bcast_output_unit /= tmc_env%m_env%io_unit)
THEN
217 CALL close_file(unit_number=tmc_env%m_env%io_unit)
224 ELSE IF (tmc_env%tmc_comp_set%group_nr > 0)
THEN
227 CALL cp_logger_create(logger_sub, para_env=tmc_env%tmc_comp_set%para_env_sub_group, &
229 CALL cp_logger_set(logger_sub, local_filename=
"tmc_localLog")
234 IF (tmc_env%tmc_comp_set%group_nr <= tmc_env%tmc_comp_set%group_ener_nr)
THEN
236 input_declaration=input_declaration, &
237 input_path=tmc_env%params%energy_inp_file, &
238 mpi_comm=tmc_env%tmc_comp_set%para_env_sub_group, &
240 ivalue=tmc_env%tmc_comp_set%group_nr)), &
243 cpabort(
"creating force env result in error "//
cp_to_string(ierr))
247 IF (tmc_env%params%NMC_inp_file /=
"" .AND. &
248 (tmc_env%tmc_comp_set%group_cc_nr == 0 .OR. &
249 tmc_env%tmc_comp_set%group_nr > tmc_env%tmc_comp_set%group_ener_nr))
THEN
251 input_declaration=input_declaration, &
252 input_path=tmc_env%params%NMC_inp_file, &
253 mpi_comm=tmc_env%tmc_comp_set%para_env_sub_group, &
255 ivalue=tmc_env%tmc_comp_set%group_nr)), &
258 cpabort(
"creating approx force env result in error "//
cp_to_string(ierr))
263 IF (tmc_env%w_env%env_id_ener > 0)
THEN
266 IF (tmc_env%w_env%env_id_approx > 0)
THEN
274 ELSE IF (
ASSOCIATED(tmc_env%tmc_comp_set%para_env_m_ana))
THEN
278 CALL cp_logger_create(logger_sub, para_env=tmc_env%tmc_comp_set%para_env_m_ana, &
281 CALL cp_logger_set(logger_sub, local_filename=
"tmc_ana_localLog")
290 file_action=
"WRITE", file_position=
"APPEND", &
291 unit_number=output_unit)
295 ALLOCATE (tmc_ana_env_list(tmc_env%params%nr_temp))
297 DO i = 1, tmc_env%params%nr_temp
299 tmc_ana_env_list(i)%temp%io_unit = output_unit
301 CALL do_tmc_worker(tmc_env=tmc_env, ana_list=tmc_ana_env_list)
302 DO i = 1, tmc_env%params%nr_temp
303 IF (
ASSOCIATED(tmc_ana_env_list(i)%temp%last_elem))
THEN
308 DEALLOCATE (tmc_ana_env_list)
309 IF (bcast_output_unit /= output_unit)
THEN
310 CALL close_file(unit_number=tmc_env%m_env%io_unit)
318 DEALLOCATE (tmc_env%rng_stream)
324 IF (tmc_env%tmc_comp_set%group_nr == 0)
THEN
326 ELSE IF (tmc_env%tmc_comp_set%group_nr /= 0)
THEN
331 IF (tmc_env%params%print_test_output)
THEN
332 WRITE (output_unit, *)
"TMC|NOTenoughProcessorsX= -999"
333 WRITE (output_unit, *)
"TMC|NOTcalculatedTotal energy: -999"
340 CALL timestop(handle)
357 CHARACTER(LEN=*),
PARAMETER :: routinen =
'do_analyze_files'
359 INTEGER :: dir_ind, handle, nr_dim, output_unit, &
366 NULLIFY (ana_list, tmc_env, elem, logger)
369 CALL timeset(routinen, handle)
374 ALLOCATE (tmc_env%tmc_comp_set%para_env_m_ana)
375 CALL tmc_env%tmc_comp_set%para_env_m_ana%from_split(para_env, para_env%mepos, 0)
376 IF (para_env%num_pe /= 1)
THEN
377 cpwarn(
"just one out of "//
cp_to_string(para_env%num_pe)//
"cores is used ")
380 IF (para_env%mepos == 0)
THEN
384 cpassert(output_unit > 0)
389 CALL tmc_read_ana_files_input(input_declaration=input_declaration, &
390 input=root_section, ana_list=ana_list, &
391 elem=elem, tmc_env=tmc_env)
392 nr_dim =
SIZE(elem%pos)
395 cpassert(
SIZE(ana_list) > 0)
398 IF (tmc_env%params%print_test_output)
THEN
399 WRITE (output_unit, *)
"TMC|ANAtestOutputInitX= -999"
403 DO temp = 1,
SIZE(ana_list)
405 ana_list(temp)%temp%io_unit = output_unit
406 CALL analysis_init(ana_env=ana_list(temp)%temp, nr_dim=nr_dim)
408 IF (ana_list(temp)%temp%costum_dip_file_name /= &
410 tmc_env%params%print_dipole = .true.
413 IF (.NOT.
ASSOCIATED(elem))
THEN
415 next_el=elem, nr_dim=nr_dim)
419 IF (.NOT.
ASSOCIATED(elem) .AND. .NOT.
ASSOCIATED(ana_list(temp)%temp%last_elem))
THEN
420 cpabort(
"uncorrect initialization of the initial configuration")
423 DO dir_ind = 1,
SIZE(ana_list(temp)%temp%dirs)
424 WRITE (output_unit, fmt=
'(T2,A,"| ",A,T41,A40)')
"TMC_ANA", &
425 "read directory", trim(ana_list(temp)%temp%dirs(dir_ind))
427 start_id=ana_list(temp)%temp%from_elem, &
428 end_id=ana_list(temp)%temp%to_elem, &
430 ana_env=ana_list(temp)%temp, &
431 tmc_params=tmc_env%params)
434 IF (dir_ind <
SIZE(ana_list(temp)%temp%dirs) .AND. &
435 ASSOCIATED(ana_list(temp)%temp%last_elem))
THEN
438 IF (
ASSOCIATED(ana_list(temp)%temp%last_elem))
THEN
439 ana_list(temp)%temp%conf_offset = ana_list(temp)%temp%conf_offset &
440 + ana_list(temp)%temp%last_elem%nr
447 IF (
ASSOCIATED(ana_list(temp)%temp%last_elem))
THEN
450 IF (
ASSOCIATED(ana_list(temp)%temp%last_elem))
THEN
453 IF (
ASSOCIATED(elem))
THEN
457 IF (
ASSOCIATED(ana_list(temp)%temp%last_elem))
THEN
464 DEALLOCATE (ana_list)
469 CALL timestop(handle)
481 SUBROUTINE tmc_read_ana_files_input(input_declaration, input, ana_list, elem, tmc_env)
488 CHARACTER(len=default_string_length), &
489 DIMENSION(:),
POINTER :: directories
490 INTEGER :: env_id, ierr, nr_temp, t_act
492 REAL(kind=
dp) :: tmax, tmin
493 REAL(kind=
dp),
DIMENSION(:),
POINTER :: inp_temp, temps
496 NULLIFY (tmc_section, inp_temp, temps)
497 cpassert(
ASSOCIATED(input))
498 cpassert(.NOT.
ASSOCIATED(ana_list))
499 cpassert(.NOT.
ASSOCIATED(elem))
500 cpassert(
ASSOCIATED(tmc_env))
504 CALL section_vals_val_get(tmc_section,
"PRINT_TEST_OUTPUT", l_val=tmc_env%params%print_test_output)
511 c_val=tmc_env%params%energy_inp_file)
516 IF ((nr_temp > 1) .AND. (
SIZE(inp_temp) /= 2))
THEN
517 cpabort(
"specify each temperature, skip keyword NR_TEMPERATURE")
519 IF (nr_temp == 1)
THEN
520 nr_temp =
SIZE(inp_temp)
521 ALLOCATE (temps(nr_temp))
522 temps(:) = inp_temp(:)
526 ALLOCATE (temps(nr_temp))
528 DO t_act = 2,
SIZE(temps)
529 temps(t_act) = temps(t_act - 1) + (tmax - tmin)/(
SIZE(temps) - 1.0_dp)
531 IF (any(temps < 0.0_dp))
THEN
532 CALL cp_abort(__location__,
"The temperatures are negative. Should be specified using "// &
533 "TEMPERATURE {T_min} {T_max} and NR_TEMPERATURE {#temperatures}")
542 input_declaration=input_declaration, &
543 input_path=tmc_env%params%energy_inp_file, &
544 mpi_comm=tmc_env%tmc_comp_set%para_env_m_ana, &
545 output_path=
"tmc_ana.out", ierr=ierr)
549 cell=tmc_env%params%cell)
552 ALLOCATE (ana_list(
SIZE(temps)))
553 DO t_act = 1,
SIZE(temps)
554 ana_list(t_act)%temp => null()
556 ana_list(t_act)%temp%temperature = temps(t_act)
557 ALLOCATE (ana_list(t_act)%temp%dirs(
SIZE(directories)))
558 ana_list(t_act)%temp%dirs(:) = directories(:)
559 ana_list(t_act)%temp%cell => tmc_env%params%cell
560 ana_list(t_act)%temp%atoms => tmc_env%params%atoms
561 ana_list(t_act)%temp%print_test_output = tmc_env%params%print_test_output
564 c_val=ana_list(t_act)%temp%costum_pos_file_name)
566 c_val=ana_list(t_act)%temp%costum_dip_file_name)
568 c_val=ana_list(t_act)%temp%costum_cell_file_name)
573 END SUBROUTINE tmc_read_ana_files_input
581 SUBROUTINE tmc_preread_input(input, tmc_env)
585 CHARACTER(LEN=default_path_length) :: c_tmp
587 LOGICAL :: explicit_key, flag
588 REAL(kind=
dp) :: tmax, tmin
589 REAL(kind=
dp),
DIMENSION(:),
POINTER :: inp_temp
592 NULLIFY (tmc_section, inp_temp)
594 cpassert(
ASSOCIATED(input))
596 tmc_env%tmc_comp_set%ana_on_the_fly = 0
600 tmc_env%tmc_comp_set%ana_on_the_fly = 1
607 CALL section_vals_val_get(tmc_section,
"PRINT_TEST_OUTPUT", l_val=tmc_env%params%print_test_output)
609 cpassert(
ASSOCIATED(tmc_env%tmc_comp_set))
611 CALL section_vals_val_get(tmc_section,
"GROUP_ENERGY_SIZE", i_val=tmc_env%tmc_comp_set%group_ener_size)
612 CALL section_vals_val_get(tmc_section,
"GROUP_ENERGY_NR", i_val=tmc_env%tmc_comp_set%group_ener_nr)
613 CALL section_vals_val_get(tmc_section,
"GROUP_CC_SIZE", i_val=tmc_env%tmc_comp_set%group_cc_size)
615 IF (tmc_env%tmc_comp_set%ana_on_the_fly > 0)
THEN
616 tmc_env%tmc_comp_set%ana_on_the_fly = itmp
618 IF (tmc_env%tmc_comp_set%ana_on_the_fly > 1)
THEN
619 CALL cp_abort(__location__, &
620 "analysing on the fly is up to now not supported for multiple cores. "// &
621 "Restart file witing for this case and temperature "// &
622 "distribution has to be solved.!.")
624 CALL section_vals_val_get(tmc_section,
"RESULT_LIST_IN_MEMORY", l_val=tmc_env%params%USE_REDUCED_TREE)
626 tmc_env%params%USE_REDUCED_TREE = .NOT. tmc_env%params%USE_REDUCED_TREE
630 CALL section_vals_val_get(tmc_section,
"NMC_MOVES%NMC_FILE_NAME", c_val=tmc_env%params%NMC_inp_file)
633 cpabort(
"no or a valid NMC input file has to be specified ")
634 ELSE IF (tmc_env%params%NMC_inp_file ==
"")
THEN
636 IF (tmc_env%tmc_comp_set%group_cc_size > 0)
THEN
637 CALL cp_warn(__location__, &
638 "The configurational groups are deactivated, "// &
639 "because no approximated energy input is specified.")
641 tmc_env%tmc_comp_set%group_cc_size = 0
644 INQUIRE (file=trim(tmc_env%params%NMC_inp_file), exist=flag, iostat=itmp)
645 IF (.NOT. flag .OR. itmp /= 0)
THEN
646 cpabort(
"a valid NMC input file has to be specified")
651 IF (tmc_env%params%nr_temp > 1 .AND.
SIZE(inp_temp) /= 2)
THEN
652 cpabort(
"specify each temperature, skip keyword NR_TEMPERATURE")
654 IF (tmc_env%params%nr_temp == 1)
THEN
655 tmc_env%params%nr_temp =
SIZE(inp_temp)
656 ALLOCATE (tmc_env%params%Temp(tmc_env%params%nr_temp))
657 tmc_env%params%Temp(:) = inp_temp(:)
661 ALLOCATE (tmc_env%params%Temp(tmc_env%params%nr_temp))
662 tmc_env%params%Temp(1) = tmin
663 DO itmp = 2,
SIZE(tmc_env%params%Temp)
664 tmc_env%params%Temp(itmp) = tmc_env%params%Temp(itmp - 1) + (tmax - tmin)/(
SIZE(tmc_env%params%Temp) - 1.0_dp)
666 IF (any(tmc_env%params%Temp < 0.0_dp))
THEN
667 CALL cp_abort(__location__,
"The temperatures are negative. Should be specified using "// &
668 "TEMPERATURE {T_min} {T_max} and NR_TEMPERATURE {#temperatures}")
673 IF (explicit_key)
THEN
675 SELECT CASE (trim(c_tmp))
681 CALL cp_warn(__location__, &
682 'unknown TMC task type "'//trim(c_tmp)//
'" specified. '// &
688 END SUBROUTINE tmc_preread_input
696 SUBROUTINE tmc_read_input(input, tmc_env)
701 LOGICAL :: explicit, flag
702 REAL(kind=
dp) :: r_tmp
703 REAL(kind=
dp),
DIMENSION(:),
POINTER :: r_arr_tmp
706 NULLIFY (tmc_section)
708 cpassert(
ASSOCIATED(input))
715 IF (tmc_env%tmc_comp_set%group_nr == 0)
THEN
716 cpassert(
ASSOCIATED(tmc_env%m_env))
719 walltime=tmc_env%m_env%walltime)
727 INQUIRE (file=tmc_env%m_env%restart_in_file_name, exist=flag)
728 IF (.NOT. flag) tmc_env%m_env%restart_in_file_name =
""
732 IF (tmc_env%m_env%restart_out_step == -9)
THEN
734 tmc_env%m_env%restart_out_step = huge(tmc_env%m_env%restart_out_step)
736 IF (tmc_env%m_env%restart_out_step < 0)
THEN
737 CALL cp_abort(__location__, &
738 "Please specify a valid value for the frequency "// &
739 "to write restart files (RESTART_OUT #). "// &
740 "# > 0 to define the amount of Markov chain elements in between, "// &
741 "or 0 to deactivate the restart file writing. "// &
742 "Lonely keyword writes restart file only at the end of the run.")
745 CALL section_vals_val_get(tmc_section,
"INFO_OUT_STEP_SIZE", i_val=tmc_env%m_env%info_out_step_size)
747 CALL section_vals_val_get(tmc_section,
"ALL_CONF_FILE_NAME", c_val=tmc_env%params%all_conf_file_name)
748 IF (tmc_env%params%dot_file_name /=
"") tmc_env%params%DRAW_TREE = .true.
751 ELSE IF (tmc_env%tmc_comp_set%group_nr /= 0)
THEN
752 cpassert(
ASSOCIATED(tmc_env%w_env))
758 CALL section_vals_val_get(tmc_section,
"ENERGY_FILE_NAME", c_val=tmc_env%params%energy_inp_file)
760 IF (tmc_env%params%energy_inp_file ==
"")
THEN
761 cpabort(
"a valid exact energy input file has to be specified ")
764 INQUIRE (file=trim(tmc_env%params%energy_inp_file), exist=flag, iostat=itmp)
765 IF (.NOT. flag .OR. itmp /= 0)
THEN
766 CALL cp_abort(__location__,
"a valid exact energy input file has to be specified, "// &
767 trim(tmc_env%params%energy_inp_file)//
" does not exist.")
774 tmc_env%params%pressure = tmc_env%params%pressure/au2bar
775 CALL section_vals_val_get(tmc_section,
"MOVE_CENTER_OF_MASS", l_val=tmc_env%params%mv_cen_of_mass)
778 IF (
SIZE(r_arr_tmp) > 1)
THEN
779 IF (
SIZE(r_arr_tmp) /= tmc_env%params%dim_per_elem)
THEN
780 cpabort(
"The entered sub box sizes does not fit in number of dimensions.")
782 IF (any(r_arr_tmp <= 0.0_dp))
THEN
783 cpabort(
"The entered sub box lengths should be greater than 0.")
785 DO itmp = 1,
SIZE(tmc_env%params%sub_box_size)
786 tmc_env%params%sub_box_size(itmp) = r_arr_tmp(itmp)/au2a
788 ELSE IF (r_arr_tmp(1) > 0.0_dp)
THEN
789 r_tmp = r_arr_tmp(1)/au2a
790 tmc_env%params%sub_box_size(:) = r_tmp
795 tmc_section=tmc_section)
797 CALL section_vals_val_get(tmc_section,
"ESIMATE_ACC_PROB", l_val=tmc_env%params%esimate_acc_prob)
798 CALL section_vals_val_get(tmc_section,
"SPECULATIVE_CANCELING", l_val=tmc_env%params%SPECULATIVE_CANCELING)
799 CALL section_vals_val_get(tmc_section,
"USE_SCF_ENERGY_INFO", l_val=tmc_env%params%use_scf_energy_info)
801 CALL section_vals_val_get(tmc_section,
"PRINT_ONLY_ACC", l_val=tmc_env%params%print_only_diff_conf)
817 END SUBROUTINE tmc_read_input
827 SUBROUTINE tmc_redistributing_cores(tmc_comp_set, para_env, ana_on_the_fly, &
831 INTEGER :: ana_on_the_fly
834 INTEGER :: cc_group, cc_group_rank, master_ana_group, master_ana_rank, &
835 master_first_e_worker_g, master_first_e_worker_r, master_worker_group, &
836 master_worker_rank, my_mpi_undefined, total_used
837 LOGICAL :: flag, master
839 cpassert(
ASSOCIATED(tmc_comp_set))
840 cpassert(
ASSOCIATED(para_env))
844 tmc_comp_set%group_nr = -1
845 my_mpi_undefined = para_env%num_pe + 10000
846 master_worker_group = my_mpi_undefined
847 master_worker_rank = -1
848 cc_group = my_mpi_undefined
850 master_first_e_worker_g = my_mpi_undefined
851 master_first_e_worker_r = -1
852 master_ana_group = my_mpi_undefined
859 IF (para_env%num_pe <= 1)
THEN
860 cpwarn(
"TMC need at least 2 cores (one for master, one for worker)")
864 IF (tmc_comp_set%group_ener_size*tmc_comp_set%group_ener_nr > (para_env%num_pe - 1))
THEN
865 cpwarn(
"The selected energy group size is too huge. ")
868 tmc_comp_set%group_ener_nr = int((para_env%num_pe - 1)/ &
869 REAL(tmc_comp_set%group_ener_size, kind=
dp))
870 IF (tmc_comp_set%group_ener_nr < 1)
THEN
871 cpwarn(
"The selected energy group size is too huge. ")
873 IF (flag) success = .false.
877 tmc_comp_set%group_cc_nr = 0
878 IF (tmc_comp_set%group_cc_size > 0)
THEN
879 tmc_comp_set%group_cc_nr = int((para_env%num_pe - 1 - tmc_comp_set%ana_on_the_fly &
880 - tmc_comp_set%group_ener_size*tmc_comp_set%group_ener_nr)/ &
881 REAL(tmc_comp_set%group_cc_size, kind=
dp))
883 IF (tmc_comp_set%group_cc_nr < 1)
THEN
884 CALL cp_warn(__location__, &
885 "There are not enougth cores left for creating groups for configurational change.")
887 IF (flag) success = .false.
890 total_used = tmc_comp_set%group_ener_size*tmc_comp_set%group_ener_nr + &
891 tmc_comp_set%group_cc_size*tmc_comp_set%group_cc_nr + &
892 tmc_comp_set%ana_on_the_fly
893 IF (para_env%num_pe - 1 > total_used)
THEN
894 cpwarn(
" mpi ranks are unused, but can be used for analysis.")
898 IF (para_env%mepos == para_env%num_pe - 1)
THEN
900 master_worker_group = para_env%num_pe + 3
901 master_worker_rank = 0
902 master_first_e_worker_g = para_env%num_pe + 3
903 master_first_e_worker_r = 0
904 tmc_comp_set%group_nr = 0
905 master_ana_group = para_env%num_pe + 4
909 IF (para_env%mepos < tmc_comp_set%group_ener_size*tmc_comp_set%group_ener_nr)
THEN
910 tmc_comp_set%group_nr = int(para_env%mepos/tmc_comp_set%group_ener_size) + 1
912 IF (
modulo(para_env%mepos, tmc_comp_set%group_ener_size) == 0)
THEN
913 master_worker_group = para_env%num_pe + 3
914 master_worker_rank = tmc_comp_set%group_nr
915 IF (master_worker_rank == 1)
THEN
916 master_first_e_worker_g = para_env%num_pe + 3
917 master_first_e_worker_r = 1
920 cc_group = tmc_comp_set%group_nr
921 cc_group_rank = para_env%mepos - &
922 (tmc_comp_set%group_nr - 1)*tmc_comp_set%group_ener_size
925 ELSE IF (para_env%mepos < (tmc_comp_set%group_ener_size*tmc_comp_set%group_ener_nr + &
926 tmc_comp_set%group_cc_size*tmc_comp_set%group_cc_nr))
THEN
927 cc_group_rank = para_env%mepos - tmc_comp_set%group_ener_size*tmc_comp_set%group_ener_nr
928 tmc_comp_set%group_nr = tmc_comp_set%group_ener_nr + 1 + int(cc_group_rank/tmc_comp_set%group_cc_size)
929 cc_group = tmc_comp_set%group_nr
931 IF (
modulo(cc_group_rank, tmc_comp_set%group_cc_size) == 0)
THEN
932 master_worker_group = para_env%num_pe + 3
933 master_worker_rank = tmc_comp_set%group_nr
936 cc_group_rank =
modulo(cc_group_rank, tmc_comp_set%group_cc_size)
940 IF (para_env%mepos == para_env%num_pe - 2)
THEN
941 tmc_comp_set%group_nr = para_env%mepos - (para_env%num_pe - 1)
942 cpassert(tmc_comp_set%group_nr < 0)
943 IF (para_env%mepos >= para_env%num_pe - 1 - ana_on_the_fly)
THEN
944 master_ana_group = para_env%num_pe + 4
945 master_ana_rank = -tmc_comp_set%group_nr
954 ALLOCATE (tmc_comp_set%para_env_sub_group)
955 CALL tmc_comp_set%para_env_sub_group%from_split(para_env, cc_group, cc_group_rank)
957 IF (cc_group_rank < 0)
THEN
958 CALL tmc_comp_set%para_env_sub_group%free()
959 DEALLOCATE (tmc_comp_set%para_env_sub_group)
963 ALLOCATE (tmc_comp_set%para_env_m_w)
964 CALL tmc_comp_set%para_env_m_w%from_split(para_env, master_worker_group, master_worker_rank)
966 IF (master_worker_rank < 0)
THEN
967 CALL tmc_comp_set%para_env_m_w%free()
968 DEALLOCATE (tmc_comp_set%para_env_m_w)
972 ALLOCATE (tmc_comp_set%para_env_m_first_w)
973 CALL tmc_comp_set%para_env_m_first_w%from_split(para_env, master_first_e_worker_g, master_first_e_worker_r)
975 IF (master_first_e_worker_r < 0)
THEN
976 CALL tmc_comp_set%para_env_m_first_w%free()
977 DEALLOCATE (tmc_comp_set%para_env_m_first_w)
981 ALLOCATE (tmc_comp_set%para_env_m_ana)
982 CALL tmc_comp_set%para_env_m_ana%from_split(para_env, master_ana_group, master_ana_rank)
983 IF (master_ana_rank < 0)
THEN
984 CALL tmc_comp_set%para_env_m_ana%free()
985 DEALLOCATE (tmc_comp_set%para_env_m_ana)
989 master_ana_group = my_mpi_undefined
995 ALLOCATE (tmc_comp_set%para_env_m_only)
996 CALL tmc_comp_set%para_env_m_only%from_split(para_env, master_ana_group, master_ana_rank)
997 IF (master_ana_rank < 0)
THEN
998 CALL tmc_comp_set%para_env_m_only%free()
999 DEALLOCATE (tmc_comp_set%para_env_m_only)
1003 END SUBROUTINE tmc_redistributing_cores
1010 SUBROUTINE tmc_print_params(tmc_env)
1013 CHARACTER(LEN=*),
PARAMETER :: fmt_my =
'(T2,A,"| ",A,T41,A40)', plabel =
"TMC"
1015 CHARACTER(LEN=80) :: c_tmp, fmt_tmp
1018 cpassert(
ASSOCIATED(tmc_env))
1019 cpassert(
ASSOCIATED(tmc_env%tmc_comp_set))
1021 IF (tmc_env%tmc_comp_set%group_nr == 0)
THEN
1022 file_nr = tmc_env%m_env%io_unit
1023 cpassert(
ASSOCIATED(tmc_env%tmc_comp_set%para_env_m_w))
1024 cpassert(
ASSOCIATED(tmc_env%m_env))
1029 WRITE (unit=file_nr, fmt=
"(/,T2,A)") repeat(
"-", 79)
1030 WRITE (unit=file_nr, fmt=
"(T2,A,T80,A)")
"-",
"-"
1031 WRITE (unit=file_nr, fmt=
"(T2,A,T35,A,T80,A)")
"-",
"TMC setting",
"-"
1032 WRITE (unit=file_nr, fmt=
"(T2,A,T80,A)")
"-",
"-"
1033 WRITE (unit=file_nr, fmt=
"(T2,A)") repeat(
"-", 79)
1035 WRITE (unit=file_nr, fmt=
"(T2,A,T35,A,T80,A)")
"-",
"distribution of cores",
"-"
1036 WRITE (file_nr, fmt=fmt_my) plabel,
"number of all working groups ", &
1037 cp_to_string(tmc_env%tmc_comp_set%para_env_m_w%num_pe - 1)
1038 WRITE (file_nr, fmt=fmt_my) plabel,
"number of groups (ener|cc)", &
1039 cp_to_string(tmc_env%tmc_comp_set%group_ener_nr)//
" | "// &
1041 WRITE (file_nr, fmt=fmt_my) plabel,
"cores per group (ener|cc) ", &
1042 cp_to_string(tmc_env%tmc_comp_set%group_ener_size)//
" | "// &
1044 IF (
ASSOCIATED(tmc_env%tmc_comp_set%para_env_m_ana))
THEN
1045 WRITE (file_nr, fmt=fmt_my) plabel,
"Analysis groups ", &
1046 cp_to_string(tmc_env%tmc_comp_set%para_env_m_ana%num_pe - 1)
1048 IF (
SIZE(tmc_env%params%Temp(:)) <= 7)
THEN
1049 WRITE (fmt_tmp, *)
'(T2,A,"| ",A,T25,A56)'
1051 WRITE (c_tmp, fmt=
"(1000F8.2)") tmc_env%params%Temp(:)
1052 WRITE (file_nr, fmt=fmt_tmp) plabel,
"Temperature(s) [K]", trim(c_tmp)
1054 WRITE (file_nr, fmt=
'(A,1000F8.2)')
" "//plabel//
"| Temperature(s) [K]", &
1055 tmc_env%params%Temp(:)
1057 WRITE (file_nr, fmt=fmt_my) plabel,
"# of Monte Carlo Chain elements: ", &
1059 WRITE (file_nr, fmt=fmt_my) plabel,
"exact potential input file:", &
1060 trim(tmc_env%params%energy_inp_file)
1061 IF (tmc_env%params%NMC_inp_file /=
"")
THEN
1062 WRITE (file_nr, fmt=fmt_my) plabel,
"approximate potential input file:", &
1063 trim(tmc_env%params%NMC_inp_file)
1065 IF (any(tmc_env%params%sub_box_size > 0.0_dp))
THEN
1066 WRITE (fmt_tmp, *)
'(T2,A,"| ",A,T25,A56)'
1068 WRITE (c_tmp, fmt=
"(1000F8.2)") tmc_env%params%sub_box_size(:)*au2a
1069 WRITE (file_nr, fmt=fmt_tmp) plabel,
"Sub box size [A]", trim(c_tmp)
1071 IF (tmc_env%params%pressure > 0.0_dp)
THEN
1072 WRITE (file_nr, fmt=fmt_my) plabel,
"Pressure [bar]: ", &
1075 WRITE (file_nr, fmt=fmt_my) plabel,
"Numbers of atoms/molecules moved "
1076 WRITE (file_nr, fmt=fmt_my) plabel,
" within one conf. change", &
1078 WRITE (unit=file_nr, fmt=
"(/,T2,A)") repeat(
"-", 79)
1081 END SUBROUTINE tmc_print_params
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public schonherr2014
Utility routines to open and close files. Tracking of preconnections.
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
subroutine, public close_file(unit_number, file_status, keep_preconnection)
Close an open file given by its logical unit number. Optionally, keep the file and unit preconnected.
various routines to log and control the output. The idea is that decisions about where to log should ...
subroutine, public cp_logger_set(logger, local_filename, global_filename)
sets various attributes of the given logger
subroutine, public cp_rm_default_logger()
the cousin of cp_add_default_logger, decrements the stack, so that the default logger is what it has ...
subroutine, public cp_logger_release(logger)
releases this logger
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
subroutine, public cp_logger_create(logger, para_env, print_level, default_global_unit_nr, default_local_unit_nr, global_filename, local_filename, close_global_unit_on_dealloc, iter_info, close_local_unit_on_dealloc, suffix, template_logger)
initializes a logger
subroutine, public cp_add_default_logger(logger)
adds a default logger. MUST be called before logging occours
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
Sets up and terminates the global environment variables.
subroutine, public cp2k_get_walltime(section, keyword_name, walltime)
reads the Walltime also in format HH:MM:SS
interface to use cp2k as library
recursive subroutine, public destroy_force_env(env_id, ierr, q_finalize)
deallocates the force_env with the given id
recursive subroutine, public create_force_env(new_env_id, input_declaration, input_path, output_path, mpi_comm, output_unit, owns_out_unit, input, ierr, work_dir, initial_variables)
creates a new force environment using the given input, and writing the output to the given output uni...
Define type storing the global information of a run. Keep the amount of stored data small....
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
Machine interface based on Fortran 2003 and POSIX.
integer, parameter, public default_output_unit
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
Interface to the message passing library MPI.
Parallel (pseudo)random number generator (RNG) for multiple streams and substreams of random numbers.
integer, parameter, public uniform
Definition of physical constants:
real(kind=dp), parameter, public angstrom
real(kind=dp), parameter, public bar
module provides variables for the TMC analysis tool
subroutine, public tmc_ana_env_release(tmc_ana)
releases the structure environment for TMC analysis
module analyses element of the TMC tree element structure e.g. density, radial distribution function,...
subroutine, public analysis_restart_read(ana_env, elem)
read analysis restart file
subroutine, public finalize_tmc_analysis(ana_env)
call all the necessarry analysis printing routines
subroutine, public tmc_read_ana_input(tmc_ana_section, tmc_ana)
creates a new para environment for tmc analysis
subroutine, public analyze_file_configurations(start_id, end_id, dir_ind, ana_env, tmc_params)
read the files and analyze the configurations
subroutine, public analysis_init(ana_env, nr_dim)
initialize all the necessarry analysis structures
subroutine, public analysis_restart_print(ana_env)
print analysis restart file
writing and printing the files, trajectory (pos, cell, dipoles) as well as restart files
character(len=default_path_length) function, public expand_file_name_int(file_name, ivalue)
placing an integer at the end of a file name (before the file extension)
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
acceptance ratio handling of the different Monte Carlo Moves types For each move type and each temper...
subroutine, public read_init_move_types(tmc_params, tmc_section)
initialization of the different moves, with sizes and probabilities
subroutine, public finalize_mv_types(tmc_params)
deallocating the module variables
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 Monte Carlo entry point, set up, CPU redistribution and input reading.
subroutine, public do_analyze_files(input_declaration, root_section, para_env)
analyze TMC trajectory files
subroutine, public do_tmc(input_declaration, root_section, para_env, globenv)
tmc_entry point
tree nodes creation, searching, deallocation, references etc.
character(len= *), parameter, public tmc_nmc_worker_out_file_name
character(len= *), parameter, public tmc_master_out_file_name
character(len= *), parameter, public tmc_default_unspecified_name
character(len= *), parameter, public tmc_ana_out_file_name
integer, parameter, public task_type_mc
character(len= *), parameter, public tmc_default_restart_in_file_name
character(len= *), parameter, public tmc_default_restart_out_file_name
character(len= *), parameter, public tmc_energy_worker_out_file_name
integer, parameter, public task_type_ideal_gas
tree nodes creation, deallocation, references etc.
subroutine, public deallocate_sub_tree_node(tree_elem)
deallocates an elements of the subtree element structure
subroutine, public allocate_new_sub_tree_node(tmc_params, next_el, nr_dim)
allocates an elements of the subtree element structure
module handles definition of the tree nodes for the global and the subtrees binary tree parent elemen...
module handles definition of the tree nodes for the global and the subtrees binary tree parent elemen...
subroutine, public tmc_env_release(tmc_env)
releases the structure environment for TMC
subroutine, public tmc_worker_env_create(tmc_env)
creates a new structure environment for TMC master
subroutine, public tmc_master_env_create(tmc_env)
creates a new structure environment for TMC master
subroutine, public tmc_master_env_release(tmc_env)
releases the structure environment for TMC master
subroutine, public tmc_worker_env_release(tmc_env)
releases the structure environment for TMC master
subroutine, public tmc_env_create(tmc_env)
creates a new structure environment for TMC
module contains the worker routine handling the communication and the calculation / creation of the c...
subroutine, public do_tmc_worker(tmc_env, ana_list)
worker get tasks form master and fulfill them
subroutine, public get_initial_conf(tmc_params, init_conf, env_id)
get the initial confuguration (pos,...)
subroutine, public get_atom_kinds_and_cell(env_id, atoms, cell)
get the pointer to the atoms, for easy handling
type of a logger, at the moment it contains just a print level starting at which level it should be l...
contains the initially parsed file and the initial parallel environment
stores all the informations relevant to an mpi environment