(git:374b731)
Loading...
Searching...
No Matches
tmc_worker.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief module contains the worker routine handling the communication and
10!> the calculation / creation of the configurations
11!> - WORKER these are all TMC cores, instead of master core
12!> and maybe some idle cores
13!> - divided in groups, in every group exists group master
14!> - there can be two kind of groups, one for exact energy calculation
15!> and one calculating configurational change using an approximate
16!> potential
17!> - Algorithm:
18!> - group master receive messages and decide what to do,
19!> - (if nessesary) broadcast of working task
20!> to all other group members (needed for parallel CP2K)
21!> - process task, calculations of energy or configurational change
22!> - result, exist on group master, sent to master core
23!> Communication structure (master->worker, worker->master):
24!> - message structure is defined in TMC message module
25!> \par History
26!> 11.2012 created [Mandes Schoenherr]
27!> \author Mandes
28! **************************************************************************************************
29
31 USE cell_methods, ONLY: init_cell
32 USE cell_types, ONLY: cell_copy,&
43 get_natom,&
44 get_pos,&
45 get_result_r1
48 USE kinds, ONLY: default_string_length,&
49 dp
50 USE message_passing, ONLY: mp_comm_type,&
54 USE tmc_analysis, ONLY: analysis_init,&
62 USE tmc_messages, ONLY: bcast_group,&
66 recv_msg,&
67 send_msg,&
73 USE tmc_move_types, ONLY: mv_type_md,&
75 USE tmc_moves, ONLY: change_pos
76 USE tmc_stati, ONLY: &
87 USE tmc_tree_types, ONLY: tree_type
92#include "../base/base_uses.f90"
93
94 IMPLICIT NONE
95
96 PRIVATE
97
98 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'tmc_worker'
99
100 PUBLIC :: do_tmc_worker
102
103 INTEGER, PARAMETER :: DEBUG = 0
104
105CONTAINS
106
107! **************************************************************************************************
108!> \brief worker get tasks form master and fulfill them
109!> \param tmc_env structure for storing all the tmc parameters
110!> \param ana_list ...
111!> \author Mandes 11.2012
112! **************************************************************************************************
113 SUBROUTINE do_tmc_worker(tmc_env, ana_list)
114 TYPE(tmc_env_type), POINTER :: tmc_env
115 TYPE(tmc_ana_list_type), DIMENSION(:), OPTIONAL, &
116 POINTER :: ana_list
117
118 CHARACTER(LEN=*), PARAMETER :: routinen = 'do_tmc_worker'
119
120 CHARACTER(LEN=default_string_length) :: c_tmp
121 INTEGER :: calc_stat, handle, i1, i2, ierr, itmp, &
122 num_dim, work_stat
123 INTEGER, DIMENSION(:), POINTER :: ana_restart_conf
124 LOGICAL :: flag, master
125 TYPE(mp_para_env_type), POINTER :: para_env_m_w
126 TYPE(tree_type), POINTER :: conf
127
128 master = .false.
129 i1 = -1
130 i2 = -1
131 NULLIFY (conf, para_env_m_w, ana_restart_conf)
132
133 cpassert(ASSOCIATED(tmc_env))
134
135 ! start the timing
136 CALL timeset(routinen, handle)
137
138 ! initialize
139 IF (tmc_env%tmc_comp_set%group_nr .GT. 0) THEN
140 cpassert(ASSOCIATED(tmc_env%tmc_comp_set%para_env_sub_group))
141 IF (tmc_env%w_env%env_id_ener .GT. 0) THEN
142 itmp = tmc_env%w_env%env_id_ener
143 ELSE
144 itmp = tmc_env%w_env%env_id_approx
145 END IF
146
147 CALL get_atom_kinds_and_cell(env_id=itmp, &
148 atoms=tmc_env%params%atoms, cell=tmc_env%params%cell)
149 para_env_m_w => tmc_env%tmc_comp_set%para_env_m_w
150 master = check_if_group_master(tmc_env%tmc_comp_set%para_env_sub_group)
151 ELSE
152 ! analysis group
153 cpassert(ASSOCIATED(tmc_env%tmc_comp_set%para_env_m_ana))
154 para_env_m_w => tmc_env%tmc_comp_set%para_env_m_ana
155 master = .true.
156 END IF
157
158 !-- GROUP MASTER only --------------
159 ! get messages from master and handle them
160 IF (master) THEN
161 ! NOT the analysis group
162 IF (tmc_env%tmc_comp_set%group_nr .GT. 0) THEN
163 IF (tmc_env%w_env%env_id_ener .GT. 0) THEN
164 itmp = tmc_env%w_env%env_id_ener
165 ELSE
166 itmp = tmc_env%w_env%env_id_approx
167 END IF
168 ! set the communicator in the external control for receiving exit tags
169 ! and sending additional information (e.g. the intermediate scf energies)
170 IF (tmc_env%params%use_scf_energy_info) &
171 CALL set_intermediate_info_comm(env_id=itmp, &
172 comm=tmc_env%tmc_comp_set%para_env_m_w)
173 IF (tmc_env%params%SPECULATIVE_CANCELING) &
174 CALL set_external_comm(comm=tmc_env%tmc_comp_set%para_env_m_w, &
175 in_external_master_id=master_comm_id, &
176 in_exit_tag=tmc_canceling_message)
177 END IF
178 !-- WORKING LOOP --!
179 master_work_time: DO
181 ! -- receive message from master
182 ! check for new task (wait for it)
183 itmp = master_comm_id
184 CALL tmc_message(msg_type=work_stat, send_recv=recv_msg, &
185 dest=itmp, &
186 para_env=para_env_m_w, &
187 result_count=ana_restart_conf, &
188 tmc_params=tmc_env%params, elem=conf)
189
190 IF (debug .GE. 1 .AND. work_stat .NE. tmc_status_wait_for_new_task) &
191 WRITE (tmc_env%w_env%io_unit, *) "worker: group master of group ", &
192 tmc_env%tmc_comp_set%group_nr, "got task ", work_stat
193 calc_stat = tmc_status_calculating
194 SELECT CASE (work_stat)
197 CALL init_cell(cell=tmc_env%params%cell)
198 itmp = bcast_group
199 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, &
200 dest=itmp, &
201 para_env=tmc_env%tmc_comp_set%para_env_sub_group, &
202 tmc_params=tmc_env%params)
204 work_stat = tmc_canceling_receipt
205 itmp = master_comm_id
206 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, &
207 dest=itmp, &
208 para_env=para_env_m_w, &
209 tmc_params=tmc_env%params)
210 CASE (tmc_status_failed)
211 IF (debug .GE. 1) &
212 WRITE (tmc_env%w_env%io_unit, *) "master worker of group", &
213 tmc_env%tmc_comp_set%group_nr, " exit work time."
214 EXIT master_work_time
215 !-- group master read the CP2K input file, and write data to master
217 IF (tmc_env%w_env%env_id_ener .GT. 0) THEN
218 itmp = tmc_env%w_env%env_id_ener
219 ELSE
220 itmp = tmc_env%w_env%env_id_approx
221 END IF
222 CALL get_initial_conf(tmc_params=tmc_env%params, init_conf=conf, &
223 env_id=itmp)
224 ! send start configuration back to master
226 itmp = master_comm_id
227 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, &
228 dest=itmp, &
229 para_env=para_env_m_w, &
230 tmc_params=tmc_env%params, elem=conf, &
231 wait_for_message=.true.)
232
233 IF (ASSOCIATED(tmc_env%tmc_comp_set%para_env_m_first_w)) &
234 CALL communicate_atom_types(atoms=tmc_env%params%atoms, &
235 source=1, &
236 para_env=tmc_env%tmc_comp_set%para_env_m_first_w)
237 !-- calculate the approximate energy
239 cpassert(tmc_env%w_env%env_id_approx .GT. 0)
240 itmp = bcast_group
241 !-- DISTRIBUTING WORK (group master) to all other group members
242 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, &
243 dest=itmp, &
244 para_env=tmc_env%tmc_comp_set%para_env_sub_group, &
245 tmc_params=tmc_env%params, elem=conf)
246 CALL calc_potential_energy(conf=conf, &
247 env_id=tmc_env%w_env%env_id_approx, &
248 exact_approx_pot=.false., &
249 tmc_env=tmc_env)
251 itmp = master_comm_id
252 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, &
253 dest=itmp, &
254 para_env=para_env_m_w, &
255 tmc_params=tmc_env%params, elem=conf)
256 ! -- Nested Monte Carlo routines
258 CALL clear_move_probs(tmc_env%params%nmc_move_types)
259 itmp = bcast_group
260 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, &
261 dest=itmp, &
262 para_env=tmc_env%tmc_comp_set%para_env_sub_group, &
263 tmc_params=tmc_env%params, elem=conf)
264 !-- collective calculation for MD/NMC steps
265 IF (work_stat .EQ. tmc_stat_nmc_request) THEN
266 !-- calculate MD steps, in case of 2 different potentials do nested Monte Carlo
267 CALL nested_markov_chain_mc(conf=conf, &
268 env_id=tmc_env%w_env%env_id_approx, &
269 tmc_env=tmc_env, calc_status=calc_stat)
270 ELSEIF (work_stat .EQ. tmc_stat_md_request) THEN
271 !TODO Hybrid MC routine
272 cpabort("there is no Hybrid MC implemented yet.")
273
274 ELSE
275 cpabort("unknown task type for workers.")
276 END IF
277 !-- in case of cancelation send receipt
278 itmp = master_comm_id
279 CALL tmc_message(msg_type=calc_stat, send_recv=recv_msg, &
280 dest=itmp, &
281 para_env=para_env_m_w, &
282 tmc_params=tmc_env%params, &
283 success=flag)
284 SELECT CASE (calc_stat)
286 SELECT CASE (work_stat)
288 work_stat = tmc_stat_md_result
290 work_stat = tmc_stat_nmc_result
291 CASE DEFAULT
292 CALL cp_abort(__location__, &
293 "unknown work status after possible NMC subgroup "// &
294 "cancelation, work_stat="//cp_to_string(work_stat))
295 END SELECT
297 work_stat = tmc_canceling_receipt
298 CASE DEFAULT
299 CALL cp_abort(__location__, &
300 "unknown calc status before sending NMC result "// &
301 cp_to_string(calc_stat))
302 END SELECT
303 ! send message back to master
304 itmp = master_comm_id
305 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, &
306 dest=itmp, &
307 para_env=para_env_m_w, &
308 tmc_params=tmc_env%params, elem=conf)
310 cpassert(tmc_env%w_env%env_id_ener .GT. 0)
311 !-- DISTRIBUTING WORK (group master) to all other group members
312 itmp = bcast_group
313 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, &
314 dest=itmp, &
315 para_env=tmc_env%tmc_comp_set%para_env_sub_group, &
316 tmc_params=tmc_env%params, elem=conf)
317
318 CALL calc_potential_energy(conf=conf, &
319 env_id=tmc_env%w_env%env_id_ener, &
320 exact_approx_pot=.true., &
321 tmc_env=tmc_env)
322 !-- in case of cancelation send receipt
323 flag = .false.
324 itmp = master_comm_id
325 CALL tmc_message(msg_type=calc_stat, send_recv=recv_msg, &
326 dest=itmp, &
327 para_env=para_env_m_w, &
328 tmc_params=tmc_env%params, success=flag)
329 SELECT CASE (calc_stat)
331 SELECT CASE (work_stat)
333 work_stat = tmc_stat_energy_result
334 !-- if nessesary get the exact dipoles (for e.g. quantum potential)
335 IF (tmc_env%params%print_dipole) THEN
336 c_tmp = "[DIPOLE]"
337 CALL get_result_r1(env_id=tmc_env%w_env%env_id_ener, &
338 description=c_tmp, n=3, result=conf%dipole, &
339 res_exist=flag, ierr=ierr)
340 IF (.NOT. flag) tmc_env%params%print_dipole = .false.
341 ! TODO maybe let run with the changed option, but inform user properly
342 IF (.NOT. flag) &
343 CALL cp_abort(__location__, &
344 "TMC: The requested dipoles are not porvided by the "// &
345 "force environment.")
346 END IF
347 CASE DEFAULT
348 CALL cp_abort(__location__, &
349 "energy worker should handle unknown stat "// &
350 cp_to_string(work_stat))
351 END SELECT
353 work_stat = tmc_canceling_receipt
354 CASE DEFAULT
355 CALL cp_abort(__location__, &
356 "worker while energy calc is in unknown state "// &
357 cp_to_string(work_stat))
358 END SELECT
359
360 !-- send information back to master
361 IF (debug .GE. 1) &
362 WRITE (tmc_env%w_env%io_unit, *) "worker group ", &
363 tmc_env%tmc_comp_set%group_nr, &
364 "calculations done, send result energy", conf%potential
365 itmp = master_comm_id
366 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, &
367 dest=itmp, &
368 para_env=para_env_m_w, &
369 tmc_params=tmc_env%params, elem=conf)
371 cpassert(ASSOCIATED(ana_restart_conf))
372 cpassert(SIZE(ana_restart_conf) .EQ. tmc_env%params%nr_temp)
373 cpassert(PRESENT(ana_list))
374 cpassert(ASSOCIATED(ana_list))
375 itmp = master_comm_id
376 CALL communicate_atom_types(atoms=tmc_env%params%atoms, &
377 source=itmp, para_env=tmc_env%tmc_comp_set%para_env_m_ana)
378
379 num_dim = SIZE(conf%pos)
380 DO itmp = 1, tmc_env%params%nr_temp
381 ! do not forget to nullify the pointer at the end, deallcoated at tmc_env%params
382 ana_list(itmp)%temp%temperature = tmc_env%params%Temp(itmp)
383 ana_list(itmp)%temp%atoms => tmc_env%params%atoms
384 ana_list(itmp)%temp%cell => tmc_env%params%cell
385! ana_list(itmp)%temp%io_unit = tmc_env%w_env%io_unit
386
387 CALL analysis_init(ana_env=ana_list(itmp)%temp, nr_dim=num_dim)
388 ana_list(itmp)%temp%print_test_output = tmc_env%params%print_test_output
389 IF (.NOT. ASSOCIATED(conf)) &
390 CALL allocate_new_sub_tree_node(tmc_params=tmc_env%params, &
391 next_el=conf, nr_dim=num_dim)
392 CALL analysis_restart_read(ana_env=ana_list(itmp)%temp, &
393 elem=conf)
394 !check if we have the read the file
395 flag = .false.
396 IF ((.NOT. ASSOCIATED(ana_list(itmp)%temp%last_elem)) .AND. &
397 ana_restart_conf(itmp) .GT. 0) THEN
398 flag = .true.
399 i1 = 0
400 i2 = ana_restart_conf(itmp)
401 CALL cp_warn(__location__, &
402 "analysis old trajectory up to "// &
403 "elem "//cp_to_string(ana_restart_conf(itmp))// &
404 ". Read trajectory file.")
405 ELSE IF (ASSOCIATED(ana_list(itmp)%temp%last_elem)) THEN
406 IF (.NOT. (ana_list(itmp)%temp%last_elem%nr .EQ. ana_restart_conf(itmp))) THEN
407 flag = .true.
408 i1 = ana_list(itmp)%temp%last_elem%nr
409 i2 = ana_restart_conf(itmp)
410 CALL cp_warn(__location__, &
411 "analysis restart with the incorrect configuration "// &
412 "TMC "//cp_to_string(ana_restart_conf(itmp))// &
413 " ana "//cp_to_string(ana_list(itmp)%temp%last_elem%nr)// &
414 ". REread trajectory file.")
415 END IF
416 END IF
417 IF (flag) THEN
418 CALL analyze_file_configurations(start_id=i1, &
419 end_id=i2, &
420 ana_env=ana_list(itmp)%temp, &
421 tmc_params=tmc_env%params)
422 END IF
423 END DO
425 cpassert(PRESENT(ana_list))
426 cpassert(ASSOCIATED(ana_list(conf%sub_tree_nr)%temp))
427 CALL do_tmc_analysis(elem=conf, &
428 ana_env=ana_list(conf%sub_tree_nr)%temp)
429 work_stat = tmc_stat_analysis_result
430 itmp = master_comm_id
431 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, &
432 dest=itmp, &
433 para_env=para_env_m_w, &
434 tmc_params=tmc_env%params, elem=conf)
435 CASE DEFAULT
436 CALL cp_abort(__location__, &
437 "worker received unknown message task type "// &
438 cp_to_string(work_stat))
439 END SELECT
440
441 IF (debug .GE. 1 .AND. work_stat .NE. tmc_status_wait_for_new_task) &
442 WRITE (tmc_env%w_env%io_unit, *) "worker: group ", &
443 tmc_env%tmc_comp_set%group_nr, &
444 "send back status:", work_stat
445 IF (ASSOCIATED(conf)) &
446 CALL deallocate_sub_tree_node(tree_elem=conf)
447 END DO master_work_time
448 !-- every other group paricipants----------------------------------------
449 ELSE
450 worker_work_time: DO
452 flag = .false.
453 itmp = bcast_group
454 CALL tmc_message(msg_type=work_stat, send_recv=recv_msg, &
455 dest=itmp, &
456 para_env=tmc_env%tmc_comp_set%para_env_sub_group, &
457 tmc_params=tmc_env%params, elem=conf)
458 calc_stat = tmc_status_calculating
459 SELECT CASE (work_stat)
461 CALL init_cell(cell=tmc_env%params%cell)
463 ! error message
464 CASE (tmc_status_failed)
465 EXIT worker_work_time
466 ! all group members have to calculate the (MD potential) energy together
468 cpassert(tmc_env%w_env%env_id_approx .GT. 0)
469 !-- collective calculation of the potential energy of MD potential
470 SELECT CASE (tmc_env%params%task_type)
472 IF (tmc_env%params%NMC_inp_file .NE. "") THEN
473 conf%box_scale(:) = 1.0_dp
474 CALL calc_potential_energy(conf=conf, &
475 env_id=tmc_env%w_env%env_id_approx, &
476 exact_approx_pot=.false., &
477 tmc_env=tmc_env)
478 END IF
479 CASE DEFAULT
480 CALL cp_abort(__location__, &
481 "unknown task_type for participants in "// &
482 "START_CONF_RESULT request ")
483 END SELECT
484 !-- HMC - calculating MD steps
486 !-- collective calculation for MD/NMC steps
487 IF (work_stat .EQ. tmc_stat_nmc_request) THEN
488 !-- calculate MD steps, in case of 2 different potentials do nested Monte Carlo
489 CALL nested_markov_chain_mc(conf=conf, &
490 env_id=tmc_env%w_env%env_id_approx, &
491 tmc_env=tmc_env, calc_status=calc_stat)
492 ELSEIF (work_stat .EQ. tmc_stat_md_request) THEN
493 !TODO Hybrid MC routine
494 cpabort("there is no Hybrid MC implemented yet.")
495
496 ELSE
497 cpabort("unknown task type for workers.")
498 END IF
499 !-- energy calculations
501 !--- do calculate energy
502 cpassert(tmc_env%w_env%env_id_approx .GT. 0)
503 CALL calc_potential_energy(conf=conf, &
504 env_id=tmc_env%w_env%env_id_approx, &
505 exact_approx_pot=.false., &
506 tmc_env=tmc_env)
508 !--- do calculate energy
509 cpassert(tmc_env%w_env%env_id_ener .GT. 0)
510 CALL calc_potential_energy(conf=conf, &
511 env_id=tmc_env%w_env%env_id_ener, &
512 exact_approx_pot=.true., &
513 tmc_env=tmc_env)
514 CASE DEFAULT
515 CALL cp_abort(__location__, &
516 "group participant got unknown working type "// &
517 cp_to_string(work_stat))
518 END SELECT
519 IF (ASSOCIATED(conf)) &
520 CALL deallocate_sub_tree_node(tree_elem=conf)
521 END DO worker_work_time
522 END IF
523 ! --------------------------------------------------------------------
524 ! finalizing analysis, writing files etc.
525 IF (ASSOCIATED(tmc_env%tmc_comp_set%para_env_m_ana)) THEN
526 DO itmp = 1, tmc_env%params%nr_temp
527 CALL analysis_restart_print(ana_env=ana_list(itmp)%temp)
528 IF (ASSOCIATED(conf)) &
529 CALL deallocate_sub_tree_node(tree_elem=ana_list(itmp)%temp%last_elem)
530 CALL finalize_tmc_analysis(ana_list(itmp)%temp)
531 END DO
532 END IF
533 !-- stopping and finalizing
534 ! sending back receipt for stopping
535 IF (master) THEN
536 ! NOT the analysis group
537 IF (tmc_env%tmc_comp_set%group_nr .GT. 0) THEN
538 ! remove the communicator in the external control for receiving exit tags
539 ! and sending additional information (e.g. the intermediate scf energies)
540 IF (tmc_env%params%use_scf_energy_info) THEN
541 IF (tmc_env%w_env%env_id_ener .GT. 0) THEN
542 itmp = tmc_env%w_env%env_id_ener
543 ELSE
544 itmp = tmc_env%w_env%env_id_approx
545 END IF
546 CALL remove_intermediate_info_comm(env_id=itmp)
547 END IF
548 END IF
549 IF (ASSOCIATED(tmc_env%tmc_comp_set%para_env_sub_group)) &
550 CALL stop_whole_group(para_env=tmc_env%tmc_comp_set%para_env_sub_group, &
551 tmc_params=tmc_env%params)
552
553 work_stat = tmc_status_stop_receipt
554 itmp = master_comm_id
555 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, dest=itmp, &
556 para_env=para_env_m_w, &
557 tmc_params=tmc_env%params)
558 ELSE IF (ASSOCIATED(tmc_env%tmc_comp_set%para_env_sub_group)) THEN
559 work_stat = tmc_status_stop_receipt
560 itmp = master_comm_id
561 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, dest=itmp, &
562 para_env=tmc_env%tmc_comp_set%para_env_sub_group, &
563 tmc_params=tmc_env%params)
564 END IF
565
566 IF (debug .GE. 5) &
567 WRITE (tmc_env%w_env%io_unit, *) "worker ", &
568 tmc_env%tmc_comp_set%para_env_sub_group%mepos, "of group ", &
569 tmc_env%tmc_comp_set%group_nr, "stops working!!!!!!!!!!!!!!!!!!"
570
571 IF (PRESENT(ana_list)) THEN
572 DO itmp = 1, tmc_env%params%nr_temp
573 ana_list(itmp)%temp%atoms => null()
574 ana_list(itmp)%temp%cell => null()
575 END DO
576 END IF
577 IF (ASSOCIATED(conf)) &
578 CALL deallocate_sub_tree_node(tree_elem=conf)
579 IF (ASSOCIATED(ana_restart_conf)) DEALLOCATE (ana_restart_conf)
580
581 ! end the timing
582 CALL timestop(handle)
583 END SUBROUTINE do_tmc_worker
584
585! **************************************************************************************************
586!> \brief Nested Monte Carlo (NMC), do several Markov Chain Monte Carlo steps
587!> usually using the approximate potential, could be also Hybrid MC.
588!> The amount of steps are predefined by the user, but should be huge
589!> enough to reach the equilibrium state for this potential
590!> \param conf ...
591!> \param env_id ...
592!> \param tmc_env ...
593!> \param calc_status ...
594!> \param
595!> \author Mandes 11.2012
596! **************************************************************************************************
597 SUBROUTINE nested_markov_chain_mc(conf, env_id, tmc_env, calc_status)
598 TYPE(tree_type), POINTER :: conf
599 INTEGER, INTENT(IN) :: env_id
600 TYPE(tmc_env_type), POINTER :: tmc_env
601 INTEGER, INTENT(OUT) :: calc_status
602
603 CHARACTER(LEN=*), PARAMETER :: routinen = 'nested_markov_chain_MC'
604
605 INTEGER :: comm_dest, handle, substeps
606 LOGICAL :: accept, change_rejected, flag
607 REAL(kind=dp) :: rnd_nr
608 TYPE(tree_type), POINTER :: last_acc_conf
609
610 NULLIFY (last_acc_conf)
611
612 cpassert(ASSOCIATED(tmc_env))
613 cpassert(ASSOCIATED(tmc_env%params))
614 cpassert(ASSOCIATED(tmc_env%tmc_comp_set))
615 cpassert(ALLOCATED(tmc_env%rng_stream))
616 cpassert(ASSOCIATED(conf))
617 cpassert(conf%temp_created .GT. 0)
618 cpassert(conf%temp_created .LE. tmc_env%params%nr_temp)
619 cpassert(env_id .GT. 0)
620 mark_used(env_id)
621
622 ! start the timing
623 CALL timeset(routinen, handle)
624
625 CALL allocate_new_sub_tree_node(tmc_params=tmc_env%params, &
626 next_el=last_acc_conf, nr_dim=SIZE(conf%pos))
627
628 last_acc_conf%pos = conf%pos
629 last_acc_conf%box_scale = conf%box_scale
630
631 ! energy of the last accepted configuration
632 CALL calc_potential_energy(conf=last_acc_conf, &
633 env_id=tmc_env%w_env%env_id_approx, exact_approx_pot=.false., &
634 tmc_env=tmc_env)
635
636 nmc_steps: DO substeps = 1, int(tmc_env%params%move_types%mv_size(mv_type_nmc_moves, 1))
637 ! check for canceling message
638 IF (ASSOCIATED(tmc_env%tmc_comp_set%para_env_m_w)) THEN
639 flag = .false.
640 comm_dest = master_comm_id
641 ! check for new canceling message
642 CALL tmc_message(msg_type=calc_status, send_recv=recv_msg, &
643 dest=comm_dest, &
644 para_env=tmc_env%tmc_comp_set%para_env_m_w, &
645 tmc_params=tmc_env%params, success=flag)
646 END IF
647 comm_dest = bcast_group
648 CALL tmc_message(msg_type=calc_status, send_recv=send_msg, &
649 dest=comm_dest, &
650 para_env=tmc_env%tmc_comp_set%para_env_sub_group, &
651 tmc_params=tmc_env%params)
652 SELECT CASE (calc_status)
654 ! keep on working
656 ! nothing to do, because calculation CANCELING, exit with cancel status
657 EXIT nmc_steps
658 CASE DEFAULT
659 CALL cp_abort(__location__, &
660 "unknown status "//cp_to_string(calc_status)// &
661 "in the NMC routine, expect only caneling status. ")
662 END SELECT
663
664 ! set move type
665 CALL tmc_env%rng_stream%set( &
666 bg=conf%rng_seed(:, :, 1), cg=conf%rng_seed(:, :, 2), &
667 ig=conf%rng_seed(:, :, 3))
668 conf%move_type = select_random_move_type( &
669 move_types=tmc_env%params%nmc_move_types, &
670 rnd=tmc_env%rng_stream%next())
671 CALL tmc_env%rng_stream%get( &
672 bg=conf%rng_seed(:, :, 1), cg=conf%rng_seed(:, :, 2), &
673 ig=conf%rng_seed(:, :, 3))
674
675 ! do move
676 CALL change_pos(tmc_params=tmc_env%params, &
677 move_types=tmc_env%params%nmc_move_types, &
678 rng_stream=tmc_env%rng_stream, &
679 elem=conf, mv_conf=1, new_subbox=.false., &
680 move_rejected=change_rejected)
681 ! for Hybrid MC the change_pos is only velocity change,
682 ! the actual MD step hast to be done in this module for communication reason
683 IF (conf%move_type .EQ. mv_type_md) THEN
684 !TODO implement the MD part
685 !CALL calc_MD_step(...)
686 !CALL calc_calc_e_kin(...)
687 CALL cp_abort(__location__, &
688 "Hybrid MC is not implemented yet, "// &
689 "(no MD section in TMC yet). ")
690 END IF
691
692 ! update the subbox acceptance probabilities
693 CALL prob_update(move_types=tmc_env%params%nmc_move_types, elem=conf, &
694 acc=.NOT. change_rejected, subbox=.true., &
695 prob_opt=tmc_env%params%esimate_acc_prob)
696
697 ! calculate potential energy if necessary
698 IF (.NOT. change_rejected) THEN
699 CALL calc_potential_energy(conf=conf, &
700 env_id=tmc_env%w_env%env_id_approx, exact_approx_pot=.false., &
701 tmc_env=tmc_env)
702 ELSE
703 conf%e_pot_approx = huge(conf%e_pot_approx)
704 END IF
705
706 !check NMC step
707 CALL tmc_env%rng_stream%set( &
708 bg=conf%rng_seed(:, :, 1), cg=conf%rng_seed(:, :, 2), &
709 ig=conf%rng_seed(:, :, 3))
710 rnd_nr = tmc_env%rng_stream%next()
711 CALL tmc_env%rng_stream%get( &
712 bg=conf%rng_seed(:, :, 1), cg=conf%rng_seed(:, :, 2), &
713 ig=conf%rng_seed(:, :, 3))
714
715 IF (.NOT. change_rejected) THEN
716 CALL acceptance_check(tree_element=conf, parent_element=last_acc_conf, &
717 tmc_params=tmc_env%params, &
718 temperature=tmc_env%params%Temp(conf%temp_created), &
719 diff_pot_check=.false., &
720 accept=accept, approx_ener=.true., rnd_nr=rnd_nr)
721 ELSE
722 accept = .false.
723 END IF
724 ! update the NMC accpetance per move
725 CALL prob_update(move_types=tmc_env%params%nmc_move_types, elem=conf, &
726 acc=accept, prob_opt=tmc_env%params%esimate_acc_prob)
727
728 ! update last accepted configuration or actual configuration
729 IF (accept .AND. (.NOT. change_rejected)) THEN
730 last_acc_conf%pos = conf%pos
731 last_acc_conf%vel = conf%vel
732 last_acc_conf%e_pot_approx = conf%e_pot_approx
733 last_acc_conf%ekin = conf%ekin
734 last_acc_conf%ekin_before_md = conf%ekin_before_md
735 last_acc_conf%box_scale = conf%box_scale
736 ELSE
737 conf%pos = last_acc_conf%pos
738 conf%vel = last_acc_conf%vel
739 conf%box_scale = last_acc_conf%box_scale
740 END IF
741 END DO nmc_steps
742
743 ! result values of Nested Monte Carlo (NMC) steps
744 ! regard that the calculated potential energy is the one of the approximated potential
745 conf%pos = last_acc_conf%pos
746 conf%vel = last_acc_conf%vel
747 conf%e_pot_approx = last_acc_conf%e_pot_approx
748 conf%potential = 0.0_dp
749 conf%ekin = last_acc_conf%ekin
750 conf%ekin_before_md = last_acc_conf%ekin_before_md
751
752 CALL deallocate_sub_tree_node(tree_elem=last_acc_conf)
753
754 ! end the timing
755 CALL timestop(handle)
756 END SUBROUTINE nested_markov_chain_mc
757
758! **************************************************************************************************
759!> \brief get the initial confuguration (pos,...)
760!> \param tmc_params ...
761!> \param init_conf the structure the data should be stored
762!> force_env
763!> \param env_id ...
764!> \author Mandes 11.2012
765! **************************************************************************************************
766 SUBROUTINE get_initial_conf(tmc_params, init_conf, env_id)
767 TYPE(tmc_param_type), POINTER :: tmc_params
768 TYPE(tree_type), POINTER :: init_conf
769 INTEGER :: env_id
770
771 CHARACTER(LEN=*), PARAMETER :: routinen = 'get_initial_conf'
772
773 INTEGER :: handle, ierr, mol, ndim, nr_atoms
774 TYPE(cp_subsys_type), POINTER :: subsys
775 TYPE(f_env_type), POINTER :: f_env
776 TYPE(molecule_list_type), POINTER :: molecule_new
777
778 cpassert(.NOT. ASSOCIATED(init_conf))
779
780 ! start the timing
781 CALL timeset(routinen, handle)
782
783 ! get positions
784 CALL get_natom(env_id=env_id, n_atom=nr_atoms, ierr=ierr)
785 cpassert(ierr .EQ. 0)
786 ndim = 3*nr_atoms
787 CALL allocate_new_sub_tree_node(tmc_params=tmc_params, &
788 next_el=init_conf, nr_dim=ndim)
789 CALL get_pos(env_id=env_id, pos=init_conf%pos, n_el=SIZE(init_conf%pos), &
790 ierr=ierr)
791
792 ! get the molecule info
793 CALL f_env_get_from_id(env_id, f_env)
794 CALL force_env_get(f_env%force_env, subsys=subsys)
795
796 CALL cp_subsys_get(subsys=subsys, molecules=molecule_new)
797 loop_mol: DO mol = 1, SIZE(molecule_new%els(:))
798 init_conf%mol(molecule_new%els(mol)%first_atom: &
799 molecule_new%els(mol)%last_atom) = mol
800 END DO loop_mol
801
802 ! end the timing
803 CALL timestop(handle)
804
805 END SUBROUTINE get_initial_conf
806
807! **************************************************************************************************
808!> \brief get the pointer to the atoms, for easy handling
809!> \param env_id ...
810!> \param atoms pointer to atomic_kind
811!> \param cell ...
812!> \author Mandes 01.2013
813! **************************************************************************************************
814 SUBROUTINE get_atom_kinds_and_cell(env_id, atoms, cell)
815 INTEGER :: env_id
816 TYPE(tmc_atom_type), DIMENSION(:), POINTER :: atoms
817 TYPE(cell_type), POINTER :: cell
818
819 INTEGER :: iparticle, nr_atoms, nunits_tot
820 TYPE(cell_type), POINTER :: cell_tmp
821 TYPE(cp_subsys_type), POINTER :: subsys
822 TYPE(f_env_type), POINTER :: f_env
823 TYPE(particle_list_type), POINTER :: particles
824
825 NULLIFY (f_env, subsys, particles)
826 nr_atoms = 0
827
828 cpassert(env_id .GT. 0)
829 cpassert(.NOT. ASSOCIATED(atoms))
830 cpassert(.NOT. ASSOCIATED(cell))
831
832 CALL f_env_get_from_id(env_id, f_env)
833 nr_atoms = force_env_get_natom(f_env%force_env)
834 CALL force_env_get(f_env%force_env, subsys=subsys, cell=cell_tmp)
835 ALLOCATE (cell)
836 CALL cell_copy(cell_in=cell_tmp, cell_out=cell)
837
838 !get atom kinds
839 CALL allocate_tmc_atom_type(atoms, nr_atoms)
840 CALL cp_subsys_get(subsys, particles=particles)
841 nunits_tot = SIZE(particles%els(:))
842 IF (nunits_tot .GT. 0) THEN
843 DO iparticle = 1, nunits_tot
844 atoms(iparticle)%name = particles%els(iparticle)%atomic_kind%name
845 atoms(iparticle)%mass = particles%els(iparticle)%atomic_kind%mass
846 END DO
847 cpassert(iparticle - 1 .EQ. nr_atoms)
848 END IF
849 END SUBROUTINE get_atom_kinds_and_cell
850
851! **************************************************************************************************
852!> \brief set the communicator in the SCF environment
853!> to receive the intermediate energies on the (global) master side
854!> \param comm the master-worker communicator
855!> \param env_id the ID of the related force environment
856!> \author Mandes 10.2013
857! **************************************************************************************************
858 SUBROUTINE set_intermediate_info_comm(comm, env_id)
859 CLASS(mp_comm_type), INTENT(IN) :: comm
860 INTEGER :: env_id
861
862 CHARACTER(LEN=default_string_length) :: description
863 REAL(kind=dp), DIMENSION(3) :: values
864 TYPE(cp_result_type), POINTER :: results
865 TYPE(cp_subsys_type), POINTER :: subsys
866 TYPE(f_env_type), POINTER :: f_env
867
868 NULLIFY (results, subsys)
869 cpassert(env_id .GT. 0)
870
871 CALL f_env_get_from_id(env_id, f_env)
872
873 cpassert(ASSOCIATED(f_env))
874 cpassert(ASSOCIATED(f_env%force_env))
875 IF (.NOT. ASSOCIATED(f_env%force_env%qs_env)) &
876 CALL cp_abort(__location__, &
877 "the intermediate SCF energy request can not be set "// &
878 "employing this force environment! ")
879
880 ! set the information
881 values(1) = real(comm%get_handle(), kind=dp)
882 values(2) = real(master_comm_id, kind=dp)
883 values(3) = real(tmc_stat_scf_step_ener_receive, kind=dp)
884 description = "[EXT_SCF_ENER_COMM]"
885
886 ! set the communicator information in the qs_env result container
887 CALL force_env_get(f_env%force_env, subsys=subsys)
888 CALL cp_subsys_get(subsys, results=results)
889 CALL put_results(results, description=description, values=values)
890 END SUBROUTINE set_intermediate_info_comm
891
892! **************************************************************************************************
893!> \brief set the communicator in the SCF environment
894!> to receive the intermediate energies on the (global) master side
895!> \param env_id the ID of the related force environment
896!> \author Mandes 10.2013
897! **************************************************************************************************
898 SUBROUTINE remove_intermediate_info_comm(env_id)
899 INTEGER :: env_id
900
901 CHARACTER(LEN=default_string_length) :: description
902 TYPE(cp_result_type), POINTER :: results
903 TYPE(cp_subsys_type), POINTER :: subsys
904 TYPE(f_env_type), POINTER :: f_env
905
906 NULLIFY (subsys, results)
907 cpassert(env_id .GT. 0)
908
909 CALL f_env_get_from_id(env_id, f_env)
910
911 cpassert(ASSOCIATED(f_env))
912 cpassert(ASSOCIATED(f_env%force_env))
913 IF (.NOT. ASSOCIATED(f_env%force_env%qs_env)) &
914 CALL cp_abort(__location__, &
915 "the SCF intermediate energy communicator can not be "// &
916 "removed! ")
917
918 description = "[EXT_SCF_ENER_COMM]"
919
920 ! set the communicator information in the qs_env result container
921 CALL force_env_get(f_env%force_env, subsys=subsys)
922 CALL cp_subsys_get(subsys, results=results)
923 CALL cp_results_erase(results, description=description)
924 END SUBROUTINE remove_intermediate_info_comm
925
926END MODULE tmc_worker
Handles all functions related to the CELL.
subroutine, public init_cell(cell, hmat, periodic)
Initialise/readjust a simulation cell after hmat has been changed.
Handles all functions related to the CELL.
Definition cell_types.F:15
subroutine, public cell_copy(cell_in, cell_out, tag)
Copy cell variable.
Definition cell_types.F:126
Routines to handle the external control of CP2K.
subroutine, public set_external_comm(comm, in_external_master_id, in_scf_energy_message_tag, in_exit_tag)
set the communicator to an external source or destination, to send messages (e.g. intermediate energi...
various routines to log and control the output. The idea is that decisions about where to log should ...
set of type/routines to handle the storage of results in force_envs
subroutine, public cp_results_erase(results, description, nval)
erase a part of result_list
set of type/routines to handle the storage of results in force_envs
types that represent a subsys, i.e. a part of the system
subroutine, public cp_subsys_get(subsys, ref_count, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell)
returns information about various attributes of the given subsys
interface to use cp2k as library
subroutine, public f_env_get_from_id(f_env_id, f_env)
...
subroutine, public get_natom(env_id, n_atom, ierr)
returns the number of atoms in the given force env
subroutine, public get_pos(env_id, pos, n_el, ierr)
gets the positions of the particles
Interface for the force calculations.
integer function, public force_env_get_natom(force_env)
returns the number of atoms
recursive subroutine, public force_env_get(force_env, in_use, fist_env, qs_env, meta_env, fp_env, subsys, para_env, potential_energy, additional_potential, kinetic_energy, harmonic_shell, kinetic_shell, cell, sub_force_env, qmmm_env, qmmmx_env, eip_env, pwdft_env, globenv, input, force_env_section, method_name_id, root_section, mixed_env, nnp_env, embed_env)
returns various attributes about the force environment
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
Interface to the message passing library MPI.
represent a simple array based list of the given type
represent a simple array based list of the given type
module provides variables for the TMC analysis tool
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 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 do_tmc_analysis(elem, ana_env)
call all the necessarry analysis routines analysis the previous element with the weight of the differ...
subroutine, public analysis_restart_print(ana_env)
print analysis restart file
calculation section for TreeMonteCarlo
subroutine, public calc_potential_energy(conf, env_id, exact_approx_pot, tmc_env)
start the calculation of the energy (distinguish between exact and approximate)
set up the different message for different tasks A TMC message consists of 3 parts (messages) 1: firs...
subroutine, public tmc_message(msg_type, send_recv, dest, para_env, tmc_params, elem, elem_array, list_elem, result_count, wait_for_message, success)
tmc message handling, packing messages with integer and real data type. Send first info message with ...
subroutine, public communicate_atom_types(atoms, source, para_env)
routines send atom names to the global master (using broadcast in a specialized group consisting of t...
integer, parameter, public bcast_group
logical function, public check_if_group_master(para_env)
checks if the core is the group master
integer, parameter, public master_comm_id
subroutine, public stop_whole_group(para_env, worker_info, tmc_params)
send stop command to all group participants
logical, parameter, public send_msg
logical, parameter, public recv_msg
acceptance ratio handling of the different Monte Carlo Moves types For each move type and each temper...
subroutine, public clear_move_probs(move_types)
clear the statistics of accepting/rejection moves because worker statistics will be add separately on...
integer function, public select_random_move_type(move_types, rnd)
selects a move type related to the weighings and the entered rnd nr
subroutine, public prob_update(move_types, pt_el, elem, acc, subbox, prob_opt)
adaptation of acceptance probability of every kind of change/move and the overall acc prob,...
tree nodes creation, searching, deallocation, references etc.
integer, parameter, public mv_type_md
integer, parameter, public mv_type_nmc_moves
different move types are applied
Definition tmc_moves.F:15
subroutine, public change_pos(tmc_params, move_types, rng_stream, elem, mv_conf, new_subbox, move_rejected)
applying the preselected move type
Definition tmc_moves.F:70
tree nodes creation, searching, deallocation, references etc.
Definition tmc_stati.F:15
integer, parameter, public tmc_status_calculating
Definition tmc_stati.F:56
integer, parameter, public tmc_status_failed
Definition tmc_stati.F:57
integer, parameter, public tmc_stat_analysis_request
Definition tmc_stati.F:88
integer, parameter, public tmc_status_worker_init
Definition tmc_stati.F:54
integer, parameter, public tmc_stat_md_result
Definition tmc_stati.F:82
integer, parameter, public tmc_stat_md_request
Definition tmc_stati.F:81
integer, parameter, public tmc_stat_approx_energy_result
Definition tmc_stati.F:69
integer, parameter, public tmc_stat_start_conf_result
Definition tmc_stati.F:72
integer, parameter, public tmc_status_wait_for_new_task
Definition tmc_stati.F:52
integer, parameter, public tmc_stat_nmc_result
Definition tmc_stati.F:78
integer, parameter, public tmc_stat_analysis_result
Definition tmc_stati.F:89
integer, parameter, public task_type_mc
Definition tmc_stati.F:44
integer, parameter, public tmc_stat_init_analysis
Definition tmc_stati.F:87
integer, parameter, public tmc_stat_energy_result
Definition tmc_stati.F:75
integer, parameter, public tmc_stat_scf_step_ener_receive
Definition tmc_stati.F:85
integer, parameter, public tmc_stat_approx_energy_request
Definition tmc_stati.F:68
integer, parameter, public tmc_stat_start_conf_request
Definition tmc_stati.F:71
integer, parameter, public tmc_canceling_receipt
Definition tmc_stati.F:64
integer, parameter, public tmc_stat_energy_request
Definition tmc_stati.F:74
integer, parameter, public tmc_stat_nmc_request
Definition tmc_stati.F:77
integer, parameter, public tmc_status_stop_receipt
Definition tmc_stati.F:58
integer, parameter, public tmc_canceling_message
Definition tmc_stati.F:63
integer, parameter, public task_type_ideal_gas
Definition tmc_stati.F:45
tree nodes acceptance code is separated in 3 parts, first the acceptance criteria,...
subroutine, public acceptance_check(tree_element, parent_element, tmc_params, temperature, diff_pot_check, accept, rnd_nr, approx_ener)
standard Monte Carlo and 2 potential acceptance check acceptance check of move from old(last accepted...
tree nodes creation, deallocation, references etc.
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 allocate_tmc_atom_type(atoms, nr_atoms)
creates a structure for storing the atom informations
Definition tmc_types.F:394
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 defining parameters related to the simulation cell.
Definition cell_types.F:55
contains arbitrary information which need to be stored
represents a system: atoms, molecules, their pos,vel,...
stores all the informations relevant to an mpi environment