(git:ed6f26b)
Loading...
Searching...
No Matches
tmc_setup.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2025 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Tree Monte Carlo entry point, set up, CPU redistribution and
10!> input reading
11!> \par History
12!> 11.2012 created [Mandes Schoenherr]
13!> \author Mandes
14! **************************************************************************************************
15
17 USE bibliography, ONLY: cite_reference,&
19 USE cp_files, ONLY: close_file,&
21 USE cp_log_handling, ONLY: &
29 USE header, ONLY: tmc_ana_header,&
36 USE kinds, ONLY: default_path_length,&
38 dp
39 USE machine, ONLY: default_output_unit,&
42 USE parallel_rng_types, ONLY: uniform,&
44 USE physcon, ONLY: au2a => angstrom,&
45 au2bar => bar
46 USE tmc_analysis, ONLY: analysis_init,&
55 USE tmc_master, ONLY: do_tmc_master
59 USE tmc_stati, ONLY: &
65 USE tmc_tree_types, ONLY: tree_type
66 USE tmc_types, ONLY: tmc_comp_set_type,&
74 USE tmc_worker, ONLY: do_tmc_worker,&
77#include "../base/base_uses.f90"
78
79 IMPLICIT NONE
80
81 PRIVATE
82
83 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'tmc_setup'
84
85 PUBLIC :: do_tmc, do_analyze_files
86
87CONTAINS
88
89! **************************************************************************************************
90!> \brief tmc_entry point
91!> \param input_declaration ...
92!> \param root_section ...
93!> \param para_env ...
94!> \param globenv the global environment for the simulation
95!> \author Mandes 11.2012
96! **************************************************************************************************
97 SUBROUTINE do_tmc(input_declaration, root_section, para_env, globenv)
98 TYPE(section_type), POINTER :: input_declaration
99 TYPE(section_vals_type), POINTER :: root_section
100 TYPE(mp_para_env_type), POINTER :: para_env
101 TYPE(global_environment_type), POINTER :: globenv
102
103 CHARACTER(LEN=*), PARAMETER :: routinen = 'do_tmc'
104
105 INTEGER :: bcast_output_unit, handle, i, ierr, &
106 output_unit
107 LOGICAL :: init_rng, success
108 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: init_rng_seed
109 TYPE(cp_logger_type), POINTER :: logger, logger_sub
110 TYPE(section_vals_type), POINTER :: tmc_ana_section
111 TYPE(tmc_ana_list_type), DIMENSION(:), POINTER :: tmc_ana_env_list
112 TYPE(tmc_env_type), POINTER :: tmc_env
113
114! start the timing
115
116 CALL timeset(routinen, handle)
117
118 CALL cite_reference(schonherr2014)
119
120 NULLIFY (logger, logger_sub, tmc_env, tmc_ana_env_list)
121 logger => cp_get_default_logger()
122 output_unit = cp_logger_get_default_io_unit(logger)
123
124 ! write header, on the 'rank 0' of the global communicator
125 IF (output_unit > 0) THEN
126 CALL tmc_header(output_unit)
127 CALL m_flush(output_unit)
128 END IF
129 ! ugly, we need to know the output unit on source, everywhere, in particular
130 ! the tmc master
131 IF (output_unit .NE. default_output_unit .AND. output_unit .GT. 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)") &
135 trim(tmc_master_out_file_name)//" the TMC master"
136 WRITE (unit=output_unit, fmt="(/,T2,A)") &
137 trim(tmc_energy_worker_out_file_name)//" the worker outputs (energy calculations etc.)"
138 WRITE (unit=output_unit, fmt="(/,T2,A)") &
139 trim(tmc_ana_out_file_name)//" the analysis output"
140 WRITE (unit=output_unit, fmt="(/,T2,A)") repeat("-", 79)
141 END IF
142 bcast_output_unit = output_unit
143 CALL para_env%bcast(bcast_output_unit)
144
145 ! create tmc_env
146 CALL tmc_env_create(tmc_env)
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, &
150 success=success)
151
152 IF (success) THEN
153 ! initialize master and worker environment
154 IF (tmc_env%tmc_comp_set%group_nr .EQ. 0) THEN
155 CALL tmc_master_env_create(tmc_env) ! create master env
156 ELSE IF (tmc_env%tmc_comp_set%group_nr .NE. 0) THEN
157 CALL tmc_worker_env_create(tmc_env) ! create worker env
158 END IF
159
160 CALL tmc_read_input(root_section, tmc_env)
161 !CALL init_move_types(tmc_params=tmc_env%params)
162
163 ! init random number generator: use determistic random numbers
164 init_rng = .true.
165 IF (tmc_env%tmc_comp_set%group_nr .EQ. 0) THEN
166 IF (tmc_env%m_env%rnd_init .GT. 0) THEN
167 init_rng = .false.
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/), &
176 (/3, 2/))
177 tmc_env%rng_stream = rng_stream_type( &
178 name="TMC_deterministic_rng_stream", &
179 seed=init_rng_seed(:, :), &
180 distribution_type=uniform)
181 DEALLOCATE (init_rng_seed)
182 END IF
183 END IF
184 IF (init_rng) THEN
185 tmc_env%rng_stream = rng_stream_type( &
186 name="TMC_rng_stream", &
187 distribution_type=uniform)
188 END IF
189
190 ! start running master and worker routines
191 ! the master
192 IF (tmc_env%tmc_comp_set%group_nr .EQ. 0) THEN
193 !TODO get the correct usage of creating and handling the logger...
194 CALL cp_logger_create(logger_sub, para_env=tmc_env%tmc_comp_set%para_env_m_only, &
195 default_global_unit_nr=default_output_unit, close_global_unit_on_dealloc=.false.)
196 CALL cp_logger_set(logger_sub, local_filename="tmc_main")
197 CALL cp_add_default_logger(logger_sub)
198
199 ! if we're doing output to the screen, keep it there, else this master
200 ! opens a file (not that two different ranks are writing to the
201 ! default_output_unit, we leave it up to mpirun or so to merge stuff
202 IF (bcast_output_unit == default_output_unit) THEN
203 tmc_env%m_env%io_unit = default_output_unit
204 ELSE
205 CALL open_file(file_name=tmc_master_out_file_name, file_status="UNKNOWN", &
206 file_action="WRITE", file_position="APPEND", &
207 unit_number=tmc_env%m_env%io_unit)
208 CALL tmc_header(tmc_env%m_env%io_unit)
209 END IF
210 ! print the intresting parameters and starting values
211 CALL tmc_print_params(tmc_env)
212 CALL print_move_types(init=.true., file_io=tmc_env%m_env%io_unit, &
213 tmc_params=tmc_env%params)
214 CALL do_tmc_master(tmc_env=tmc_env, globenv=globenv) ! start the master routine
215
216 IF (bcast_output_unit .NE. tmc_env%m_env%io_unit) THEN
217 CALL close_file(unit_number=tmc_env%m_env%io_unit)
218 END IF
219
221 CALL cp_logger_release(logger_sub)
222
223 ! the worker groups
224 ELSE IF (tmc_env%tmc_comp_set%group_nr .GT. 0) THEN
225 NULLIFY (logger_sub)
226 ! create separate logger and error handler for each worker
227 CALL cp_logger_create(logger_sub, para_env=tmc_env%tmc_comp_set%para_env_sub_group, &
228 default_global_unit_nr=default_output_unit, close_global_unit_on_dealloc=.false.)
229 CALL cp_logger_set(logger_sub, local_filename="tmc_localLog")
230 CALL cp_add_default_logger(logger_sub)
231 tmc_env%w_env%io_unit = default_output_unit
232
233 ! energy worker
234 IF (tmc_env%tmc_comp_set%group_nr .LE. tmc_env%tmc_comp_set%group_ener_nr) THEN
235 CALL create_force_env(new_env_id=tmc_env%w_env%env_id_ener, &
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, &
239 output_path=trim(expand_file_name_int(file_name=tmc_energy_worker_out_file_name, &
240 ivalue=tmc_env%tmc_comp_set%group_nr)), &
241 ierr=ierr)
242 IF (ierr .NE. 0) &
243 cpabort("creating force env result in error "//cp_to_string(ierr))
244 END IF
245 ! worker for configurational change
246 IF (tmc_env%params%NMC_inp_file .NE. "" .AND. &
247 (tmc_env%tmc_comp_set%group_cc_nr .EQ. 0 .OR. &
248 tmc_env%tmc_comp_set%group_nr .GT. tmc_env%tmc_comp_set%group_ener_nr)) THEN
249 CALL create_force_env(new_env_id=tmc_env%w_env%env_id_approx, &
250 input_declaration=input_declaration, &
251 input_path=tmc_env%params%NMC_inp_file, &
252 mpi_comm=tmc_env%tmc_comp_set%para_env_sub_group, &
253 output_path=trim(expand_file_name_int(file_name=tmc_nmc_worker_out_file_name, &
254 ivalue=tmc_env%tmc_comp_set%group_nr)), &
255 ierr=ierr)
256 IF (ierr .NE. 0) &
257 cpabort("creating approx force env result in error "//cp_to_string(ierr))
258 END IF
259 CALL do_tmc_worker(tmc_env=tmc_env) ! start the worker routine
260
261 IF (tmc_env%w_env%env_id_ener .GT. 0) &
262 CALL destroy_force_env(tmc_env%w_env%env_id_ener, ierr)
263 IF (tmc_env%w_env%env_id_approx .GT. 0) &
264 CALL destroy_force_env(tmc_env%w_env%env_id_approx, ierr)
265
267 CALL cp_logger_release(logger_sub)
268
269 ! the analysis group
270 ELSE IF (ASSOCIATED(tmc_env%tmc_comp_set%para_env_m_ana)) THEN
271 ! unused worker groups can do analysis
272 NULLIFY (logger_sub)
273 ! create separate logger and error handler for each worker
274 CALL cp_logger_create(logger_sub, para_env=tmc_env%tmc_comp_set%para_env_m_ana, &
275 default_global_unit_nr=default_output_unit, close_global_unit_on_dealloc=.false.)
276 tmc_env%w_env%io_unit = default_output_unit
277 CALL cp_logger_set(logger_sub, local_filename="tmc_ana_localLog")
278 CALL cp_add_default_logger(logger_sub)
279 ! if we're doing output to the screen, keep it there, else this master
280 ! opens a file (not that two different ranks are writing to the
281 ! default_output_unit, we leave it up to mpirun or so to merge stuff
282 IF (bcast_output_unit == default_output_unit) THEN
283 output_unit = default_output_unit
284 ELSE
285 CALL open_file(file_name=tmc_ana_out_file_name, file_status="UNKNOWN", &
286 file_action="WRITE", file_position="APPEND", &
287 unit_number=output_unit)
288 CALL tmc_ana_header(output_unit)
289 END IF
290
291 ALLOCATE (tmc_ana_env_list(tmc_env%params%nr_temp))
292 tmc_ana_section => section_vals_get_subs_vals(root_section, "MOTION%TMC%TMC_ANALYSIS")
293 DO i = 1, tmc_env%params%nr_temp
294 CALL tmc_read_ana_input(tmc_ana_section, tmc_ana_env_list(i)%temp)
295 tmc_ana_env_list(i)%temp%io_unit = output_unit
296 END DO
297 CALL do_tmc_worker(tmc_env=tmc_env, ana_list=tmc_ana_env_list) ! start the worker routine for analysis
298 DO i = 1, tmc_env%params%nr_temp
299 IF (ASSOCIATED(tmc_ana_env_list(i)%temp%last_elem)) &
300 CALL deallocate_sub_tree_node(tree_elem=tmc_ana_env_list(i)%temp%last_elem)
301 CALL tmc_ana_env_release(tmc_ana_env_list(i)%temp)
302 END DO
303 DEALLOCATE (tmc_ana_env_list)
304 IF (bcast_output_unit .NE. output_unit) THEN
305 CALL close_file(unit_number=tmc_env%m_env%io_unit)
306 END IF
308 CALL cp_logger_release(logger_sub)
309
310 END IF ! unused worker groups have nothing to do
311
312 ! delete the random numbers
313 DEALLOCATE (tmc_env%rng_stream)
314
315 ! deallocate the move types
316 CALL finalize_mv_types(tmc_env%params)
317
318 ! finalize master and worker environment
319 IF (tmc_env%tmc_comp_set%group_nr .EQ. 0) THEN
320 CALL tmc_master_env_release(tmc_env) ! release master env
321 ELSE IF (tmc_env%tmc_comp_set%group_nr .NE. 0) THEN
322 CALL tmc_worker_env_release(tmc_env) ! release worker env
323 END IF ! unused worker groups have nothing to do
324
325 ELSE
326 IF (tmc_env%params%print_test_output) THEN
327 WRITE (output_unit, *) "TMC|NOTenoughProcessorsX= -999"
328 WRITE (output_unit, *) "TMC|NOTcalculatedTotal energy: -999"
329 END IF
330 END IF
331 ! finalize / deallocate everything
332 CALL tmc_env_release(tmc_env)
333
334 ! end the timing
335 CALL timestop(handle)
336
337 END SUBROUTINE do_tmc
338
339! **************************************************************************************************
340!> \brief analyze TMC trajectory files
341!> \param input_declaration ...
342!> \param root_section ...
343!> \param para_env ...
344!> \param
345!> \author Mandes 03.2013
346! **************************************************************************************************
347 SUBROUTINE do_analyze_files(input_declaration, root_section, para_env)
348 TYPE(section_type), POINTER :: input_declaration
349 TYPE(section_vals_type), POINTER :: root_section
350 TYPE(mp_para_env_type), POINTER :: para_env
351
352 CHARACTER(LEN=*), PARAMETER :: routinen = 'do_analyze_files'
353
354 INTEGER :: dir_ind, handle, nr_dim, output_unit, &
355 temp
356 TYPE(cp_logger_type), POINTER :: logger
357 TYPE(tmc_ana_list_type), DIMENSION(:), POINTER :: ana_list
358 TYPE(tmc_env_type), POINTER :: tmc_env
359 TYPE(tree_type), POINTER :: elem
360
361 NULLIFY (ana_list, tmc_env, elem, logger)
362
363 ! start the timing
364 CALL timeset(routinen, handle)
365
366 ! create a TMC environment (also to have a params environment)
367 CALL tmc_env_create(tmc_env)
368 ! -- spiltting communicator
369 ALLOCATE (tmc_env%tmc_comp_set%para_env_m_ana)
370 CALL tmc_env%tmc_comp_set%para_env_m_ana%from_split(para_env, para_env%mepos, 0)
371 IF (para_env%num_pe .NE. 1) THEN
372 cpwarn("just one out of "//cp_to_string(para_env%num_pe)//"cores is used ")
373 END IF
374 ! distribute work to availuble cores
375 IF (para_env%mepos .EQ. 0) THEN
376 !TODO get the correct usage of creating and handling the logger...
377 logger => cp_get_default_logger()
378 output_unit = cp_logger_get_default_io_unit(logger)
379 cpassert(output_unit .GT. 0)
380 ! write the header
381 CALL tmc_ana_header(output_unit)
382
383 ! read the input and create the ana environments for each temp
384 CALL tmc_read_ana_files_input(input_declaration=input_declaration, &
385 input=root_section, ana_list=ana_list, &
386 elem=elem, tmc_env=tmc_env)
387 nr_dim = SIZE(elem%pos)
388 ! we need a new tree element with all neccessay arrays, (e.g. dipoles could not be allocated already)
389 CALL deallocate_sub_tree_node(tree_elem=elem)
390 cpassert(SIZE(ana_list) .GT. 0)
391
392 ! print initial test output (for single core tests, where no data is produced)
393 IF (tmc_env%params%print_test_output) THEN
394 WRITE (output_unit, *) "TMC|ANAtestOutputInitX= -999"
395 END IF
396
397 ! do the analysis
398 DO temp = 1, SIZE(ana_list)
399 ! initialize the structures
400 ana_list(temp)%temp%io_unit = output_unit
401 CALL analysis_init(ana_env=ana_list(temp)%temp, nr_dim=nr_dim)
402 ! to allocate the dipole array in tree elements
403 IF (ana_list(temp)%temp%costum_dip_file_name .NE. &
405 tmc_env%params%print_dipole = .true.
406
407 IF (.NOT. ASSOCIATED(elem)) &
408 CALL allocate_new_sub_tree_node(tmc_params=tmc_env%params, &
409 next_el=elem, nr_dim=nr_dim)
410 CALL analysis_restart_read(ana_env=ana_list(temp)%temp, &
411 elem=elem)
412 IF (.NOT. ASSOCIATED(elem) .AND. .NOT. ASSOCIATED(ana_list(temp)%temp%last_elem)) &
413 cpabort("uncorrect initialization of the initial configuration")
414 ! do for all directories
415 DO dir_ind = 1, SIZE(ana_list(temp)%temp%dirs)
416 WRITE (output_unit, fmt='(T2,A,"| ",A,T41,A40)') "TMC_ANA", &
417 "read directory", trim(ana_list(temp)%temp%dirs(dir_ind))
419 start_id=ana_list(temp)%temp%from_elem, &
420 end_id=ana_list(temp)%temp%to_elem, &
421 dir_ind=dir_ind, &
422 ana_env=ana_list(temp)%temp, &
423 tmc_params=tmc_env%params)
424 ! remove the last saved element to start with a new file
425 ! there is no weight for this element
426 IF (dir_ind .LT. SIZE(ana_list(temp)%temp%dirs) .AND. &
427 ASSOCIATED(ana_list(temp)%temp%last_elem)) &
428 CALL deallocate_sub_tree_node(tree_elem=ana_list(temp)%temp%last_elem)
429 IF (ASSOCIATED(ana_list(temp)%temp%last_elem)) &
430 ana_list(temp)%temp%conf_offset = ana_list(temp)%temp%conf_offset &
431 + ana_list(temp)%temp%last_elem%nr
432 END DO
433 CALL finalize_tmc_analysis(ana_env=ana_list(temp)%temp)
434 ! write analysis restart file
435 ! if there is something to write
436 ! shifts the last element to actual element
437 IF (ASSOCIATED(ana_list(temp)%temp%last_elem)) &
438 CALL analysis_restart_print(ana_env=ana_list(temp)%temp)
439 IF (ASSOCIATED(ana_list(temp)%temp%last_elem)) &
440 CALL deallocate_sub_tree_node(tree_elem=ana_list(temp)%temp%last_elem)
441 IF (ASSOCIATED(elem)) &
442 CALL deallocate_sub_tree_node(tree_elem=elem)
443
444 IF (ASSOCIATED(ana_list(temp)%temp%last_elem)) &
445 CALL deallocate_sub_tree_node(tree_elem=ana_list(temp)%temp%last_elem)
446
447 CALL tmc_ana_env_release(ana_list(temp)%temp)
448 END DO
449
450 DEALLOCATE (ana_list)
451 END IF
452 CALL tmc_env_release(tmc_env)
453
454 ! end the timing
455 CALL timestop(handle)
456 END SUBROUTINE do_analyze_files
457
458! **************************************************************************************************
459!> \brief creates a new para environment for tmc analysis for each temperature
460!> \param input_declaration ...
461!> \param input global environment
462!> \param ana_list ...
463!> \param elem ...
464!> \param tmc_env TMC analysis environment
465!> \author Mandes 03.2013
466! **************************************************************************************************
467 SUBROUTINE tmc_read_ana_files_input(input_declaration, input, ana_list, elem, tmc_env)
468 TYPE(section_type), POINTER :: input_declaration
469 TYPE(section_vals_type), POINTER :: input
470 TYPE(tmc_ana_list_type), DIMENSION(:), POINTER :: ana_list
471 TYPE(tree_type), POINTER :: elem
472 TYPE(tmc_env_type), POINTER :: tmc_env
473
474 CHARACTER(len=default_string_length), &
475 DIMENSION(:), POINTER :: directories
476 INTEGER :: env_id, ierr, nr_temp, t_act
477 LOGICAL :: flag
478 REAL(kind=dp) :: tmax, tmin
479 REAL(kind=dp), DIMENSION(:), POINTER :: inp_temp, temps
480 TYPE(section_vals_type), POINTER :: tmc_section
481
482 NULLIFY (tmc_section, inp_temp, temps)
483 cpassert(ASSOCIATED(input))
484 cpassert(.NOT. ASSOCIATED(ana_list))
485 cpassert(.NOT. ASSOCIATED(elem))
486 cpassert(ASSOCIATED(tmc_env))
487
488 ! first global TMC stuff
489 tmc_section => section_vals_get_subs_vals(input, "MOTION%TMC")
490 CALL section_vals_val_get(tmc_section, "PRINT_TEST_OUTPUT", l_val=tmc_env%params%print_test_output)
491 ! TMC analysis stuff
492 tmc_section => section_vals_get_subs_vals(input, "MOTION%TMC%TMC_ANALYSIS_FILES")
493 CALL section_vals_get(tmc_section, explicit=flag)
494 cpassert(flag)
495
496 CALL section_vals_val_get(tmc_section, "FORCE_ENV_FILE", &
497 c_val=tmc_env%params%energy_inp_file)
498
499 CALL section_vals_val_get(tmc_section, "NR_TEMPERATURE", i_val=nr_temp)
500
501 CALL section_vals_val_get(tmc_section, "TEMPERATURE", r_vals=inp_temp)
502 IF ((nr_temp .GT. 1) .AND. (SIZE(inp_temp) .NE. 2)) &
503 cpabort("specify each temperature, skip keyword NR_TEMPERATURE")
504 IF (nr_temp .EQ. 1) THEN
505 nr_temp = SIZE(inp_temp)
506 ALLOCATE (temps(nr_temp))
507 temps(:) = inp_temp(:)
508 ELSE
509 tmin = inp_temp(1)
510 tmax = inp_temp(2)
511 ALLOCATE (temps(nr_temp))
512 temps(1) = tmin
513 DO t_act = 2, SIZE(temps)
514 temps(t_act) = temps(t_act - 1) + (tmax - tmin)/(SIZE(temps) - 1.0_dp)
515 END DO
516 IF (any(temps .LT. 0.0_dp)) &
517 CALL cp_abort(__location__, "The temperatures are negative. Should be specified using "// &
518 "TEMPERATURE {T_min} {T_max} and NR_TEMPERATURE {#temperatures}")
519 END IF
520
521 ! get multiple directories
522 CALL section_vals_val_get(tmc_section, "DIRECTORIES", c_vals=directories)
523
524 ! get init configuration (for sizes)
525 CALL create_force_env(new_env_id=env_id, &
526 input_declaration=input_declaration, &
527 input_path=tmc_env%params%energy_inp_file, &
528 mpi_comm=tmc_env%tmc_comp_set%para_env_m_ana, &
529 output_path="tmc_ana.out", ierr=ierr)
530 CALL get_initial_conf(tmc_params=tmc_env%params, init_conf=elem, &
531 env_id=env_id)
532 CALL get_atom_kinds_and_cell(env_id=env_id, atoms=tmc_env%params%atoms, &
533 cell=tmc_env%params%cell)
534 CALL destroy_force_env(env_id, ierr)
535
536 ALLOCATE (ana_list(SIZE(temps)))
537 DO t_act = 1, SIZE(temps)
538 ana_list(t_act)%temp => null()
539 CALL tmc_read_ana_input(tmc_section, ana_list(t_act)%temp)
540 ana_list(t_act)%temp%temperature = temps(t_act)
541 ALLOCATE (ana_list(t_act)%temp%dirs(SIZE(directories)))
542 ana_list(t_act)%temp%dirs(:) = directories(:)
543 ana_list(t_act)%temp%cell => tmc_env%params%cell
544 ana_list(t_act)%temp%atoms => tmc_env%params%atoms
545 ana_list(t_act)%temp%print_test_output = tmc_env%params%print_test_output
546
547 CALL section_vals_val_get(tmc_section, "POSITION_FILE", &
548 c_val=ana_list(t_act)%temp%costum_pos_file_name)
549 CALL section_vals_val_get(tmc_section, "DIPOLE_FILE", &
550 c_val=ana_list(t_act)%temp%costum_dip_file_name)
551 CALL section_vals_val_get(tmc_section, "CELL_FILE", &
552 c_val=ana_list(t_act)%temp%costum_cell_file_name)
553 CALL section_vals_val_get(tmc_section, "START_ELEM", i_val=ana_list(t_act)%temp%from_elem)
554 CALL section_vals_val_get(tmc_section, "END_ELEM", i_val=ana_list(t_act)%temp%to_elem)
555 END DO
556 DEALLOCATE (temps)
557 END SUBROUTINE tmc_read_ana_files_input
558
559! **************************************************************************************************
560!> \brief read the variables for distributing cores
561!> \param input ...
562!> \param tmc_env structure for storing all the tmc parameters
563!> \author Mandes 11.2012
564! **************************************************************************************************
565 SUBROUTINE tmc_preread_input(input, tmc_env)
566 TYPE(section_vals_type), POINTER :: input
567 TYPE(tmc_env_type), POINTER :: tmc_env
568
569 CHARACTER(LEN=default_path_length) :: c_tmp
570 INTEGER :: itmp
571 LOGICAL :: explicit_key, flag
572 REAL(kind=dp) :: tmax, tmin
573 REAL(kind=dp), DIMENSION(:), POINTER :: inp_temp
574 TYPE(section_vals_type), POINTER :: tmc_section
575
576 NULLIFY (tmc_section, inp_temp)
577
578 cpassert(ASSOCIATED(input))
579
580 tmc_env%tmc_comp_set%ana_on_the_fly = 0
581 tmc_section => section_vals_get_subs_vals(input, "MOTION%TMC%TMC_ANALYSIS")
582 CALL section_vals_get(tmc_section, explicit=flag)
583 IF (flag) THEN
584 tmc_env%tmc_comp_set%ana_on_the_fly = 1
585 END IF
586
587 tmc_section => section_vals_get_subs_vals(input, "MOTION%TMC")
588 CALL section_vals_get(tmc_section, explicit=flag)
589 cpassert(flag)
590
591 CALL section_vals_val_get(tmc_section, "PRINT_TEST_OUTPUT", l_val=tmc_env%params%print_test_output)
592
593 cpassert(ASSOCIATED(tmc_env%tmc_comp_set))
594 ! read the parameters for the computational setup
595 CALL section_vals_val_get(tmc_section, "GROUP_ENERGY_SIZE", i_val=tmc_env%tmc_comp_set%group_ener_size)
596 CALL section_vals_val_get(tmc_section, "GROUP_ENERGY_NR", i_val=tmc_env%tmc_comp_set%group_ener_nr)
597 CALL section_vals_val_get(tmc_section, "GROUP_CC_SIZE", i_val=tmc_env%tmc_comp_set%group_cc_size)
598 CALL section_vals_val_get(tmc_section, "GROUP_ANALYSIS_NR", i_val=itmp)
599 IF (tmc_env%tmc_comp_set%ana_on_the_fly .GT. 0) &
600 tmc_env%tmc_comp_set%ana_on_the_fly = itmp
601 IF (tmc_env%tmc_comp_set%ana_on_the_fly .GT. 1) &
602 CALL cp_abort(__location__, &
603 "analysing on the fly is up to now not supported for multiple cores. "// &
604 "Restart file witing for this case and temperature "// &
605 "distribution has to be solved.!.")
606 CALL section_vals_val_get(tmc_section, "RESULT_LIST_IN_MEMORY", l_val=tmc_env%params%USE_REDUCED_TREE)
607 ! swap the variable, because of oposit meaning
608 tmc_env%params%USE_REDUCED_TREE = .NOT. tmc_env%params%USE_REDUCED_TREE
609 CALL section_vals_val_get(tmc_section, "NR_TEMPERATURE", i_val=tmc_env%params%nr_temp)
610
611 ! stuff everyone needs to know
612 CALL section_vals_val_get(tmc_section, "NMC_MOVES%NMC_FILE_NAME", c_val=tmc_env%params%NMC_inp_file)
613 IF (tmc_env%params%NMC_inp_file .EQ. tmc_default_unspecified_name) THEN
614 ! file name keyword without file name
615 cpabort("no or a valid NMC input file has to be specified ")
616 ELSE IF (tmc_env%params%NMC_inp_file .EQ. "") THEN
617 ! no keyword
618 IF (tmc_env%tmc_comp_set%group_cc_size .GT. 0) &
619 CALL cp_warn(__location__, &
620 "The configurational groups are deactivated, "// &
621 "because no approximated energy input is specified.")
622 tmc_env%tmc_comp_set%group_cc_size = 0
623 ELSE
624 ! check file existence
625 INQUIRE (file=trim(tmc_env%params%NMC_inp_file), exist=flag, iostat=itmp)
626 IF (.NOT. flag .OR. itmp .NE. 0) &
627 cpabort("a valid NMC input file has to be specified")
628 END IF
629
630 CALL section_vals_val_get(tmc_section, "TEMPERATURE", r_vals=inp_temp)
631 IF (tmc_env%params%nr_temp .GT. 1 .AND. SIZE(inp_temp) .NE. 2) &
632 cpabort("specify each temperature, skip keyword NR_TEMPERATURE")
633 IF (tmc_env%params%nr_temp .EQ. 1) THEN
634 tmc_env%params%nr_temp = SIZE(inp_temp)
635 ALLOCATE (tmc_env%params%Temp(tmc_env%params%nr_temp))
636 tmc_env%params%Temp(:) = inp_temp(:)
637 ELSE
638 tmin = inp_temp(1)
639 tmax = inp_temp(2)
640 ALLOCATE (tmc_env%params%Temp(tmc_env%params%nr_temp))
641 tmc_env%params%Temp(1) = tmin
642 DO itmp = 2, SIZE(tmc_env%params%Temp)
643 tmc_env%params%Temp(itmp) = tmc_env%params%Temp(itmp - 1) + (tmax - tmin)/(SIZE(tmc_env%params%Temp) - 1.0_dp)
644 END DO
645 IF (any(tmc_env%params%Temp .LT. 0.0_dp)) &
646 CALL cp_abort(__location__, "The temperatures are negative. Should be specified using "// &
647 "TEMPERATURE {T_min} {T_max} and NR_TEMPERATURE {#temperatures}")
648 END IF
649
650 CALL section_vals_val_get(tmc_section, "TASK_TYPE", explicit=explicit_key)
651 IF (explicit_key) THEN
652 CALL section_vals_val_get(tmc_section, "TASK_TYPE", c_val=c_tmp)
653 SELECT CASE (trim(c_tmp))
655 tmc_env%params%task_type = task_type_mc
656 CASE ("IDEAL_GAS")
657 tmc_env%params%task_type = task_type_ideal_gas
658 CASE DEFAULT
659 CALL cp_warn(__location__, &
660 'unknown TMC task type "'//trim(c_tmp)//'" specified. '// &
661 " Set to default.")
662 tmc_env%params%task_type = task_type_mc
663 END SELECT
664 END IF
665
666 END SUBROUTINE tmc_preread_input
667
668! **************************************************************************************************
669!> \brief read the tmc subsection from the input file
670!> \param input points to the tmc subsection in the input file
671!> \param tmc_env structure for storing all the tmc parameters
672!> \author Mandes 11.2012
673! **************************************************************************************************
674 SUBROUTINE tmc_read_input(input, tmc_env)
675 TYPE(section_vals_type), POINTER :: input
676 TYPE(tmc_env_type), POINTER :: tmc_env
677
678 INTEGER :: itmp
679 LOGICAL :: explicit, flag
680 REAL(kind=dp) :: r_tmp
681 REAL(kind=dp), DIMENSION(:), POINTER :: r_arr_tmp
682 TYPE(section_vals_type), POINTER :: tmc_section
683
684 NULLIFY (tmc_section)
685
686 cpassert(ASSOCIATED(input))
687
688 tmc_section => section_vals_get_subs_vals(input, "MOTION%TMC")
689 CALL section_vals_get(tmc_section, explicit=flag)
690 cpassert(flag)
691
692 ! only for the master
693 IF (tmc_env%tmc_comp_set%group_nr == 0) THEN
694 cpassert(ASSOCIATED(tmc_env%m_env))
695 ! the walltime input can be done as HH:MM:SS or just in seconds.
696 CALL cp2k_get_walltime(section=input, keyword_name="GLOBAL%WALLTIME", &
697 walltime=tmc_env%m_env%walltime)
698
699 CALL section_vals_val_get(tmc_section, "NUM_MC_ELEM", i_val=tmc_env%m_env%num_MC_elem)
700 CALL section_vals_val_get(tmc_section, "RND_DETERMINISTIC", i_val=tmc_env%m_env%rnd_init)
701 ! restarting
702 CALL section_vals_val_get(tmc_section, "RESTART_IN", c_val=tmc_env%m_env%restart_in_file_name)
703 IF (tmc_env%m_env%restart_in_file_name .EQ. tmc_default_unspecified_name) THEN
704 tmc_env%m_env%restart_in_file_name = tmc_default_restart_in_file_name
705 INQUIRE (file=tmc_env%m_env%restart_in_file_name, exist=flag)
706 IF (.NOT. flag) tmc_env%m_env%restart_in_file_name = ""
707 END IF
708 CALL section_vals_val_get(tmc_section, "RESTART_OUT", i_val=tmc_env%m_env%restart_out_step)
709 ! restart just at the end (lone keyword)
710 IF (tmc_env%m_env%restart_out_step .EQ. -9) THEN
711 tmc_env%m_env%restart_out_file_name = tmc_default_restart_out_file_name
712 tmc_env%m_env%restart_out_step = huge(tmc_env%m_env%restart_out_step)
713 END IF
714 IF (tmc_env%m_env%restart_out_step .LT. 0) &
715 CALL cp_abort(__location__, &
716 "Please specify a valid value for the frequency "// &
717 "to write restart files (RESTART_OUT #). "// &
718 "# > 0 to define the amount of Markov chain elements in between, "// &
719 "or 0 to deactivate the restart file writing. "// &
720 "Lonely keyword writes restart file only at the end of the run.")
721
722 CALL section_vals_val_get(tmc_section, "INFO_OUT_STEP_SIZE", i_val=tmc_env%m_env%info_out_step_size)
723 CALL section_vals_val_get(tmc_section, "DOT_TREE", c_val=tmc_env%params%dot_file_name)
724 CALL section_vals_val_get(tmc_section, "ALL_CONF_FILE_NAME", c_val=tmc_env%params%all_conf_file_name)
725 IF (tmc_env%params%dot_file_name .NE. "") tmc_env%params%DRAW_TREE = .true.
726
727 ! everything for the worker group
728 ELSE IF (tmc_env%tmc_comp_set%group_nr .NE. 0) THEN
729 cpassert(ASSOCIATED(tmc_env%w_env))
730 END IF
731
732 ! stuff everyone needs to know
733
734 ! the NMC_FILE_NAME is already read in tmc_preread_input
735 CALL section_vals_val_get(tmc_section, "ENERGY_FILE_NAME", c_val=tmc_env%params%energy_inp_file)
736 ! file name keyword without file name
737 IF (tmc_env%params%energy_inp_file .EQ. "") &
738 cpabort("a valid exact energy input file has to be specified ")
739 ! check file existence
740 INQUIRE (file=trim(tmc_env%params%energy_inp_file), exist=flag, iostat=itmp)
741 IF (.NOT. flag .OR. itmp .NE. 0) &
742 CALL cp_abort(__location__, "a valid exact energy input file has to be specified, "// &
743 trim(tmc_env%params%energy_inp_file)//" does not exist.")
744
745 CALL section_vals_val_get(tmc_section, "NUM_MV_ELEM_IN_CELL", i_val=tmc_env%params%nr_elem_mv)
746
747 CALL section_vals_val_get(tmc_section, "VOLUME_ISOTROPIC", l_val=tmc_env%params%v_isotropic)
748 CALL section_vals_val_get(tmc_section, "PRESSURE", r_val=tmc_env%params%pressure)
749 tmc_env%params%pressure = tmc_env%params%pressure/au2bar
750 CALL section_vals_val_get(tmc_section, "MOVE_CENTER_OF_MASS", l_val=tmc_env%params%mv_cen_of_mass)
751
752 CALL section_vals_val_get(tmc_section, "SUB_BOX", r_vals=r_arr_tmp)
753 IF (SIZE(r_arr_tmp) .GT. 1) THEN
754 IF (SIZE(r_arr_tmp) .NE. tmc_env%params%dim_per_elem) &
755 cpabort("The entered sub box sizes does not fit in number of dimensions.")
756 IF (any(r_arr_tmp .LE. 0.0_dp)) &
757 cpabort("The entered sub box lengths should be greater than 0.")
758 DO itmp = 1, SIZE(tmc_env%params%sub_box_size)
759 tmc_env%params%sub_box_size(itmp) = r_arr_tmp(itmp)/au2a
760 END DO
761 ELSE IF (r_arr_tmp(1) .GT. 0.0_dp) THEN
762 r_tmp = r_arr_tmp(1)/au2a
763 tmc_env%params%sub_box_size(:) = r_tmp
764 END IF
765
766 ! read all the distinct moves
767 CALL read_init_move_types(tmc_params=tmc_env%params, &
768 tmc_section=tmc_section)
769
770 CALL section_vals_val_get(tmc_section, "ESIMATE_ACC_PROB", l_val=tmc_env%params%esimate_acc_prob)
771 CALL section_vals_val_get(tmc_section, "SPECULATIVE_CANCELING", l_val=tmc_env%params%SPECULATIVE_CANCELING)
772 CALL section_vals_val_get(tmc_section, "USE_SCF_ENERGY_INFO", l_val=tmc_env%params%use_scf_energy_info)
773 ! printing
774 CALL section_vals_val_get(tmc_section, "PRINT_ONLY_ACC", l_val=tmc_env%params%print_only_diff_conf)
775 CALL section_vals_val_get(tmc_section, "PRINT_COORDS", l_val=tmc_env%params%print_trajectory)
776 CALL section_vals_val_get(tmc_section, "PRINT_DIPOLE", explicit=explicit)
777 IF (explicit) &
778 CALL section_vals_val_get(tmc_section, "PRINT_DIPOLE", l_val=tmc_env%params%print_dipole)
779 CALL section_vals_val_get(tmc_section, "PRINT_FORCES", explicit=explicit)
780 IF (explicit) &
781 CALL section_vals_val_get(tmc_section, "PRINT_FORCES", l_val=tmc_env%params%print_forces)
782 CALL section_vals_val_get(tmc_section, "PRINT_CELL", explicit=explicit)
783 IF (explicit) &
784 CALL section_vals_val_get(tmc_section, "PRINT_CELL", l_val=tmc_env%params%print_cell)
785 CALL section_vals_val_get(tmc_section, "PRINT_ENERGIES", l_val=tmc_env%params%print_energies)
786
787 END SUBROUTINE tmc_read_input
788
789! **************************************************************************************************
790!> \brief creates a new para environment for tmc
791!> \param tmc_comp_set structure with parameters for computational setup
792!> \param para_env the old parallel environment
793!> \param ana_on_the_fly ...
794!> \param success ...
795!> \author Mandes 11.2012
796! **************************************************************************************************
797 SUBROUTINE tmc_redistributing_cores(tmc_comp_set, para_env, ana_on_the_fly, &
798 success)
799 TYPE(tmc_comp_set_type), POINTER :: tmc_comp_set
800 TYPE(mp_para_env_type), POINTER :: para_env
801 INTEGER :: ana_on_the_fly
802 LOGICAL :: success
803
804 INTEGER :: cc_group, cc_group_rank, master_ana_group, master_ana_rank, &
805 master_first_e_worker_g, master_first_e_worker_r, master_worker_group, &
806 master_worker_rank, my_mpi_undefined, total_used
807 LOGICAL :: flag, master
808
809 cpassert(ASSOCIATED(tmc_comp_set))
810 cpassert(ASSOCIATED(para_env))
811
812 ! colors and positions for new communicators
813 ! variables for printing
814 tmc_comp_set%group_nr = -1
815 my_mpi_undefined = para_env%num_pe + 10000 !HUGE(my_mpi_undefined)! mp_undefined
816 master_worker_group = my_mpi_undefined
817 master_worker_rank = -1
818 cc_group = my_mpi_undefined
819 cc_group_rank = -1
820 master_first_e_worker_g = my_mpi_undefined
821 master_first_e_worker_r = -1
822 master_ana_group = my_mpi_undefined
823 master_ana_rank = -1
824
825 master = .false.
826 flag = .false.
827 success = .true.
828
829 IF (para_env%num_pe .LE. 1) THEN
830 cpwarn("TMC need at least 2 cores (one for master, one for worker)")
831 success = .false.
832 ELSE
833 ! check if there are enougth cores available
834 IF (tmc_comp_set%group_ener_size*tmc_comp_set%group_ener_nr .GT. (para_env%num_pe - 1)) THEN
835 cpwarn("The selected energy group size is too huge. ")
836 END IF
837 IF (flag) THEN
838 tmc_comp_set%group_ener_nr = int((para_env%num_pe - 1)/ &
839 REAL(tmc_comp_set%group_ener_size, kind=dp))
840 IF (tmc_comp_set%group_ener_nr .LT. 1) THEN
841 cpwarn("The selected energy group size is too huge. ")
842 END IF
843 IF (flag) success = .false.
844 END IF
845
846 ! set the amount of configurational change worker groups
847 tmc_comp_set%group_cc_nr = 0
848 IF (tmc_comp_set%group_cc_size .GT. 0) THEN
849 tmc_comp_set%group_cc_nr = int((para_env%num_pe - 1 - tmc_comp_set%ana_on_the_fly &
850 - tmc_comp_set%group_ener_size*tmc_comp_set%group_ener_nr)/ &
851 REAL(tmc_comp_set%group_cc_size, kind=dp))
852
853 IF (tmc_comp_set%group_cc_nr .LT. 1) &
854 CALL cp_warn(__location__, &
855 "There are not enougth cores left for creating groups for configurational change.")
856 IF (flag) success = .false.
857 END IF
858
859 total_used = tmc_comp_set%group_ener_size*tmc_comp_set%group_ener_nr + &
860 tmc_comp_set%group_cc_size*tmc_comp_set%group_cc_nr + &
861 tmc_comp_set%ana_on_the_fly
862 IF (para_env%num_pe - 1 .GT. total_used) THEN
863 cpwarn(" mpi ranks are unused, but can be used for analysis.")
864 END IF
865
866 ! determine the master node
867 IF (para_env%mepos == para_env%num_pe - 1) THEN
868 master = .true.
869 master_worker_group = para_env%num_pe + 3 ! belong to master_worker_comm
870 master_worker_rank = 0 ! rank in m_w_comm
871 master_first_e_worker_g = para_env%num_pe + 3 ! belong to master_first_energy_worker_comm
872 master_first_e_worker_r = 0
873 tmc_comp_set%group_nr = 0 !para_env%num_pe +3
874 master_ana_group = para_env%num_pe + 4
875 master_ana_rank = 0
876 ELSE
877 ! energy calculation groups
878 IF (para_env%mepos .LT. tmc_comp_set%group_ener_size*tmc_comp_set%group_ener_nr) THEN
879 tmc_comp_set%group_nr = int(para_env%mepos/tmc_comp_set%group_ener_size) + 1 ! assign to groups
880 ! master of worker group
881 IF (modulo(para_env%mepos, tmc_comp_set%group_ener_size) .EQ. 0) THEN ! tmc_comp_set%group_nr masters
882 master_worker_group = para_env%num_pe + 3 ! belong to master_worker_comm
883 master_worker_rank = tmc_comp_set%group_nr ! rank in m_w_comm
884 IF (master_worker_rank .EQ. 1) THEN
885 master_first_e_worker_g = para_env%num_pe + 3 ! belong to master_first_energy_worker_comm
886 master_first_e_worker_r = 1
887 END IF
888 END IF
889 cc_group = tmc_comp_set%group_nr
890 cc_group_rank = para_env%mepos - &
891 (tmc_comp_set%group_nr - 1)*tmc_comp_set%group_ener_size ! rank in worker group
892
893 ! configurational change groups
894 ELSE IF (para_env%mepos .LT. (tmc_comp_set%group_ener_size*tmc_comp_set%group_ener_nr + &
895 tmc_comp_set%group_cc_size*tmc_comp_set%group_cc_nr)) THEN
896 cc_group_rank = para_env%mepos - tmc_comp_set%group_ener_size*tmc_comp_set%group_ener_nr ! temporary
897 tmc_comp_set%group_nr = tmc_comp_set%group_ener_nr + 1 + int(cc_group_rank/tmc_comp_set%group_cc_size)
898 cc_group = tmc_comp_set%group_nr
899 ! master of worker group
900 IF (modulo(cc_group_rank, tmc_comp_set%group_cc_size) .EQ. 0) THEN ! tmc_comp_set%group_nr masters
901 master_worker_group = para_env%num_pe + 3 ! belong to master_worker_comm
902 master_worker_rank = tmc_comp_set%group_nr ! rank in m_w_comm
903 END IF
904 !cc_group_rank = cc_group_rank-(tmc_comp_set%group_nr-1)*tmc_comp_set%group_cc_size ! rank in worker group
905 cc_group_rank = modulo(cc_group_rank, tmc_comp_set%group_cc_size) ! rank in worker group
906 ELSE
907 ! not used cores
908 ! up to now we use just one core for doing the analysis
909 IF (para_env%mepos .EQ. para_env%num_pe - 2) THEN
910 tmc_comp_set%group_nr = para_env%mepos - (para_env%num_pe - 1) ! negative
911 cpassert(tmc_comp_set%group_nr .LT. 0)
912 IF (para_env%mepos .GE. para_env%num_pe - 1 - ana_on_the_fly) THEN
913 master_ana_group = para_env%num_pe + 4
914 master_ana_rank = -tmc_comp_set%group_nr
915 END IF
916 END IF
917 END IF
918 END IF
919
920 IF (success) THEN
921 ! -- splitting communicators
922 ! worker intern communication
923 ALLOCATE (tmc_comp_set%para_env_sub_group)
924 CALL tmc_comp_set%para_env_sub_group%from_split(para_env, cc_group, cc_group_rank)
925 ! not the unused cores
926 IF (cc_group_rank < 0) THEN
927 CALL tmc_comp_set%para_env_sub_group%free()
928 DEALLOCATE (tmc_comp_set%para_env_sub_group)
929 END IF
930
931 ! worker master communication
932 ALLOCATE (tmc_comp_set%para_env_m_w)
933 CALL tmc_comp_set%para_env_m_w%from_split(para_env, master_worker_group, master_worker_rank)
934 ! not the unused cores
935 IF (master_worker_rank < 0) THEN
936 CALL tmc_comp_set%para_env_m_w%free()
937 DEALLOCATE (tmc_comp_set%para_env_m_w)
938 END IF
939
940 ! communicator only for first energy worker master and global master
941 ALLOCATE (tmc_comp_set%para_env_m_first_w)
942 CALL tmc_comp_set%para_env_m_first_w%from_split(para_env, master_first_e_worker_g, master_first_e_worker_r)
943 ! not the unused cores
944 IF (master_first_e_worker_r < 0) THEN
945 CALL tmc_comp_set%para_env_m_first_w%free()
946 DEALLOCATE (tmc_comp_set%para_env_m_first_w)
947 END IF
948
949 ! communicator only for analysis worker and global master
950 ALLOCATE (tmc_comp_set%para_env_m_ana)
951 CALL tmc_comp_set%para_env_m_ana%from_split(para_env, master_ana_group, master_ana_rank)
952 IF (master_ana_rank < 0) THEN
953 CALL tmc_comp_set%para_env_m_ana%free()
954 DEALLOCATE (tmc_comp_set%para_env_m_ana)
955 END IF
956
957 ! communicator for master only to handle external control
958 master_ana_group = my_mpi_undefined
959 master_ana_rank = -1
960 IF (master) THEN
961 master_ana_group = 1
962 master_ana_rank = 1
963 END IF
964 ALLOCATE (tmc_comp_set%para_env_m_only)
965 CALL tmc_comp_set%para_env_m_only%from_split(para_env, master_ana_group, master_ana_rank)
966 IF (master_ana_rank < 0) THEN
967 CALL tmc_comp_set%para_env_m_only%free()
968 DEALLOCATE (tmc_comp_set%para_env_m_only)
969 END IF
970 END IF
971 END IF
972 END SUBROUTINE tmc_redistributing_cores
973
974! **************************************************************************************************
975!> \brief prints the most important parameters used for TMC
976!> \param tmc_env tructure with parameters for TMC
977!> \author Mandes 11.2012
978! **************************************************************************************************
979 SUBROUTINE tmc_print_params(tmc_env)
980 TYPE(tmc_env_type), POINTER :: tmc_env
981
982 CHARACTER(LEN=*), PARAMETER :: fmt_my = '(T2,A,"| ",A,T41,A40)', plabel = "TMC"
983
984 CHARACTER(LEN=80) :: c_tmp, fmt_tmp
985 INTEGER :: file_nr
986
987 cpassert(ASSOCIATED(tmc_env))
988 cpassert(ASSOCIATED(tmc_env%tmc_comp_set))
989 ! only the master prints out
990 IF (tmc_env%tmc_comp_set%group_nr == 0) THEN
991 file_nr = tmc_env%m_env%io_unit
992 cpassert(ASSOCIATED(tmc_env%tmc_comp_set%para_env_m_w))
993 cpassert(ASSOCIATED(tmc_env%m_env))
994
995 CALL m_flush(file_nr)
996 WRITE (file_nr, *)
997
998 WRITE (unit=file_nr, fmt="(/,T2,A)") repeat("-", 79)
999 WRITE (unit=file_nr, fmt="(T2,A,T80,A)") "-", "-"
1000 WRITE (unit=file_nr, fmt="(T2,A,T35,A,T80,A)") "-", "TMC setting", "-"
1001 WRITE (unit=file_nr, fmt="(T2,A,T80,A)") "-", "-"
1002 WRITE (unit=file_nr, fmt="(T2,A)") repeat("-", 79)
1003
1004 WRITE (unit=file_nr, fmt="(T2,A,T35,A,T80,A)") "-", "distribution of cores", "-"
1005 WRITE (file_nr, fmt=fmt_my) plabel, "number of all working groups ", &
1006 cp_to_string(tmc_env%tmc_comp_set%para_env_m_w%num_pe - 1)
1007 WRITE (file_nr, fmt=fmt_my) plabel, "number of groups (ener|cc)", &
1008 cp_to_string(tmc_env%tmc_comp_set%group_ener_nr)//" | "// &
1009 cp_to_string(tmc_env%tmc_comp_set%group_cc_nr)
1010 WRITE (file_nr, fmt=fmt_my) plabel, "cores per group (ener|cc) ", &
1011 cp_to_string(tmc_env%tmc_comp_set%group_ener_size)//" | "// &
1012 cp_to_string(tmc_env%tmc_comp_set%group_cc_size)
1013 IF (ASSOCIATED(tmc_env%tmc_comp_set%para_env_m_ana)) &
1014 WRITE (file_nr, fmt=fmt_my) plabel, "Analysis groups ", &
1015 cp_to_string(tmc_env%tmc_comp_set%para_env_m_ana%num_pe - 1)
1016 IF (SIZE(tmc_env%params%Temp(:)) .LE. 7) THEN
1017 WRITE (fmt_tmp, *) '(T2,A,"| ",A,T25,A56)'
1018 c_tmp = ""
1019 WRITE (c_tmp, fmt="(1000F8.2)") tmc_env%params%Temp(:)
1020 WRITE (file_nr, fmt=fmt_tmp) plabel, "Temperature(s) [K]", trim(c_tmp)
1021 ELSE
1022 WRITE (file_nr, fmt='(A,1000F8.2)') " "//plabel//"| Temperature(s) [K]", &
1023 tmc_env%params%Temp(:)
1024 END IF
1025 WRITE (file_nr, fmt=fmt_my) plabel, "# of Monte Carlo Chain elements: ", &
1026 cp_to_string(tmc_env%m_env%num_MC_elem)
1027 WRITE (file_nr, fmt=fmt_my) plabel, "exact potential input file:", &
1028 trim(tmc_env%params%energy_inp_file)
1029 IF (tmc_env%params%NMC_inp_file .NE. "") &
1030 WRITE (file_nr, fmt=fmt_my) plabel, "approximate potential input file:", &
1031 trim(tmc_env%params%NMC_inp_file)
1032 IF (any(tmc_env%params%sub_box_size .GT. 0.0_dp)) THEN
1033 WRITE (fmt_tmp, *) '(T2,A,"| ",A,T25,A56)'
1034 c_tmp = ""
1035 WRITE (c_tmp, fmt="(1000F8.2)") tmc_env%params%sub_box_size(:)*au2a
1036 WRITE (file_nr, fmt=fmt_tmp) plabel, "Sub box size [A]", trim(c_tmp)
1037 END IF
1038 IF (tmc_env%params%pressure .GT. 0.0_dp) &
1039 WRITE (file_nr, fmt=fmt_my) plabel, "Pressure [bar]: ", &
1040 cp_to_string(tmc_env%params%pressure*au2bar)
1041 WRITE (file_nr, fmt=fmt_my) plabel, "Numbers of atoms/molecules moved "
1042 WRITE (file_nr, fmt=fmt_my) plabel, " within one conf. change", &
1043 cp_to_string(tmc_env%params%nr_elem_mv)
1044 WRITE (unit=file_nr, fmt="(/,T2,A)") repeat("-", 79)
1045 END IF
1046
1047 END SUBROUTINE tmc_print_params
1048
1049END MODULE
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.
Definition cp_files.F:16
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.
Definition cp_files.F:308
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.
Definition cp_files.F:119
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.
Definition environment.F:17
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....
subroutine, public tmc_ana_header(iw)
...
Definition header.F:458
subroutine, public tmc_header(iw)
...
Definition header.F:435
objects that represent the structure of input sections and the data contained in an input section
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
integer, parameter, public default_path_length
Definition kinds.F:58
Machine interface based on Fortran 2003 and POSIX.
Definition machine.F:17
integer, parameter, public default_output_unit
Definition machine.F:53
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
Definition machine.F:130
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:
Definition physcon.F:68
real(kind=dp), parameter, public angstrom
Definition physcon.F:144
real(kind=dp), parameter, public bar
Definition physcon.F:177
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
Definition tmc_file_io.F:20
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...
Definition tmc_master.F:23
subroutine, public do_tmc_master(tmc_env, globenv)
global master handling tree creation and communication/work distribution with workers
Definition tmc_master.F:211
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.
Definition tmc_setup.F:16
subroutine, public do_analyze_files(input_declaration, root_section, para_env)
analyze TMC trajectory files
Definition tmc_setup.F:348
subroutine, public do_tmc(input_declaration, root_section, para_env, globenv)
tmc_entry point
Definition tmc_setup.F:98
tree nodes creation, searching, deallocation, references etc.
Definition tmc_stati.F:15
character(len= *), parameter, public tmc_nmc_worker_out_file_name
Definition tmc_stati.F:32
character(len= *), parameter, public tmc_master_out_file_name
Definition tmc_stati.F:34
character(len= *), parameter, public tmc_default_unspecified_name
Definition tmc_stati.F:40
character(len= *), parameter, public tmc_ana_out_file_name
Definition tmc_stati.F:36
integer, parameter, public task_type_mc
Definition tmc_stati.F:44
character(len= *), parameter, public tmc_default_restart_in_file_name
Definition tmc_stati.F:28
character(len= *), parameter, public tmc_default_restart_out_file_name
Definition tmc_stati.F:26
character(len= *), parameter, public tmc_energy_worker_out_file_name
Definition tmc_stati.F:30
integer, parameter, public task_type_ideal_gas
Definition tmc_stati.F:45
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...
Definition tmc_types.F:32
subroutine, public tmc_env_release(tmc_env)
releases the structure environment for TMC
Definition tmc_types.F:207
subroutine, public tmc_worker_env_create(tmc_env)
creates a new structure environment for TMC master
Definition tmc_types.F:342
subroutine, public tmc_master_env_create(tmc_env)
creates a new structure environment for TMC master
Definition tmc_types.F:250
subroutine, public tmc_master_env_release(tmc_env)
releases the structure environment for TMC master
Definition tmc_types.F:309
subroutine, public tmc_worker_env_release(tmc_env)
releases the structure environment for TMC master
Definition tmc_types.F:370
subroutine, public tmc_env_create(tmc_env)
creates a new structure environment for TMC
Definition tmc_types.F:177
module contains the worker routine handling the communication and the calculation / creation of the c...
Definition tmc_worker.F:30
subroutine, public do_tmc_worker(tmc_env, ana_list)
worker get tasks form master and fulfill them
Definition tmc_worker.F:114
subroutine, public get_initial_conf(tmc_params, init_conf, env_id)
get the initial confuguration (pos,...)
Definition tmc_worker.F:767
subroutine, public get_atom_kinds_and_cell(env_id, atoms, cell)
get the pointer to the atoms, for easy handling
Definition tmc_worker.F:815
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
represent a section of the input file
stores all the informations relevant to an mpi environment