(git:295f299)
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-2026 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 > 0) THEN
140 cpassert(ASSOCIATED(tmc_env%tmc_comp_set%para_env_sub_group))
141 IF (tmc_env%w_env%env_id_ener > 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 > 0) THEN
163 IF (tmc_env%w_env%env_id_ener > 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) THEN
171 CALL set_intermediate_info_comm(env_id=itmp, &
172 comm=tmc_env%tmc_comp_set%para_env_m_w)
173 END IF
174 IF (tmc_env%params%SPECULATIVE_CANCELING) THEN
175 CALL set_external_comm(comm=tmc_env%tmc_comp_set%para_env_m_w, &
176 in_external_master_id=master_comm_id, &
177 in_exit_tag=tmc_canceling_message)
178 END IF
179 END IF
180 !-- WORKING LOOP --!
181 master_work_time: DO
183 ! -- receive message from master
184 ! check for new task (wait for it)
185 itmp = master_comm_id
186 CALL tmc_message(msg_type=work_stat, send_recv=recv_msg, &
187 dest=itmp, &
188 para_env=para_env_m_w, &
189 result_count=ana_restart_conf, &
190 tmc_params=tmc_env%params, elem=conf)
191
192 IF (debug >= 1 .AND. work_stat /= tmc_status_wait_for_new_task) THEN
193 WRITE (tmc_env%w_env%io_unit, *) "worker: group master of group ", &
194 tmc_env%tmc_comp_set%group_nr, "got task ", work_stat
195 END IF
196 calc_stat = tmc_status_calculating
197 SELECT CASE (work_stat)
200 CALL init_cell(cell=tmc_env%params%cell)
201 itmp = bcast_group
202 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, &
203 dest=itmp, &
204 para_env=tmc_env%tmc_comp_set%para_env_sub_group, &
205 tmc_params=tmc_env%params)
207 work_stat = tmc_canceling_receipt
208 itmp = master_comm_id
209 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, &
210 dest=itmp, &
211 para_env=para_env_m_w, &
212 tmc_params=tmc_env%params)
213 CASE (tmc_status_failed)
214 IF (debug >= 1) THEN
215 WRITE (tmc_env%w_env%io_unit, *) "master worker of group", &
216 tmc_env%tmc_comp_set%group_nr, " exit work time."
217 END IF
218 EXIT master_work_time
219 !-- group master read the CP2K input file, and write data to master
221 IF (tmc_env%w_env%env_id_ener > 0) THEN
222 itmp = tmc_env%w_env%env_id_ener
223 ELSE
224 itmp = tmc_env%w_env%env_id_approx
225 END IF
226 CALL get_initial_conf(tmc_params=tmc_env%params, init_conf=conf, &
227 env_id=itmp)
228 ! send start configuration back to master
230 itmp = master_comm_id
231 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, &
232 dest=itmp, &
233 para_env=para_env_m_w, &
234 tmc_params=tmc_env%params, elem=conf, &
235 wait_for_message=.true.)
236
237 IF (ASSOCIATED(tmc_env%tmc_comp_set%para_env_m_first_w)) THEN
238 CALL communicate_atom_types(atoms=tmc_env%params%atoms, &
239 source=1, &
240 para_env=tmc_env%tmc_comp_set%para_env_m_first_w)
241 END IF
242 !-- calculate the approximate energy
244 cpassert(tmc_env%w_env%env_id_approx > 0)
245 itmp = bcast_group
246 !-- DISTRIBUTING WORK (group master) to all other group members
247 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, &
248 dest=itmp, &
249 para_env=tmc_env%tmc_comp_set%para_env_sub_group, &
250 tmc_params=tmc_env%params, elem=conf)
251 CALL calc_potential_energy(conf=conf, &
252 env_id=tmc_env%w_env%env_id_approx, &
253 exact_approx_pot=.false., &
254 tmc_env=tmc_env)
256 itmp = master_comm_id
257 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, &
258 dest=itmp, &
259 para_env=para_env_m_w, &
260 tmc_params=tmc_env%params, elem=conf)
261 ! -- Nested Monte Carlo routines
263 CALL clear_move_probs(tmc_env%params%nmc_move_types)
264 itmp = bcast_group
265 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, &
266 dest=itmp, &
267 para_env=tmc_env%tmc_comp_set%para_env_sub_group, &
268 tmc_params=tmc_env%params, elem=conf)
269 !-- collective calculation for MD/NMC steps
270 IF (work_stat == tmc_stat_nmc_request) THEN
271 !-- calculate MD steps, in case of 2 different potentials do nested Monte Carlo
272 CALL nested_markov_chain_mc(conf=conf, &
273 env_id=tmc_env%w_env%env_id_approx, &
274 tmc_env=tmc_env, calc_status=calc_stat)
275 ELSE IF (work_stat == tmc_stat_md_request) THEN
276 !TODO Hybrid MC routine
277 cpabort("there is no Hybrid MC implemented yet.")
278
279 ELSE
280 cpabort("unknown task type for workers.")
281 END IF
282 !-- in case of cancelation send receipt
283 itmp = master_comm_id
284 CALL tmc_message(msg_type=calc_stat, send_recv=recv_msg, &
285 dest=itmp, &
286 para_env=para_env_m_w, &
287 tmc_params=tmc_env%params, &
288 success=flag)
289 SELECT CASE (calc_stat)
291 SELECT CASE (work_stat)
293 work_stat = tmc_stat_md_result
295 work_stat = tmc_stat_nmc_result
296 CASE DEFAULT
297 CALL cp_abort(__location__, &
298 "unknown work status after possible NMC subgroup "// &
299 "cancelation, work_stat="//cp_to_string(work_stat))
300 END SELECT
302 work_stat = tmc_canceling_receipt
303 CASE DEFAULT
304 CALL cp_abort(__location__, &
305 "unknown calc status before sending NMC result "// &
306 cp_to_string(calc_stat))
307 END SELECT
308 ! send message back to master
309 itmp = master_comm_id
310 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, &
311 dest=itmp, &
312 para_env=para_env_m_w, &
313 tmc_params=tmc_env%params, elem=conf)
315 cpassert(tmc_env%w_env%env_id_ener > 0)
316 !-- DISTRIBUTING WORK (group master) to all other group members
317 itmp = bcast_group
318 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, &
319 dest=itmp, &
320 para_env=tmc_env%tmc_comp_set%para_env_sub_group, &
321 tmc_params=tmc_env%params, elem=conf)
322
323 CALL calc_potential_energy(conf=conf, &
324 env_id=tmc_env%w_env%env_id_ener, &
325 exact_approx_pot=.true., &
326 tmc_env=tmc_env)
327 !-- in case of cancelation send receipt
328 flag = .false.
329 itmp = master_comm_id
330 CALL tmc_message(msg_type=calc_stat, send_recv=recv_msg, &
331 dest=itmp, &
332 para_env=para_env_m_w, &
333 tmc_params=tmc_env%params, success=flag)
334 SELECT CASE (calc_stat)
336 SELECT CASE (work_stat)
338 work_stat = tmc_stat_energy_result
339 !-- if nessesary get the exact dipoles (for e.g. quantum potential)
340 IF (tmc_env%params%print_dipole) THEN
341 c_tmp = "[DIPOLE]"
342 CALL get_result_r1(env_id=tmc_env%w_env%env_id_ener, &
343 description=c_tmp, n=3, result=conf%dipole, &
344 res_exist=flag, ierr=ierr)
345 IF (.NOT. flag) tmc_env%params%print_dipole = .false.
346 ! TODO maybe let run with the changed option, but inform user properly
347 IF (.NOT. flag) THEN
348 CALL cp_abort(__location__, &
349 "TMC: The requested dipoles are not porvided by the "// &
350 "force environment.")
351 END IF
352 END IF
353 CASE DEFAULT
354 CALL cp_abort(__location__, &
355 "energy worker should handle unknown stat "// &
356 cp_to_string(work_stat))
357 END SELECT
359 work_stat = tmc_canceling_receipt
360 CASE DEFAULT
361 CALL cp_abort(__location__, &
362 "worker while energy calc is in unknown state "// &
363 cp_to_string(work_stat))
364 END SELECT
365
366 !-- send information back to master
367 IF (debug >= 1) THEN
368 WRITE (tmc_env%w_env%io_unit, *) "worker group ", &
369 tmc_env%tmc_comp_set%group_nr, &
370 "calculations done, send result energy", conf%potential
371 END IF
372 itmp = master_comm_id
373 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, &
374 dest=itmp, &
375 para_env=para_env_m_w, &
376 tmc_params=tmc_env%params, elem=conf)
378 cpassert(ASSOCIATED(ana_restart_conf))
379 cpassert(SIZE(ana_restart_conf) == tmc_env%params%nr_temp)
380 cpassert(PRESENT(ana_list))
381 cpassert(ASSOCIATED(ana_list))
382 itmp = master_comm_id
383 CALL communicate_atom_types(atoms=tmc_env%params%atoms, &
384 source=itmp, para_env=tmc_env%tmc_comp_set%para_env_m_ana)
385
386 num_dim = SIZE(conf%pos)
387 DO itmp = 1, tmc_env%params%nr_temp
388 ! do not forget to nullify the pointer at the end, deallcoated at tmc_env%params
389 ana_list(itmp)%temp%temperature = tmc_env%params%Temp(itmp)
390 ana_list(itmp)%temp%atoms => tmc_env%params%atoms
391 ana_list(itmp)%temp%cell => tmc_env%params%cell
392! ana_list(itmp)%temp%io_unit = tmc_env%w_env%io_unit
393
394 CALL analysis_init(ana_env=ana_list(itmp)%temp, nr_dim=num_dim)
395 ana_list(itmp)%temp%print_test_output = tmc_env%params%print_test_output
396 IF (.NOT. ASSOCIATED(conf)) THEN
397 CALL allocate_new_sub_tree_node(tmc_params=tmc_env%params, &
398 next_el=conf, nr_dim=num_dim)
399 END IF
400 CALL analysis_restart_read(ana_env=ana_list(itmp)%temp, &
401 elem=conf)
402 !check if we have the read the file
403 flag = .false.
404 IF ((.NOT. ASSOCIATED(ana_list(itmp)%temp%last_elem)) .AND. &
405 ana_restart_conf(itmp) > 0) THEN
406 flag = .true.
407 i1 = 0
408 i2 = ana_restart_conf(itmp)
409 CALL cp_warn(__location__, &
410 "analysis old trajectory up to "// &
411 "elem "//cp_to_string(ana_restart_conf(itmp))// &
412 ". Read trajectory file.")
413 ELSE IF (ASSOCIATED(ana_list(itmp)%temp%last_elem)) THEN
414 IF (.NOT. (ana_list(itmp)%temp%last_elem%nr == ana_restart_conf(itmp))) THEN
415 flag = .true.
416 i1 = ana_list(itmp)%temp%last_elem%nr
417 i2 = ana_restart_conf(itmp)
418 CALL cp_warn(__location__, &
419 "analysis restart with the incorrect configuration "// &
420 "TMC "//cp_to_string(ana_restart_conf(itmp))// &
421 " ana "//cp_to_string(ana_list(itmp)%temp%last_elem%nr)// &
422 ". REread trajectory file.")
423 END IF
424 END IF
425 IF (flag) THEN
426 CALL analyze_file_configurations(start_id=i1, &
427 end_id=i2, &
428 ana_env=ana_list(itmp)%temp, &
429 tmc_params=tmc_env%params)
430 END IF
431 END DO
433 cpassert(PRESENT(ana_list))
434 cpassert(ASSOCIATED(ana_list(conf%sub_tree_nr)%temp))
435 CALL do_tmc_analysis(elem=conf, &
436 ana_env=ana_list(conf%sub_tree_nr)%temp)
437 work_stat = tmc_stat_analysis_result
438 itmp = master_comm_id
439 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, &
440 dest=itmp, &
441 para_env=para_env_m_w, &
442 tmc_params=tmc_env%params, elem=conf)
443 CASE DEFAULT
444 CALL cp_abort(__location__, &
445 "worker received unknown message task type "// &
446 cp_to_string(work_stat))
447 END SELECT
448
449 IF (debug >= 1 .AND. work_stat /= tmc_status_wait_for_new_task) THEN
450 WRITE (tmc_env%w_env%io_unit, *) "worker: group ", &
451 tmc_env%tmc_comp_set%group_nr, &
452 "send back status:", work_stat
453 END IF
454 IF (ASSOCIATED(conf)) THEN
455 CALL deallocate_sub_tree_node(tree_elem=conf)
456 END IF
457 END DO master_work_time
458 !-- every other group paricipants----------------------------------------
459 ELSE
460 worker_work_time: DO
462 flag = .false.
463 itmp = bcast_group
464 CALL tmc_message(msg_type=work_stat, send_recv=recv_msg, &
465 dest=itmp, &
466 para_env=tmc_env%tmc_comp_set%para_env_sub_group, &
467 tmc_params=tmc_env%params, elem=conf)
468 calc_stat = tmc_status_calculating
469 SELECT CASE (work_stat)
471 CALL init_cell(cell=tmc_env%params%cell)
473 ! error message
474 CASE (tmc_status_failed)
475 EXIT worker_work_time
476 ! all group members have to calculate the (MD potential) energy together
478 cpassert(tmc_env%w_env%env_id_approx > 0)
479 !-- collective calculation of the potential energy of MD potential
480 SELECT CASE (tmc_env%params%task_type)
482 IF (tmc_env%params%NMC_inp_file /= "") THEN
483 conf%box_scale(:) = 1.0_dp
484 CALL calc_potential_energy(conf=conf, &
485 env_id=tmc_env%w_env%env_id_approx, &
486 exact_approx_pot=.false., &
487 tmc_env=tmc_env)
488 END IF
489 CASE DEFAULT
490 CALL cp_abort(__location__, &
491 "unknown task_type for participants in "// &
492 "START_CONF_RESULT request ")
493 END SELECT
494 !-- HMC - calculating MD steps
496 !-- collective calculation for MD/NMC steps
497 IF (work_stat == tmc_stat_nmc_request) THEN
498 !-- calculate MD steps, in case of 2 different potentials do nested Monte Carlo
499 CALL nested_markov_chain_mc(conf=conf, &
500 env_id=tmc_env%w_env%env_id_approx, &
501 tmc_env=tmc_env, calc_status=calc_stat)
502 ELSE IF (work_stat == tmc_stat_md_request) THEN
503 !TODO Hybrid MC routine
504 cpabort("there is no Hybrid MC implemented yet.")
505
506 ELSE
507 cpabort("unknown task type for workers.")
508 END IF
509 !-- energy calculations
511 !--- do calculate energy
512 cpassert(tmc_env%w_env%env_id_approx > 0)
513 CALL calc_potential_energy(conf=conf, &
514 env_id=tmc_env%w_env%env_id_approx, &
515 exact_approx_pot=.false., &
516 tmc_env=tmc_env)
518 !--- do calculate energy
519 cpassert(tmc_env%w_env%env_id_ener > 0)
520 CALL calc_potential_energy(conf=conf, &
521 env_id=tmc_env%w_env%env_id_ener, &
522 exact_approx_pot=.true., &
523 tmc_env=tmc_env)
524 CASE DEFAULT
525 CALL cp_abort(__location__, &
526 "group participant got unknown working type "// &
527 cp_to_string(work_stat))
528 END SELECT
529 IF (ASSOCIATED(conf)) THEN
530 CALL deallocate_sub_tree_node(tree_elem=conf)
531 END IF
532 END DO worker_work_time
533 END IF
534 ! --------------------------------------------------------------------
535 ! finalizing analysis, writing files etc.
536 IF (ASSOCIATED(tmc_env%tmc_comp_set%para_env_m_ana)) THEN
537 DO itmp = 1, tmc_env%params%nr_temp
538 CALL analysis_restart_print(ana_env=ana_list(itmp)%temp)
539 IF (ASSOCIATED(conf)) THEN
540 CALL deallocate_sub_tree_node(tree_elem=ana_list(itmp)%temp%last_elem)
541 END IF
542 CALL finalize_tmc_analysis(ana_list(itmp)%temp)
543 END DO
544 END IF
545 !-- stopping and finalizing
546 ! sending back receipt for stopping
547 IF (master) THEN
548 ! NOT the analysis group
549 IF (tmc_env%tmc_comp_set%group_nr > 0) THEN
550 ! remove the communicator in the external control for receiving exit tags
551 ! and sending additional information (e.g. the intermediate scf energies)
552 IF (tmc_env%params%use_scf_energy_info) THEN
553 IF (tmc_env%w_env%env_id_ener > 0) THEN
554 itmp = tmc_env%w_env%env_id_ener
555 ELSE
556 itmp = tmc_env%w_env%env_id_approx
557 END IF
558 CALL remove_intermediate_info_comm(env_id=itmp)
559 END IF
560 END IF
561 IF (ASSOCIATED(tmc_env%tmc_comp_set%para_env_sub_group)) THEN
562 CALL stop_whole_group(para_env=tmc_env%tmc_comp_set%para_env_sub_group, &
563 tmc_params=tmc_env%params)
564 END IF
565
566 work_stat = tmc_status_stop_receipt
567 itmp = master_comm_id
568 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, dest=itmp, &
569 para_env=para_env_m_w, &
570 tmc_params=tmc_env%params)
571 ELSE IF (ASSOCIATED(tmc_env%tmc_comp_set%para_env_sub_group)) THEN
572 work_stat = tmc_status_stop_receipt
573 itmp = master_comm_id
574 CALL tmc_message(msg_type=work_stat, send_recv=send_msg, dest=itmp, &
575 para_env=tmc_env%tmc_comp_set%para_env_sub_group, &
576 tmc_params=tmc_env%params)
577 END IF
578
579 IF (debug >= 5) THEN
580 WRITE (tmc_env%w_env%io_unit, *) "worker ", &
581 tmc_env%tmc_comp_set%para_env_sub_group%mepos, "of group ", &
582 tmc_env%tmc_comp_set%group_nr, "stops working!"
583 END IF
584
585 IF (PRESENT(ana_list)) THEN
586 DO itmp = 1, tmc_env%params%nr_temp
587 ana_list(itmp)%temp%atoms => null()
588 ana_list(itmp)%temp%cell => null()
589 END DO
590 END IF
591 IF (ASSOCIATED(conf)) THEN
592 CALL deallocate_sub_tree_node(tree_elem=conf)
593 END IF
594 IF (ASSOCIATED(ana_restart_conf)) DEALLOCATE (ana_restart_conf)
595
596 ! end the timing
597 CALL timestop(handle)
598 END SUBROUTINE do_tmc_worker
599
600! **************************************************************************************************
601!> \brief Nested Monte Carlo (NMC), do several Markov Chain Monte Carlo steps
602!> usually using the approximate potential, could be also Hybrid MC.
603!> The amount of steps are predefined by the user, but should be huge
604!> enough to reach the equilibrium state for this potential
605!> \param conf ...
606!> \param env_id ...
607!> \param tmc_env ...
608!> \param calc_status ...
609!> \param
610!> \author Mandes 11.2012
611! **************************************************************************************************
612 SUBROUTINE nested_markov_chain_mc(conf, env_id, tmc_env, calc_status)
613 TYPE(tree_type), POINTER :: conf
614 INTEGER, INTENT(IN) :: env_id
615 TYPE(tmc_env_type), POINTER :: tmc_env
616 INTEGER, INTENT(OUT) :: calc_status
617
618 CHARACTER(LEN=*), PARAMETER :: routinen = 'nested_markov_chain_MC'
619
620 INTEGER :: comm_dest, handle, substeps
621 LOGICAL :: accept, change_rejected, flag
622 REAL(kind=dp) :: rnd_nr
623 TYPE(tree_type), POINTER :: last_acc_conf
624
625 NULLIFY (last_acc_conf)
626
627 cpassert(ASSOCIATED(tmc_env))
628 cpassert(ASSOCIATED(tmc_env%params))
629 cpassert(ASSOCIATED(tmc_env%tmc_comp_set))
630 cpassert(ALLOCATED(tmc_env%rng_stream))
631 cpassert(ASSOCIATED(conf))
632 cpassert(conf%temp_created > 0)
633 cpassert(conf%temp_created <= tmc_env%params%nr_temp)
634 cpassert(env_id > 0)
635 mark_used(env_id)
636
637 ! start the timing
638 CALL timeset(routinen, handle)
639
640 CALL allocate_new_sub_tree_node(tmc_params=tmc_env%params, &
641 next_el=last_acc_conf, nr_dim=SIZE(conf%pos))
642
643 last_acc_conf%pos = conf%pos
644 last_acc_conf%box_scale = conf%box_scale
645
646 ! energy of the last accepted configuration
647 CALL calc_potential_energy(conf=last_acc_conf, &
648 env_id=tmc_env%w_env%env_id_approx, exact_approx_pot=.false., &
649 tmc_env=tmc_env)
650
651 nmc_steps: DO substeps = 1, int(tmc_env%params%move_types%mv_size(mv_type_nmc_moves, 1))
652 ! check for canceling message
653 IF (ASSOCIATED(tmc_env%tmc_comp_set%para_env_m_w)) THEN
654 flag = .false.
655 comm_dest = master_comm_id
656 ! check for new canceling message
657 CALL tmc_message(msg_type=calc_status, send_recv=recv_msg, &
658 dest=comm_dest, &
659 para_env=tmc_env%tmc_comp_set%para_env_m_w, &
660 tmc_params=tmc_env%params, success=flag)
661 END IF
662 comm_dest = bcast_group
663 CALL tmc_message(msg_type=calc_status, send_recv=send_msg, &
664 dest=comm_dest, &
665 para_env=tmc_env%tmc_comp_set%para_env_sub_group, &
666 tmc_params=tmc_env%params)
667 SELECT CASE (calc_status)
669 ! keep on working
671 ! nothing to do, because calculation CANCELING, exit with cancel status
672 EXIT nmc_steps
673 CASE DEFAULT
674 CALL cp_abort(__location__, &
675 "unknown status "//cp_to_string(calc_status)// &
676 "in the NMC routine, expect only caneling status. ")
677 END SELECT
678
679 ! set move type
680 CALL tmc_env%rng_stream%set( &
681 bg=conf%rng_seed(:, :, 1), cg=conf%rng_seed(:, :, 2), &
682 ig=conf%rng_seed(:, :, 3))
683 conf%move_type = select_random_move_type( &
684 move_types=tmc_env%params%nmc_move_types, &
685 rnd=tmc_env%rng_stream%next())
686 CALL tmc_env%rng_stream%get( &
687 bg=conf%rng_seed(:, :, 1), cg=conf%rng_seed(:, :, 2), &
688 ig=conf%rng_seed(:, :, 3))
689
690 ! do move
691 CALL change_pos(tmc_params=tmc_env%params, &
692 move_types=tmc_env%params%nmc_move_types, &
693 rng_stream=tmc_env%rng_stream, &
694 elem=conf, mv_conf=1, new_subbox=.false., &
695 move_rejected=change_rejected)
696 ! for Hybrid MC the change_pos is only velocity change,
697 ! the actual MD step hast to be done in this module for communication reason
698 IF (conf%move_type == mv_type_md) THEN
699 !TODO implement the MD part
700 !CALL calc_MD_step(...)
701 !CALL calc_calc_e_kin(...)
702 CALL cp_abort(__location__, &
703 "Hybrid MC is not implemented yet, "// &
704 "(no MD section in TMC yet). ")
705 END IF
706
707 ! update the subbox acceptance probabilities
708 CALL prob_update(move_types=tmc_env%params%nmc_move_types, elem=conf, &
709 acc=.NOT. change_rejected, subbox=.true., &
710 prob_opt=tmc_env%params%esimate_acc_prob)
711
712 ! calculate potential energy if necessary
713 IF (.NOT. change_rejected) THEN
714 CALL calc_potential_energy(conf=conf, &
715 env_id=tmc_env%w_env%env_id_approx, exact_approx_pot=.false., &
716 tmc_env=tmc_env)
717 ELSE
718 conf%e_pot_approx = huge(conf%e_pot_approx)
719 END IF
720
721 !check NMC step
722 CALL tmc_env%rng_stream%set( &
723 bg=conf%rng_seed(:, :, 1), cg=conf%rng_seed(:, :, 2), &
724 ig=conf%rng_seed(:, :, 3))
725 rnd_nr = tmc_env%rng_stream%next()
726 CALL tmc_env%rng_stream%get( &
727 bg=conf%rng_seed(:, :, 1), cg=conf%rng_seed(:, :, 2), &
728 ig=conf%rng_seed(:, :, 3))
729
730 IF (.NOT. change_rejected) THEN
731 CALL acceptance_check(tree_element=conf, parent_element=last_acc_conf, &
732 tmc_params=tmc_env%params, &
733 temperature=tmc_env%params%Temp(conf%temp_created), &
734 diff_pot_check=.false., &
735 accept=accept, approx_ener=.true., rnd_nr=rnd_nr)
736 ELSE
737 accept = .false.
738 END IF
739 ! update the NMC accpetance per move
740 CALL prob_update(move_types=tmc_env%params%nmc_move_types, elem=conf, &
741 acc=accept, prob_opt=tmc_env%params%esimate_acc_prob)
742
743 ! update last accepted configuration or actual configuration
744 IF (accept .AND. (.NOT. change_rejected)) THEN
745 last_acc_conf%pos = conf%pos
746 last_acc_conf%vel = conf%vel
747 last_acc_conf%e_pot_approx = conf%e_pot_approx
748 last_acc_conf%ekin = conf%ekin
749 last_acc_conf%ekin_before_md = conf%ekin_before_md
750 last_acc_conf%box_scale = conf%box_scale
751 ELSE
752 conf%pos = last_acc_conf%pos
753 conf%vel = last_acc_conf%vel
754 conf%box_scale = last_acc_conf%box_scale
755 END IF
756 END DO nmc_steps
757
758 ! result values of Nested Monte Carlo (NMC) steps
759 ! regard that the calculated potential energy is the one of the approximated potential
760 conf%pos = last_acc_conf%pos
761 conf%vel = last_acc_conf%vel
762 conf%e_pot_approx = last_acc_conf%e_pot_approx
763 conf%potential = 0.0_dp
764 conf%ekin = last_acc_conf%ekin
765 conf%ekin_before_md = last_acc_conf%ekin_before_md
766
767 CALL deallocate_sub_tree_node(tree_elem=last_acc_conf)
768
769 ! end the timing
770 CALL timestop(handle)
771 END SUBROUTINE nested_markov_chain_mc
772
773! **************************************************************************************************
774!> \brief get the initial confuguration (pos,...)
775!> \param tmc_params ...
776!> \param init_conf the structure the data should be stored
777!> force_env
778!> \param env_id ...
779!> \author Mandes 11.2012
780! **************************************************************************************************
781 SUBROUTINE get_initial_conf(tmc_params, init_conf, env_id)
782 TYPE(tmc_param_type), POINTER :: tmc_params
783 TYPE(tree_type), POINTER :: init_conf
784 INTEGER :: env_id
785
786 CHARACTER(LEN=*), PARAMETER :: routinen = 'get_initial_conf'
787
788 INTEGER :: handle, ierr, mol, ndim, nr_atoms
789 TYPE(cp_subsys_type), POINTER :: subsys
790 TYPE(f_env_type), POINTER :: f_env
791 TYPE(molecule_list_type), POINTER :: molecule_new
792
793 cpassert(.NOT. ASSOCIATED(init_conf))
794
795 ! start the timing
796 CALL timeset(routinen, handle)
797
798 ! get positions
799 CALL get_natom(env_id=env_id, n_atom=nr_atoms, ierr=ierr)
800 cpassert(ierr == 0)
801 ndim = 3*nr_atoms
802 CALL allocate_new_sub_tree_node(tmc_params=tmc_params, &
803 next_el=init_conf, nr_dim=ndim)
804 CALL get_pos(env_id=env_id, pos=init_conf%pos, n_el=SIZE(init_conf%pos), &
805 ierr=ierr)
806
807 ! get the molecule info
808 CALL f_env_get_from_id(env_id, f_env)
809 CALL force_env_get(f_env%force_env, subsys=subsys)
810
811 CALL cp_subsys_get(subsys=subsys, molecules=molecule_new)
812 loop_mol: DO mol = 1, SIZE(molecule_new%els(:))
813 init_conf%mol(molecule_new%els(mol)%first_atom: &
814 molecule_new%els(mol)%last_atom) = mol
815 END DO loop_mol
816
817 ! end the timing
818 CALL timestop(handle)
819
820 END SUBROUTINE get_initial_conf
821
822! **************************************************************************************************
823!> \brief get the pointer to the atoms, for easy handling
824!> \param env_id ...
825!> \param atoms pointer to atomic_kind
826!> \param cell ...
827!> \author Mandes 01.2013
828! **************************************************************************************************
829 SUBROUTINE get_atom_kinds_and_cell(env_id, atoms, cell)
830 INTEGER :: env_id
831 TYPE(tmc_atom_type), DIMENSION(:), POINTER :: atoms
832 TYPE(cell_type), POINTER :: cell
833
834 INTEGER :: iparticle, nr_atoms, nunits_tot
835 TYPE(cell_type), POINTER :: cell_tmp
836 TYPE(cp_subsys_type), POINTER :: subsys
837 TYPE(f_env_type), POINTER :: f_env
838 TYPE(particle_list_type), POINTER :: particles
839
840 NULLIFY (f_env, subsys, particles)
841 nr_atoms = 0
842
843 cpassert(env_id > 0)
844 cpassert(.NOT. ASSOCIATED(atoms))
845 cpassert(.NOT. ASSOCIATED(cell))
846
847 CALL f_env_get_from_id(env_id, f_env)
848 nr_atoms = force_env_get_natom(f_env%force_env)
849 CALL force_env_get(f_env%force_env, subsys=subsys, cell=cell_tmp)
850 ALLOCATE (cell)
851 CALL cell_copy(cell_in=cell_tmp, cell_out=cell)
852
853 !get atom kinds
854 CALL allocate_tmc_atom_type(atoms, nr_atoms)
855 CALL cp_subsys_get(subsys, particles=particles)
856 nunits_tot = SIZE(particles%els(:))
857 IF (nunits_tot > 0) THEN
858 DO iparticle = 1, nunits_tot
859 atoms(iparticle)%name = particles%els(iparticle)%atomic_kind%name
860 atoms(iparticle)%mass = particles%els(iparticle)%atomic_kind%mass
861 END DO
862 cpassert(iparticle - 1 == nr_atoms)
863 END IF
864 END SUBROUTINE get_atom_kinds_and_cell
865
866! **************************************************************************************************
867!> \brief set the communicator in the SCF environment
868!> to receive the intermediate energies on the (global) master side
869!> \param comm the master-worker communicator
870!> \param env_id the ID of the related force environment
871!> \author Mandes 10.2013
872! **************************************************************************************************
873 SUBROUTINE set_intermediate_info_comm(comm, env_id)
874 CLASS(mp_comm_type), INTENT(IN) :: comm
875 INTEGER :: env_id
876
877 CHARACTER(LEN=default_string_length) :: description
878 REAL(kind=dp), DIMENSION(3) :: values
879 TYPE(cp_result_type), POINTER :: results
880 TYPE(cp_subsys_type), POINTER :: subsys
881 TYPE(f_env_type), POINTER :: f_env
882
883 NULLIFY (results, subsys)
884 cpassert(env_id > 0)
885
886 CALL f_env_get_from_id(env_id, f_env)
887
888 cpassert(ASSOCIATED(f_env))
889 cpassert(ASSOCIATED(f_env%force_env))
890 IF (.NOT. ASSOCIATED(f_env%force_env%qs_env)) THEN
891 CALL cp_abort(__location__, &
892 "the intermediate SCF energy request can not be set "// &
893 "employing this force environment! ")
894 END IF
895
896 ! set the information
897 values(1) = real(comm%get_handle(), kind=dp)
898 values(2) = real(master_comm_id, kind=dp)
899 values(3) = real(tmc_stat_scf_step_ener_receive, kind=dp)
900 description = "[EXT_SCF_ENER_COMM]"
901
902 ! set the communicator information in the qs_env result container
903 CALL force_env_get(f_env%force_env, subsys=subsys)
904 CALL cp_subsys_get(subsys, results=results)
905 CALL put_results(results, description=description, values=values)
906 END SUBROUTINE set_intermediate_info_comm
907
908! **************************************************************************************************
909!> \brief set the communicator in the SCF environment
910!> to receive the intermediate energies on the (global) master side
911!> \param env_id the ID of the related force environment
912!> \author Mandes 10.2013
913! **************************************************************************************************
914 SUBROUTINE remove_intermediate_info_comm(env_id)
915 INTEGER :: env_id
916
917 CHARACTER(LEN=default_string_length) :: description
918 TYPE(cp_result_type), POINTER :: results
919 TYPE(cp_subsys_type), POINTER :: subsys
920 TYPE(f_env_type), POINTER :: f_env
921
922 NULLIFY (subsys, results)
923 cpassert(env_id > 0)
924
925 CALL f_env_get_from_id(env_id, f_env)
926
927 cpassert(ASSOCIATED(f_env))
928 cpassert(ASSOCIATED(f_env%force_env))
929 IF (.NOT. ASSOCIATED(f_env%force_env%qs_env)) THEN
930 CALL cp_abort(__location__, &
931 "the SCF intermediate energy communicator can not be "// &
932 "removed! ")
933 END IF
934
935 description = "[EXT_SCF_ENER_COMM]"
936
937 ! set the communicator information in the qs_env result container
938 CALL force_env_get(f_env%force_env, subsys=subsys)
939 CALL cp_subsys_get(subsys, results=results)
940 CALL cp_results_erase(results, description=description)
941 END SUBROUTINE remove_intermediate_info_comm
942
943END 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:137
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, cell_ref, use_ref_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, ipi_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:401
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 defining parameters related to the simulation cell.
Definition cell_types.F:60
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