(git:d3d49ac)
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-2026 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 /= default_output_unit .AND. 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)") &
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 == 0) THEN
155 CALL tmc_master_env_create(tmc_env) ! create master env
156 ELSE IF (tmc_env%tmc_comp_set%group_nr /= 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 == 0) THEN
166 IF (tmc_env%m_env%rnd_init > 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 == 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 /= 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 > 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 <= 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 /= 0) THEN
243 cpabort("creating force env result in error "//cp_to_string(ierr))
244 END IF
245 END IF
246 ! worker for configurational change
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
250 CALL create_force_env(new_env_id=tmc_env%w_env%env_id_approx, &
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, &
254 output_path=trim(expand_file_name_int(file_name=tmc_nmc_worker_out_file_name, &
255 ivalue=tmc_env%tmc_comp_set%group_nr)), &
256 ierr=ierr)
257 IF (ierr /= 0) THEN
258 cpabort("creating approx force env result in error "//cp_to_string(ierr))
259 END IF
260 END IF
261 CALL do_tmc_worker(tmc_env=tmc_env) ! start the worker routine
262
263 IF (tmc_env%w_env%env_id_ener > 0) THEN
264 CALL destroy_force_env(tmc_env%w_env%env_id_ener, ierr)
265 END IF
266 IF (tmc_env%w_env%env_id_approx > 0) THEN
267 CALL destroy_force_env(tmc_env%w_env%env_id_approx, ierr)
268 END IF
269
271 CALL cp_logger_release(logger_sub)
272
273 ! the analysis group
274 ELSE IF (ASSOCIATED(tmc_env%tmc_comp_set%para_env_m_ana)) THEN
275 ! unused worker groups can do analysis
276 NULLIFY (logger_sub)
277 ! create separate logger and error handler for each worker
278 CALL cp_logger_create(logger_sub, para_env=tmc_env%tmc_comp_set%para_env_m_ana, &
279 default_global_unit_nr=default_output_unit, close_global_unit_on_dealloc=.false.)
280 tmc_env%w_env%io_unit = default_output_unit
281 CALL cp_logger_set(logger_sub, local_filename="tmc_ana_localLog")
282 CALL cp_add_default_logger(logger_sub)
283 ! if we're doing output to the screen, keep it there, else this master
284 ! opens a file (not that two different ranks are writing to the
285 ! default_output_unit, we leave it up to mpirun or so to merge stuff
286 IF (bcast_output_unit == default_output_unit) THEN
287 output_unit = default_output_unit
288 ELSE
289 CALL open_file(file_name=tmc_ana_out_file_name, file_status="UNKNOWN", &
290 file_action="WRITE", file_position="APPEND", &
291 unit_number=output_unit)
292 CALL tmc_ana_header(output_unit)
293 END IF
294
295 ALLOCATE (tmc_ana_env_list(tmc_env%params%nr_temp))
296 tmc_ana_section => section_vals_get_subs_vals(root_section, "MOTION%TMC%TMC_ANALYSIS")
297 DO i = 1, tmc_env%params%nr_temp
298 CALL tmc_read_ana_input(tmc_ana_section, tmc_ana_env_list(i)%temp)
299 tmc_ana_env_list(i)%temp%io_unit = output_unit
300 END DO
301 CALL do_tmc_worker(tmc_env=tmc_env, ana_list=tmc_ana_env_list) ! start the worker routine for analysis
302 DO i = 1, tmc_env%params%nr_temp
303 IF (ASSOCIATED(tmc_ana_env_list(i)%temp%last_elem)) THEN
304 CALL deallocate_sub_tree_node(tree_elem=tmc_ana_env_list(i)%temp%last_elem)
305 END IF
306 CALL tmc_ana_env_release(tmc_ana_env_list(i)%temp)
307 END DO
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)
311 END IF
313 CALL cp_logger_release(logger_sub)
314
315 END IF ! unused worker groups have nothing to do
316
317 ! delete the random numbers
318 DEALLOCATE (tmc_env%rng_stream)
319
320 ! deallocate the move types
321 CALL finalize_mv_types(tmc_env%params)
322
323 ! finalize master and worker environment
324 IF (tmc_env%tmc_comp_set%group_nr == 0) THEN
325 CALL tmc_master_env_release(tmc_env) ! release master env
326 ELSE IF (tmc_env%tmc_comp_set%group_nr /= 0) THEN
327 CALL tmc_worker_env_release(tmc_env) ! release worker env
328 END IF ! unused worker groups have nothing to do
329
330 ELSE
331 IF (tmc_env%params%print_test_output) THEN
332 WRITE (output_unit, *) "TMC|NOTenoughProcessorsX= -999"
333 WRITE (output_unit, *) "TMC|NOTcalculatedTotal energy: -999"
334 END IF
335 END IF
336 ! finalize / deallocate everything
337 CALL tmc_env_release(tmc_env)
338
339 ! end the timing
340 CALL timestop(handle)
341
342 END SUBROUTINE do_tmc
343
344! **************************************************************************************************
345!> \brief analyze TMC trajectory files
346!> \param input_declaration ...
347!> \param root_section ...
348!> \param para_env ...
349!> \param
350!> \author Mandes 03.2013
351! **************************************************************************************************
352 SUBROUTINE do_analyze_files(input_declaration, root_section, para_env)
353 TYPE(section_type), POINTER :: input_declaration
354 TYPE(section_vals_type), POINTER :: root_section
355 TYPE(mp_para_env_type), POINTER :: para_env
356
357 CHARACTER(LEN=*), PARAMETER :: routinen = 'do_analyze_files'
358
359 INTEGER :: dir_ind, handle, nr_dim, output_unit, &
360 temp
361 TYPE(cp_logger_type), POINTER :: logger
362 TYPE(tmc_ana_list_type), DIMENSION(:), POINTER :: ana_list
363 TYPE(tmc_env_type), POINTER :: tmc_env
364 TYPE(tree_type), POINTER :: elem
365
366 NULLIFY (ana_list, tmc_env, elem, logger)
367
368 ! start the timing
369 CALL timeset(routinen, handle)
370
371 ! create a TMC environment (also to have a params environment)
372 CALL tmc_env_create(tmc_env)
373 ! -- spiltting communicator
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 ")
378 END IF
379 ! distribute work to availuble cores
380 IF (para_env%mepos == 0) THEN
381 !TODO get the correct usage of creating and handling the logger...
382 logger => cp_get_default_logger()
383 output_unit = cp_logger_get_default_io_unit(logger)
384 cpassert(output_unit > 0)
385 ! write the header
386 CALL tmc_ana_header(output_unit)
387
388 ! read the input and create the ana environments for each temp
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)
393 ! we need a new tree element with all neccessay arrays, (e.g. dipoles could not be allocated already)
394 CALL deallocate_sub_tree_node(tree_elem=elem)
395 cpassert(SIZE(ana_list) > 0)
396
397 ! print initial test output (for single core tests, where no data is produced)
398 IF (tmc_env%params%print_test_output) THEN
399 WRITE (output_unit, *) "TMC|ANAtestOutputInitX= -999"
400 END IF
401
402 ! do the analysis
403 DO temp = 1, SIZE(ana_list)
404 ! initialize the structures
405 ana_list(temp)%temp%io_unit = output_unit
406 CALL analysis_init(ana_env=ana_list(temp)%temp, nr_dim=nr_dim)
407 ! to allocate the dipole array in tree elements
408 IF (ana_list(temp)%temp%costum_dip_file_name /= &
410 tmc_env%params%print_dipole = .true.
411 END IF
412
413 IF (.NOT. ASSOCIATED(elem)) THEN
414 CALL allocate_new_sub_tree_node(tmc_params=tmc_env%params, &
415 next_el=elem, nr_dim=nr_dim)
416 END IF
417 CALL analysis_restart_read(ana_env=ana_list(temp)%temp, &
418 elem=elem)
419 IF (.NOT. ASSOCIATED(elem) .AND. .NOT. ASSOCIATED(ana_list(temp)%temp%last_elem)) THEN
420 cpabort("uncorrect initialization of the initial configuration")
421 END IF
422 ! do for all directories
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, &
429 dir_ind=dir_ind, &
430 ana_env=ana_list(temp)%temp, &
431 tmc_params=tmc_env%params)
432 ! remove the last saved element to start with a new file
433 ! there is no weight for this element
434 IF (dir_ind < SIZE(ana_list(temp)%temp%dirs) .AND. &
435 ASSOCIATED(ana_list(temp)%temp%last_elem)) THEN
436 CALL deallocate_sub_tree_node(tree_elem=ana_list(temp)%temp%last_elem)
437 END IF
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
441 END IF
442 END DO
443 CALL finalize_tmc_analysis(ana_env=ana_list(temp)%temp)
444 ! write analysis restart file
445 ! if there is something to write
446 ! shifts the last element to actual element
447 IF (ASSOCIATED(ana_list(temp)%temp%last_elem)) THEN
448 CALL analysis_restart_print(ana_env=ana_list(temp)%temp)
449 END IF
450 IF (ASSOCIATED(ana_list(temp)%temp%last_elem)) THEN
451 CALL deallocate_sub_tree_node(tree_elem=ana_list(temp)%temp%last_elem)
452 END IF
453 IF (ASSOCIATED(elem)) THEN
454 CALL deallocate_sub_tree_node(tree_elem=elem)
455 END IF
456
457 IF (ASSOCIATED(ana_list(temp)%temp%last_elem)) THEN
458 CALL deallocate_sub_tree_node(tree_elem=ana_list(temp)%temp%last_elem)
459 END IF
460
461 CALL tmc_ana_env_release(ana_list(temp)%temp)
462 END DO
463
464 DEALLOCATE (ana_list)
465 END IF
466 CALL tmc_env_release(tmc_env)
467
468 ! end the timing
469 CALL timestop(handle)
470 END SUBROUTINE do_analyze_files
471
472! **************************************************************************************************
473!> \brief creates a new para environment for tmc analysis for each temperature
474!> \param input_declaration ...
475!> \param input global environment
476!> \param ana_list ...
477!> \param elem ...
478!> \param tmc_env TMC analysis environment
479!> \author Mandes 03.2013
480! **************************************************************************************************
481 SUBROUTINE tmc_read_ana_files_input(input_declaration, input, ana_list, elem, tmc_env)
482 TYPE(section_type), POINTER :: input_declaration
483 TYPE(section_vals_type), POINTER :: input
484 TYPE(tmc_ana_list_type), DIMENSION(:), POINTER :: ana_list
485 TYPE(tree_type), POINTER :: elem
486 TYPE(tmc_env_type), POINTER :: tmc_env
487
488 CHARACTER(len=default_string_length), &
489 DIMENSION(:), POINTER :: directories
490 INTEGER :: env_id, ierr, nr_temp, t_act
491 LOGICAL :: flag
492 REAL(kind=dp) :: tmax, tmin
493 REAL(kind=dp), DIMENSION(:), POINTER :: inp_temp, temps
494 TYPE(section_vals_type), POINTER :: tmc_section
495
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))
501
502 ! first global TMC stuff
503 tmc_section => section_vals_get_subs_vals(input, "MOTION%TMC")
504 CALL section_vals_val_get(tmc_section, "PRINT_TEST_OUTPUT", l_val=tmc_env%params%print_test_output)
505 ! TMC analysis stuff
506 tmc_section => section_vals_get_subs_vals(input, "MOTION%TMC%TMC_ANALYSIS_FILES")
507 CALL section_vals_get(tmc_section, explicit=flag)
508 cpassert(flag)
509
510 CALL section_vals_val_get(tmc_section, "FORCE_ENV_FILE", &
511 c_val=tmc_env%params%energy_inp_file)
512
513 CALL section_vals_val_get(tmc_section, "NR_TEMPERATURE", i_val=nr_temp)
514
515 CALL section_vals_val_get(tmc_section, "TEMPERATURE", r_vals=inp_temp)
516 IF ((nr_temp > 1) .AND. (SIZE(inp_temp) /= 2)) THEN
517 cpabort("specify each temperature, skip keyword NR_TEMPERATURE")
518 END IF
519 IF (nr_temp == 1) THEN
520 nr_temp = SIZE(inp_temp)
521 ALLOCATE (temps(nr_temp))
522 temps(:) = inp_temp(:)
523 ELSE
524 tmin = inp_temp(1)
525 tmax = inp_temp(2)
526 ALLOCATE (temps(nr_temp))
527 temps(1) = tmin
528 DO t_act = 2, SIZE(temps)
529 temps(t_act) = temps(t_act - 1) + (tmax - tmin)/(SIZE(temps) - 1.0_dp)
530 END DO
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}")
534 END IF
535 END IF
536
537 ! get multiple directories
538 CALL section_vals_val_get(tmc_section, "DIRECTORIES", c_vals=directories)
539
540 ! get init configuration (for sizes)
541 CALL create_force_env(new_env_id=env_id, &
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)
546 CALL get_initial_conf(tmc_params=tmc_env%params, init_conf=elem, &
547 env_id=env_id)
548 CALL get_atom_kinds_and_cell(env_id=env_id, atoms=tmc_env%params%atoms, &
549 cell=tmc_env%params%cell)
550 CALL destroy_force_env(env_id, ierr)
551
552 ALLOCATE (ana_list(SIZE(temps)))
553 DO t_act = 1, SIZE(temps)
554 ana_list(t_act)%temp => null()
555 CALL tmc_read_ana_input(tmc_section, ana_list(t_act)%temp)
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
562
563 CALL section_vals_val_get(tmc_section, "POSITION_FILE", &
564 c_val=ana_list(t_act)%temp%costum_pos_file_name)
565 CALL section_vals_val_get(tmc_section, "DIPOLE_FILE", &
566 c_val=ana_list(t_act)%temp%costum_dip_file_name)
567 CALL section_vals_val_get(tmc_section, "CELL_FILE", &
568 c_val=ana_list(t_act)%temp%costum_cell_file_name)
569 CALL section_vals_val_get(tmc_section, "START_ELEM", i_val=ana_list(t_act)%temp%from_elem)
570 CALL section_vals_val_get(tmc_section, "END_ELEM", i_val=ana_list(t_act)%temp%to_elem)
571 END DO
572 DEALLOCATE (temps)
573 END SUBROUTINE tmc_read_ana_files_input
574
575! **************************************************************************************************
576!> \brief read the variables for distributing cores
577!> \param input ...
578!> \param tmc_env structure for storing all the tmc parameters
579!> \author Mandes 11.2012
580! **************************************************************************************************
581 SUBROUTINE tmc_preread_input(input, tmc_env)
582 TYPE(section_vals_type), POINTER :: input
583 TYPE(tmc_env_type), POINTER :: tmc_env
584
585 CHARACTER(LEN=default_path_length) :: c_tmp
586 INTEGER :: itmp
587 LOGICAL :: explicit_key, flag
588 REAL(kind=dp) :: tmax, tmin
589 REAL(kind=dp), DIMENSION(:), POINTER :: inp_temp
590 TYPE(section_vals_type), POINTER :: tmc_section
591
592 NULLIFY (tmc_section, inp_temp)
593
594 cpassert(ASSOCIATED(input))
595
596 tmc_env%tmc_comp_set%ana_on_the_fly = 0
597 tmc_section => section_vals_get_subs_vals(input, "MOTION%TMC%TMC_ANALYSIS")
598 CALL section_vals_get(tmc_section, explicit=flag)
599 IF (flag) THEN
600 tmc_env%tmc_comp_set%ana_on_the_fly = 1
601 END IF
602
603 tmc_section => section_vals_get_subs_vals(input, "MOTION%TMC")
604 CALL section_vals_get(tmc_section, explicit=flag)
605 cpassert(flag)
606
607 CALL section_vals_val_get(tmc_section, "PRINT_TEST_OUTPUT", l_val=tmc_env%params%print_test_output)
608
609 cpassert(ASSOCIATED(tmc_env%tmc_comp_set))
610 ! read the parameters for the computational setup
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)
614 CALL section_vals_val_get(tmc_section, "GROUP_ANALYSIS_NR", i_val=itmp)
615 IF (tmc_env%tmc_comp_set%ana_on_the_fly > 0) THEN
616 tmc_env%tmc_comp_set%ana_on_the_fly = itmp
617 END IF
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.!.")
623 END IF
624 CALL section_vals_val_get(tmc_section, "RESULT_LIST_IN_MEMORY", l_val=tmc_env%params%USE_REDUCED_TREE)
625 ! swap the variable, because of oposit meaning
626 tmc_env%params%USE_REDUCED_TREE = .NOT. tmc_env%params%USE_REDUCED_TREE
627 CALL section_vals_val_get(tmc_section, "NR_TEMPERATURE", i_val=tmc_env%params%nr_temp)
628
629 ! stuff everyone needs to know
630 CALL section_vals_val_get(tmc_section, "NMC_MOVES%NMC_FILE_NAME", c_val=tmc_env%params%NMC_inp_file)
631 IF (tmc_env%params%NMC_inp_file == tmc_default_unspecified_name) THEN
632 ! file name keyword without file name
633 cpabort("no or a valid NMC input file has to be specified ")
634 ELSE IF (tmc_env%params%NMC_inp_file == "") THEN
635 ! no keyword
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.")
640 END IF
641 tmc_env%tmc_comp_set%group_cc_size = 0
642 ELSE
643 ! check file existence
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")
647 END IF
648 END IF
649
650 CALL section_vals_val_get(tmc_section, "TEMPERATURE", r_vals=inp_temp)
651 IF (tmc_env%params%nr_temp > 1 .AND. SIZE(inp_temp) /= 2) THEN
652 cpabort("specify each temperature, skip keyword NR_TEMPERATURE")
653 END IF
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(:)
658 ELSE
659 tmin = inp_temp(1)
660 tmax = inp_temp(2)
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)
665 END DO
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}")
669 END IF
670 END IF
671
672 CALL section_vals_val_get(tmc_section, "TASK_TYPE", explicit=explicit_key)
673 IF (explicit_key) THEN
674 CALL section_vals_val_get(tmc_section, "TASK_TYPE", c_val=c_tmp)
675 SELECT CASE (trim(c_tmp))
677 tmc_env%params%task_type = task_type_mc
678 CASE ("IDEAL_GAS")
679 tmc_env%params%task_type = task_type_ideal_gas
680 CASE DEFAULT
681 CALL cp_warn(__location__, &
682 'unknown TMC task type "'//trim(c_tmp)//'" specified. '// &
683 " Set to default.")
684 tmc_env%params%task_type = task_type_mc
685 END SELECT
686 END IF
687
688 END SUBROUTINE tmc_preread_input
689
690! **************************************************************************************************
691!> \brief read the tmc subsection from the input file
692!> \param input points to the tmc subsection in the input file
693!> \param tmc_env structure for storing all the tmc parameters
694!> \author Mandes 11.2012
695! **************************************************************************************************
696 SUBROUTINE tmc_read_input(input, tmc_env)
697 TYPE(section_vals_type), POINTER :: input
698 TYPE(tmc_env_type), POINTER :: tmc_env
699
700 INTEGER :: itmp
701 LOGICAL :: explicit, flag
702 REAL(kind=dp) :: r_tmp
703 REAL(kind=dp), DIMENSION(:), POINTER :: r_arr_tmp
704 TYPE(section_vals_type), POINTER :: tmc_section
705
706 NULLIFY (tmc_section)
707
708 cpassert(ASSOCIATED(input))
709
710 tmc_section => section_vals_get_subs_vals(input, "MOTION%TMC")
711 CALL section_vals_get(tmc_section, explicit=flag)
712 cpassert(flag)
713
714 ! only for the master
715 IF (tmc_env%tmc_comp_set%group_nr == 0) THEN
716 cpassert(ASSOCIATED(tmc_env%m_env))
717 ! the walltime input can be done as HH:MM:SS or just in seconds.
718 CALL cp2k_get_walltime(section=input, keyword_name="GLOBAL%WALLTIME", &
719 walltime=tmc_env%m_env%walltime)
720
721 CALL section_vals_val_get(tmc_section, "NUM_MC_ELEM", i_val=tmc_env%m_env%num_MC_elem)
722 CALL section_vals_val_get(tmc_section, "RND_DETERMINISTIC", i_val=tmc_env%m_env%rnd_init)
723 ! restarting
724 CALL section_vals_val_get(tmc_section, "RESTART_IN", c_val=tmc_env%m_env%restart_in_file_name)
725 IF (tmc_env%m_env%restart_in_file_name == tmc_default_unspecified_name) THEN
726 tmc_env%m_env%restart_in_file_name = tmc_default_restart_in_file_name
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 = ""
729 END IF
730 CALL section_vals_val_get(tmc_section, "RESTART_OUT", i_val=tmc_env%m_env%restart_out_step)
731 ! restart just at the end (lone keyword)
732 IF (tmc_env%m_env%restart_out_step == -9) THEN
733 tmc_env%m_env%restart_out_file_name = tmc_default_restart_out_file_name
734 tmc_env%m_env%restart_out_step = huge(tmc_env%m_env%restart_out_step)
735 END IF
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.")
743 END IF
744
745 CALL section_vals_val_get(tmc_section, "INFO_OUT_STEP_SIZE", i_val=tmc_env%m_env%info_out_step_size)
746 CALL section_vals_val_get(tmc_section, "DOT_TREE", c_val=tmc_env%params%dot_file_name)
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.
749
750 ! everything for the worker group
751 ELSE IF (tmc_env%tmc_comp_set%group_nr /= 0) THEN
752 cpassert(ASSOCIATED(tmc_env%w_env))
753 END IF
754
755 ! stuff everyone needs to know
756
757 ! the NMC_FILE_NAME is already read in tmc_preread_input
758 CALL section_vals_val_get(tmc_section, "ENERGY_FILE_NAME", c_val=tmc_env%params%energy_inp_file)
759 ! file name keyword without file name
760 IF (tmc_env%params%energy_inp_file == "") THEN
761 cpabort("a valid exact energy input file has to be specified ")
762 END IF
763 ! check file existence
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.")
768 END IF
769
770 CALL section_vals_val_get(tmc_section, "NUM_MV_ELEM_IN_CELL", i_val=tmc_env%params%nr_elem_mv)
771
772 CALL section_vals_val_get(tmc_section, "VOLUME_ISOTROPIC", l_val=tmc_env%params%v_isotropic)
773 CALL section_vals_val_get(tmc_section, "PRESSURE", r_val=tmc_env%params%pressure)
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)
776
777 CALL section_vals_val_get(tmc_section, "SUB_BOX", r_vals=r_arr_tmp)
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.")
781 END IF
782 IF (any(r_arr_tmp <= 0.0_dp)) THEN
783 cpabort("The entered sub box lengths should be greater than 0.")
784 END IF
785 DO itmp = 1, SIZE(tmc_env%params%sub_box_size)
786 tmc_env%params%sub_box_size(itmp) = r_arr_tmp(itmp)/au2a
787 END DO
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
791 END IF
792
793 ! read all the distinct moves
794 CALL read_init_move_types(tmc_params=tmc_env%params, &
795 tmc_section=tmc_section)
796
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)
800 ! printing
801 CALL section_vals_val_get(tmc_section, "PRINT_ONLY_ACC", l_val=tmc_env%params%print_only_diff_conf)
802 CALL section_vals_val_get(tmc_section, "PRINT_COORDS", l_val=tmc_env%params%print_trajectory)
803 CALL section_vals_val_get(tmc_section, "PRINT_DIPOLE", explicit=explicit)
804 IF (explicit) THEN
805 CALL section_vals_val_get(tmc_section, "PRINT_DIPOLE", l_val=tmc_env%params%print_dipole)
806 END IF
807 CALL section_vals_val_get(tmc_section, "PRINT_FORCES", explicit=explicit)
808 IF (explicit) THEN
809 CALL section_vals_val_get(tmc_section, "PRINT_FORCES", l_val=tmc_env%params%print_forces)
810 END IF
811 CALL section_vals_val_get(tmc_section, "PRINT_CELL", explicit=explicit)
812 IF (explicit) THEN
813 CALL section_vals_val_get(tmc_section, "PRINT_CELL", l_val=tmc_env%params%print_cell)
814 END IF
815 CALL section_vals_val_get(tmc_section, "PRINT_ENERGIES", l_val=tmc_env%params%print_energies)
816
817 END SUBROUTINE tmc_read_input
818
819! **************************************************************************************************
820!> \brief creates a new para environment for tmc
821!> \param tmc_comp_set structure with parameters for computational setup
822!> \param para_env the old parallel environment
823!> \param ana_on_the_fly ...
824!> \param success ...
825!> \author Mandes 11.2012
826! **************************************************************************************************
827 SUBROUTINE tmc_redistributing_cores(tmc_comp_set, para_env, ana_on_the_fly, &
828 success)
829 TYPE(tmc_comp_set_type), POINTER :: tmc_comp_set
830 TYPE(mp_para_env_type), POINTER :: para_env
831 INTEGER :: ana_on_the_fly
832 LOGICAL :: success
833
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
838
839 cpassert(ASSOCIATED(tmc_comp_set))
840 cpassert(ASSOCIATED(para_env))
841
842 ! colors and positions for new communicators
843 ! variables for printing
844 tmc_comp_set%group_nr = -1
845 my_mpi_undefined = para_env%num_pe + 10000 !HUGE(my_mpi_undefined)! mp_undefined
846 master_worker_group = my_mpi_undefined
847 master_worker_rank = -1
848 cc_group = my_mpi_undefined
849 cc_group_rank = -1
850 master_first_e_worker_g = my_mpi_undefined
851 master_first_e_worker_r = -1
852 master_ana_group = my_mpi_undefined
853 master_ana_rank = -1
854
855 master = .false.
856 flag = .false.
857 success = .true.
858
859 IF (para_env%num_pe <= 1) THEN
860 cpwarn("TMC need at least 2 cores (one for master, one for worker)")
861 success = .false.
862 ELSE
863 ! check if there are enougth cores available
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. ")
866 END IF
867 IF (flag) THEN
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. ")
872 END IF
873 IF (flag) success = .false.
874 END IF
875
876 ! set the amount of configurational change worker groups
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))
882
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.")
886 END IF
887 IF (flag) success = .false.
888 END IF
889
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.")
895 END IF
896
897 ! determine the master node
898 IF (para_env%mepos == para_env%num_pe - 1) THEN
899 master = .true.
900 master_worker_group = para_env%num_pe + 3 ! belong to master_worker_comm
901 master_worker_rank = 0 ! rank in m_w_comm
902 master_first_e_worker_g = para_env%num_pe + 3 ! belong to master_first_energy_worker_comm
903 master_first_e_worker_r = 0
904 tmc_comp_set%group_nr = 0 !para_env%num_pe +3
905 master_ana_group = para_env%num_pe + 4
906 master_ana_rank = 0
907 ELSE
908 ! energy calculation groups
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 ! assign to groups
911 ! master of worker group
912 IF (modulo(para_env%mepos, tmc_comp_set%group_ener_size) == 0) THEN ! tmc_comp_set%group_nr masters
913 master_worker_group = para_env%num_pe + 3 ! belong to master_worker_comm
914 master_worker_rank = tmc_comp_set%group_nr ! rank in m_w_comm
915 IF (master_worker_rank == 1) THEN
916 master_first_e_worker_g = para_env%num_pe + 3 ! belong to master_first_energy_worker_comm
917 master_first_e_worker_r = 1
918 END IF
919 END IF
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 ! rank in worker group
923
924 ! configurational change groups
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 ! temporary
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
930 ! master of worker group
931 IF (modulo(cc_group_rank, tmc_comp_set%group_cc_size) == 0) THEN ! tmc_comp_set%group_nr masters
932 master_worker_group = para_env%num_pe + 3 ! belong to master_worker_comm
933 master_worker_rank = tmc_comp_set%group_nr ! rank in m_w_comm
934 END IF
935 !cc_group_rank = cc_group_rank-(tmc_comp_set%group_nr-1)*tmc_comp_set%group_cc_size ! rank in worker group
936 cc_group_rank = modulo(cc_group_rank, tmc_comp_set%group_cc_size) ! rank in worker group
937 ELSE
938 ! not used cores
939 ! up to now we use just one core for doing the analysis
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) ! negative
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
946 END IF
947 END IF
948 END IF
949 END IF
950
951 IF (success) THEN
952 ! -- splitting communicators
953 ! worker intern communication
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)
956 ! not the unused cores
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)
960 END IF
961
962 ! worker master communication
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)
965 ! not the unused cores
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)
969 END IF
970
971 ! communicator only for first energy worker master and global master
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)
974 ! not the unused cores
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)
978 END IF
979
980 ! communicator only for analysis worker and global master
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)
986 END IF
987
988 ! communicator for master only to handle external control
989 master_ana_group = my_mpi_undefined
990 master_ana_rank = -1
991 IF (master) THEN
992 master_ana_group = 1
993 master_ana_rank = 1
994 END IF
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)
1000 END IF
1001 END IF
1002 END IF
1003 END SUBROUTINE tmc_redistributing_cores
1004
1005! **************************************************************************************************
1006!> \brief prints the most important parameters used for TMC
1007!> \param tmc_env tructure with parameters for TMC
1008!> \author Mandes 11.2012
1009! **************************************************************************************************
1010 SUBROUTINE tmc_print_params(tmc_env)
1011 TYPE(tmc_env_type), POINTER :: tmc_env
1012
1013 CHARACTER(LEN=*), PARAMETER :: fmt_my = '(T2,A,"| ",A,T41,A40)', plabel = "TMC"
1014
1015 CHARACTER(LEN=80) :: c_tmp, fmt_tmp
1016 INTEGER :: file_nr
1017
1018 cpassert(ASSOCIATED(tmc_env))
1019 cpassert(ASSOCIATED(tmc_env%tmc_comp_set))
1020 ! only the master prints out
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))
1025
1026 CALL m_flush(file_nr)
1027 WRITE (file_nr, *)
1028
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)
1034
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)//" | "// &
1040 cp_to_string(tmc_env%tmc_comp_set%group_cc_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)//" | "// &
1043 cp_to_string(tmc_env%tmc_comp_set%group_cc_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)
1047 END IF
1048 IF (SIZE(tmc_env%params%Temp(:)) <= 7) THEN
1049 WRITE (fmt_tmp, *) '(T2,A,"| ",A,T25,A56)'
1050 c_tmp = ""
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)
1053 ELSE
1054 WRITE (file_nr, fmt='(A,1000F8.2)') " "//plabel//"| Temperature(s) [K]", &
1055 tmc_env%params%Temp(:)
1056 END IF
1057 WRITE (file_nr, fmt=fmt_my) plabel, "# of Monte Carlo Chain elements: ", &
1058 cp_to_string(tmc_env%m_env%num_MC_elem)
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)
1064 END IF
1065 IF (any(tmc_env%params%sub_box_size > 0.0_dp)) THEN
1066 WRITE (fmt_tmp, *) '(T2,A,"| ",A,T25,A56)'
1067 c_tmp = ""
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)
1070 END IF
1071 IF (tmc_env%params%pressure > 0.0_dp) THEN
1072 WRITE (file_nr, fmt=fmt_my) plabel, "Pressure [bar]: ", &
1073 cp_to_string(tmc_env%params%pressure*au2bar)
1074 END IF
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", &
1077 cp_to_string(tmc_env%params%nr_elem_mv)
1078 WRITE (unit=file_nr, fmt="(/,T2,A)") repeat("-", 79)
1079 END IF
1080
1081 END SUBROUTINE tmc_print_params
1082
1083END MODULE tmc_setup
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:311
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:122
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:494
subroutine, public tmc_header(iw)
...
Definition header.F:471
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:46
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
Definition machine.F:124
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:212
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:353
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:349
subroutine, public tmc_master_env_create(tmc_env)
creates a new structure environment for TMC master
Definition tmc_types.F:256
subroutine, public tmc_master_env_release(tmc_env)
releases the structure environment for TMC master
Definition tmc_types.F:316
subroutine, public tmc_worker_env_release(tmc_env)
releases the structure environment for TMC master
Definition tmc_types.F:377
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:782
subroutine, public get_atom_kinds_and_cell(env_id, atoms, cell)
get the pointer to the atoms, for easy handling
Definition tmc_worker.F:830
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