(git:34ef472)
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 
30 MODULE tmc_worker
31  USE cell_methods, ONLY: init_cell
32  USE cell_types, ONLY: cell_copy,&
33  cell_type
35  USE cp_log_handling, ONLY: cp_to_string
37  put_results
38  USE cp_result_types, ONLY: cp_result_type
39  USE cp_subsys_types, ONLY: cp_subsys_get,&
40  cp_subsys_type
41  USE f77_interface, ONLY: f_env_get_from_id,&
42  f_env_type,&
43  get_natom,&
44  get_pos,&
46  USE force_env_types, ONLY: force_env_get,&
48  USE kinds, ONLY: default_string_length,&
49  dp
50  USE message_passing, ONLY: mp_comm_type,&
51  mp_para_env_type
52  USE molecule_list_types, ONLY: molecule_list_type
53  USE particle_list_types, ONLY: particle_list_type
54  USE tmc_analysis, ONLY: analysis_init,&
60  USE tmc_analysis_types, ONLY: tmc_ana_list_type
62  USE tmc_messages, ONLY: bcast_group,&
66  recv_msg,&
67  send_msg,&
71  prob_update,&
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
89  tmc_atom_type,&
90  tmc_env_type,&
91  tmc_param_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 
105 CONTAINS
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
180  work_stat = tmc_status_wait_for_new_task
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)
203  CASE (tmc_canceling_message)
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
225  work_stat = tmc_stat_start_conf_result
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)
287  CASE (tmc_stat_md_request)
288  work_stat = tmc_stat_md_result
289  CASE (tmc_stat_nmc_request)
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
296  CASE (tmc_canceling_message)
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
352  CASE (tmc_canceling_message)
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
451  work_stat = tmc_status_wait_for_new_task
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)
462  CASE (tmc_canceling_message)
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
655  CASE (tmc_canceling_message)
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 
926 END MODULE tmc_worker
Handles all functions related to the CELL.
Definition: cell_methods.F:15
subroutine, public init_cell(cell, hmat, periodic)
Initialise/readjust a simulation cell after hmat has been changed.
Definition: cell_methods.F:117
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
Definition: f77_interface.F:20
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
subroutine, public get_result_r1(env_id, description, N, RESULT, res_exist, ierr)
gets a result from CP2K that is a real 1D array
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,...
Definition: tmc_analysis.F:16
subroutine, public analysis_restart_read(ana_env, elem)
read analysis restart file
Definition: tmc_analysis.F:366
subroutine, public finalize_tmc_analysis(ana_env)
call all the necessarry analysis printing routines
Definition: tmc_analysis.F:587
subroutine, public analyze_file_configurations(start_id, end_id, dir_ind, ana_env, tmc_params)
read the files and analyze the configurations
Definition: tmc_analysis.F:633
subroutine, public analysis_init(ana_env, nr_dim)
initialize all the necessarry analysis structures
Definition: tmc_analysis.F:204
subroutine, public do_tmc_analysis(elem, ana_env)
call all the necessarry analysis routines analysis the previous element with the weight of the differ...
Definition: tmc_analysis.F:465
subroutine, public analysis_restart_print(ana_env)
print analysis restart file
Definition: tmc_analysis.F:269
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...
Definition: tmc_messages.F:19
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 ...
Definition: tmc_messages.F:116
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
Definition: tmc_messages.F:64
logical function, public check_if_group_master(para_env)
checks if the core is the group master
Definition: tmc_messages.F:85
integer, parameter, public master_comm_id
Definition: tmc_messages.F:63
subroutine, public stop_whole_group(para_env, worker_info, tmc_params)
send stop command to all group participants
logical, parameter, public send_msg
Definition: tmc_messages.F:49
logical, parameter, public recv_msg
Definition: tmc_messages.F:50
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