(git:e7e05ae)
tmc_tree_acceptance.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 tree nodes acceptance
10 !> code is separated in 3 parts, first the acceptance criteria,
11 !> second the tree node acceptance handling, searching etc. and
12 !> than the acceptance probability handling
13 !> \par History
14 !> 11.2012 created [Mandes Schoenherr]
15 !> \author Mandes
16 ! **************************************************************************************************
17 
19  USE cp_log_handling, ONLY: cp_to_string
20  USE kinds, ONLY: dp
21  USE physcon, ONLY: boltzmann,&
22  joule
25  USE tmc_dot_tree, ONLY: create_dot_color,&
28  USE tmc_move_handle, ONLY: prob_update
29  USE tmc_move_types, ONLY: mv_type_md,&
37  USE tmc_tree_types, ONLY: &
38  add_to_list, global_tree_type, gt_elem_list_type, status_accepted, status_accepted_result, &
43  USE tmc_types, ONLY: tmc_env_type,&
44  tmc_param_type
45 #include "../base/base_uses.f90"
46 
47  IMPLICIT NONE
48 
49  PRIVATE
50 
51  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'tmc_tree_acceptance'
52 
53  PUBLIC :: acceptance_check
56  PUBLIC :: tree_update
57 
58  INTEGER, PARAMETER :: DEBUG = 0
59 
60 CONTAINS
61 
62  !============================================================================
63  ! acceptance criteria calculations
64  !============================================================================
65 ! **************************************************************************************************
66 !> \brief standard Monte Carlo and 2 potential acceptance check
67 !> acceptance check of move from old(last accepted) to new configuration
68 !> the sum of kinetic and potential energy is used
69 !> acc(o->n)=min(1,exp( -beta*(H(n)-H(o)) ))
70 !> \param tree_element new/actual configuration
71 !> \param parent_element last accepted configuration
72 !> \param tmc_params TMC global parameters
73 !> \param temperature actual temperature configuration should be checked with
74 !> \param diff_pot_check 2potential check or not?
75 !> \param accept result (configuration accepted of rejected)
76 !> \param rnd_nr random number for acceptance check
77 !> \param approx_ener for NMC the approximated energies schould be used
78 !> \author Mandes 12.2012
79 ! **************************************************************************************************
80  SUBROUTINE acceptance_check(tree_element, parent_element, tmc_params, &
81  temperature, diff_pot_check, accept, rnd_nr, &
82  approx_ener)
83  TYPE(tree_type), POINTER :: tree_element, parent_element
84  TYPE(tmc_param_type), POINTER :: tmc_params
85  REAL(kind=dp) :: temperature
86  LOGICAL :: diff_pot_check, accept
87  REAL(kind=dp) :: rnd_nr
88  LOGICAL, OPTIONAL :: approx_ener
89 
90  CHARACTER(LEN=*), PARAMETER :: routinen = 'acceptance_check'
91 
92  INTEGER :: handle
93  REAL(kind=dp) :: ekin_last_acc, elem_ener, kb, parent_ener
94 
95  cpassert(ASSOCIATED(tree_element))
96  cpassert(ASSOCIATED(parent_element))
97  cpassert(ASSOCIATED(tmc_params))
98  cpassert(temperature .GT. 0.0_dp)
99  cpassert(rnd_nr .GE. 0.0_dp .AND. rnd_nr .LE. 1.0_dp)
100 
101  kb = boltzmann/joule
102 
103  ! start the timing
104  CALL timeset(routinen, handle)
105 
106  IF (tmc_params%task_type .EQ. task_type_gaussian_adaptation) THEN
107  cpabort("")
108 !TODO CALL acc_check_gauss_adapt(f=tree_element%potential, ct=tree_element%ekin_before_md, acc=accept)
109 !DO NOT DO RETURN
110  END IF
111 
112  !-- using 2 different potentials, the energy difference between these potentials
113  ! and the two configurations have to be regarded.
114  ! The ensamble should be in equilibrium state of the approximate potential
115  IF (diff_pot_check .AND. (tmc_params%NMC_inp_file .NE. "")) THEN
116  IF ((tree_element%potential .EQ. huge(tree_element%potential)) .OR. &
117  tree_element%e_pot_approx .EQ. huge(tree_element%e_pot_approx)) THEN
118  elem_ener = huge(elem_ener)
119  ELSE
120  !for different potentials we have to regard the differences in energy
121  ! min(1,e^{-\beta*[(E_{exact}(n)-E_{approx}(n))-(E_{exact}(o)-E_{approx}(o))]})
122  elem_ener = 1.0_dp/(kb*temperature)*tree_element%potential &
123  - 1.0_dp/(kb*tmc_params%Temp(tree_element%temp_created)) &
124  *tree_element%e_pot_approx
125  END IF
126  parent_ener = 1.0_dp/(kb*temperature)*parent_element%potential &
127  - 1.0_dp/(kb*tmc_params%Temp(tree_element%temp_created)) &
128  *parent_element%e_pot_approx
129 
130  !-- always accepted if new energy is smaller than old energy
131  IF (elem_ener .LE. parent_ener) THEN
132  accept = .true.
133  ELSE
134  !-- gaussian distributed acceptance if new energy is greater than old energy
135  IF (rnd_nr .LT. &
136  exp(-(elem_ener - parent_ener))) THEN
137  accept = .true.
138  ELSE
139  accept = .false.
140  END IF
141  END IF
142  ELSE
143  !-- standard MC check, but also using the kinetic energy for Hybrid Monte Carlo
144  IF (tree_element%move_type .EQ. mv_type_md) THEN
145  ekin_last_acc = tree_element%ekin_before_md
146  ! using the kinetic energy before velocity change
147  ELSE
148  ekin_last_acc = parent_element%ekin
149  END IF
150  ! comparing aproximated energies
151  IF (PRESENT(approx_ener)) THEN
152  elem_ener = tree_element%e_pot_approx &
153  + tree_element%ekin
154  parent_ener = parent_element%e_pot_approx &
155  + ekin_last_acc
156  ELSE
157  elem_ener = tree_element%potential &
158  + tree_element%ekin
159  parent_ener = parent_element%potential &
160  + ekin_last_acc
161  END IF
162 
163  !-- always accepted if new energy is smaller than old energy
164  IF (elem_ener .LE. parent_ener) THEN
165  accept = .true.
166  ELSE
167  !-- gaussian distributed acceptance if new energy is greater than old energy
168  IF (rnd_nr .LT. &
169  exp(-1.0_dp/(kb*temperature)*(elem_ener - parent_ener))) THEN
170  accept = .true.
171  ELSE
172  accept = .false.
173  END IF
174  END IF
175  END IF
176 
177  ! update the estimated energy acceptance probability distribution
178  IF (diff_pot_check) THEN
179  cpassert(ASSOCIATED(tmc_params%prior_NMC_acc))
180  tmc_params%prior_NMC_acc%counter = tmc_params%prior_NMC_acc%counter + 1
181  tmc_params%prior_NMC_acc%aver = (tmc_params%prior_NMC_acc%aver*(tmc_params%prior_NMC_acc%counter - 1) + &
182  ((elem_ener - parent_ener)))/real(tmc_params%prior_NMC_acc%counter, kind=dp)
183  tmc_params%prior_NMC_acc%aver_2 = (tmc_params%prior_NMC_acc%aver_2*(tmc_params%prior_NMC_acc%counter - 1) + &
184  (elem_ener - parent_ener)**2)/real(tmc_params%prior_NMC_acc%counter, kind=dp)
185  END IF
186 
187  ! end the timing
188  CALL timestop(handle)
189  END SUBROUTINE acceptance_check
190 
191 ! **************************************************************************************************
192 !> \brief parallel tempering swap acceptance check,
193 !> check swapped configurations of different temperatures
194 !> using sum of potential and kinetic energy
195 !> always accepted if energy of configuration with higher temperature
196 !> is smaller than energy of configuration with lower temperature
197 !> acc(o->n)=min(1,exp((beta_i-beta_j)*(U_i-U_j)))
198 !> \param tree_elem actual global tree element
199 !> \param conf1 sub tree element of lower temperature
200 !> \param conf2 sub tree element of higher temperature
201 !> \param tmc_params TMC environment parameters
202 !> \param accept acceptance of configurational change
203 !> \author Mandes 12.2012
204 ! **************************************************************************************************
205  SUBROUTINE swap_acceptance_check(tree_elem, conf1, conf2, tmc_params, accept)
206  TYPE(global_tree_type), POINTER :: tree_elem
207  TYPE(tree_type), POINTER :: conf1, conf2
208  TYPE(tmc_param_type), POINTER :: tmc_params
209  LOGICAL :: accept
210 
211  CHARACTER(LEN=*), PARAMETER :: routinen = 'swap_acceptance_check'
212 
213  INTEGER :: handle
214  REAL(kind=dp) :: delta, elem1_ener, elem2_ener, kb, vol1, &
215  vol2
216 
217  kb = boltzmann/joule
218 
219  cpassert(ASSOCIATED(tree_elem))
220  cpassert(tree_elem%rnd_nr .GE. 0.0_dp)
221  cpassert(ASSOCIATED(conf1))
222  cpassert(ASSOCIATED(conf2))
223  cpassert(ASSOCIATED(tmc_params))
224 
225  ! start the timing
226  CALL timeset(routinen, handle)
227 
228  IF (tmc_params%pressure .GT. 0.0_dp) THEN
229  ! pt-NVT
230  elem1_ener = conf1%potential &
231  + conf1%ekin
232  elem2_ener = conf2%potential &
233  + conf2%ekin
234  ! the swap is done with prob: exp((\beta_i-\beta_j)(U_i-U_j)),
235  ! BUT because they are already swaped we exchange the energies.
236  IF (tree_elem%rnd_nr .LT. exp((1.0_dp/(kb*tmc_params%Temp(tree_elem%mv_conf)) - &
237  1.0_dp/(kb*tmc_params%Temp(tree_elem%mv_conf + 1))) &
238  *(elem2_ener - elem1_ener))) THEN
239  accept = .true.
240  ELSE
241  accept = .false.
242  END IF
243  ELSE
244  ! pt-NpT (parallel Tempering with constant pressure, temperature and num. particle)
245  CALL get_scaled_cell(cell=tmc_params%cell, box_scale=conf1%box_scale, &
246  vol=vol1)
247  CALL get_scaled_cell(cell=tmc_params%cell, box_scale=conf2%box_scale, &
248  vol=vol2)
249  ! delta= (beta_m-beta_n)(U_n-U_m) + (beta_m*P_m-beta_n*P_n)(V_n-V_m)
250  delta = (1.0_dp/(kb*tmc_params%Temp(tree_elem%mv_conf)) &
251  - 1.0_dp/(kb*tmc_params%Temp(tree_elem%mv_conf + 1)))* &
252  ((conf2%potential + conf2%ekin) - (conf1%potential + conf1%ekin)) + &
253  (1.0_dp/(kb*tmc_params%Temp(tree_elem%mv_conf))*tmc_params%pressure &
254  - 1.0_dp/(kb*tmc_params%Temp(tree_elem%mv_conf + 1))*tmc_params%pressure)* &
255  (vol2 - vol1)
256  IF (tree_elem%rnd_nr .LT. exp(delta)) THEN
257  accept = .true.
258  ELSE
259  accept = .false.
260  END IF
261  END IF
262  ! end the timing
263  CALL timestop(handle)
264  END SUBROUTINE swap_acceptance_check
265 
266 ! **************************************************************************************************
267 !> \brief volume move acceptance check
268 !> sampling NPT, we need to do volume moves. Their acceptance are
269 !> checked regarding the old and new energy, the volume difference
270 !> and the constant pressure
271 !> \param parent_elem old tree element with old box size
272 !> \param new_elem actual tree element with new box size
273 !> \param temperature actual temperature
274 !> \param rnd_nr random number to check with
275 !> \param tmc_params TMC environment parameters
276 !> \param accept Monte Carlo move acceptance (result)
277 !> \author Mandes 12.2012
278 ! **************************************************************************************************
279  SUBROUTINE volume_acceptance_check(parent_elem, new_elem, temperature, &
280  rnd_nr, tmc_params, accept)
281  TYPE(tree_type), POINTER :: parent_elem, new_elem
282  REAL(kind=dp) :: temperature, rnd_nr
283  TYPE(tmc_param_type), POINTER :: tmc_params
284  LOGICAL :: accept
285 
286  CHARACTER(LEN=*), PARAMETER :: routinen = 'volume_acceptance_check'
287 
288  INTEGER :: handle
289  REAL(kind=dp) :: d_enthalpy, kb, n_vol, p_vol
290 
291  kb = boltzmann/joule
292 
293  cpassert(ASSOCIATED(parent_elem))
294  cpassert(ASSOCIATED(new_elem))
295  cpassert(temperature .GT. 0.0_dp)
296  cpassert(rnd_nr .GT. 0.0_dp)
297  cpassert(ASSOCIATED(tmc_params))
298  cpassert(tmc_params%pressure .GE. 0.0_dp)
299 
300  ! start the timing
301  CALL timeset(routinen, handle)
302 
303  CALL get_scaled_cell(cell=tmc_params%cell, box_scale=parent_elem%box_scale, &
304  vol=p_vol)
305  CALL get_scaled_cell(cell=tmc_params%cell, box_scale=new_elem%box_scale, &
306  vol=n_vol)
307  ! H=enthalpy, U=energy, P=pressure, V=volume, kB=Boltzmann constant, T=temperature, N=amount particle
308  ! delta_H = delta_U + P*delta_V - kB*T*N*ln(V_n/V_p)
309  IF (.false.) THEN
310  ! the volume move in volume space (dV)
311  d_enthalpy = (new_elem%potential - parent_elem%potential) + &
312  tmc_params%pressure*(n_vol - p_vol) - &
313  kb*temperature*(SIZE(new_elem%pos)/ &
314  tmc_params%dim_per_elem)* &
315  log(n_vol/p_vol)
316  ELSE
317  IF (tmc_params%v_isotropic) THEN
318  d_enthalpy = (new_elem%potential - parent_elem%potential) + &
319  tmc_params%pressure*(n_vol - p_vol) - &
320  kb*temperature*((SIZE(new_elem%pos)/ &
321  tmc_params%dim_per_elem) + 2/real(3, kind=dp))* &
322  log(n_vol/p_vol)
323  ELSE
324  d_enthalpy = (new_elem%potential - parent_elem%potential) + &
325  tmc_params%pressure*(n_vol - p_vol) - &
326  kb*temperature*(SIZE(new_elem%pos)/ &
327  tmc_params%dim_per_elem)* &
328  log(n_vol/p_vol)
329  END IF
330  END IF
331  ! acc(o->n) = min(1, exp(-beta*delta_H))
332  IF (d_enthalpy .LE. 0.0_dp) THEN
333  accept = .true.
334  ELSE
335  IF (rnd_nr .LT. exp(-1.0_dp/(kb*temperature)*d_enthalpy)) THEN
336  accept = .true.
337  ELSE
338  accept = .false.
339  END IF
340  END IF
341  ! end the timing
342  CALL timestop(handle)
343  END SUBROUTINE volume_acceptance_check
344 
345  !============================================================================
346  ! tree node acceptance
347  !============================================================================
348 ! **************************************************************************************************
349 !> \brief check acceptance of energy calculated element and related childs,
350 !> when ready
351 !> \param tree_elem actual tree element with calculated energy
352 !> \param tmc_env TMC environment parameters
353 !> \author Mandes 12.2012
354 ! **************************************************************************************************
355  SUBROUTINE check_acceptance_of_depending_subtree_nodes(tree_elem, tmc_env)
356  TYPE(tree_type), POINTER :: tree_elem
357  TYPE(tmc_env_type), POINTER :: tmc_env
358 
359  CHARACTER(LEN=*), PARAMETER :: routinen = 'check_acceptance_of_depending_subtree_nodes'
360 
361  INTEGER :: handle
362  LOGICAL :: parent_ready
363  TYPE(tree_type), POINTER :: act_elem, parent_elem
364 
365  NULLIFY (parent_elem, act_elem)
366 
367  cpassert(ASSOCIATED(tmc_env))
368  cpassert(ASSOCIATED(tree_elem))
369  cpassert(tree_elem%stat .EQ. status_calculated)
370  cpassert(ASSOCIATED(tree_elem%parent))
371 
372  ! start the timing
373  CALL timeset(routinen, handle)
374 
375  act_elem => tree_elem
376 
377  ! ------------------------------------------------------
378  ! check this element
379  parent_elem => search_parent_element(act_elem)
380  cpassert(.NOT. ASSOCIATED(act_elem, parent_elem))
381 
382  ! check status of parent element
383  SELECT CASE (parent_elem%stat)
387  parent_ready = .false.
390  parent_ready = .true.
391  CASE DEFAULT
392  cpabort("unknown parent element status"//cp_to_string(parent_elem%stat))
393  END SELECT
394 
395  ! ready ?
396  IF (parent_ready) THEN
397  ! acceptance check
398  CALL check_and_change_status_of_subtree_elem(act_elem=act_elem, &
399  parent_elem=parent_elem, tmc_env=tmc_env)
400  END IF
401  !------------------------------------------------------
402  ! check acc child
403  parent_elem => tree_elem
404  IF (ASSOCIATED(tree_elem%acc)) THEN
405  act_elem => tree_elem%acc
406  IF (act_elem%stat .EQ. status_calculated) THEN
407  CALL check_and_change_status_of_subtree_elem(act_elem=act_elem, &
408  parent_elem=parent_elem, tmc_env=tmc_env)
409  END IF
410  !------------------------------------------------------
411  ! check all nacc childs
412  nacc_loop: DO
413  IF (.NOT. ASSOCIATED(act_elem%nacc)) EXIT nacc_loop
414  act_elem => act_elem%nacc
415  IF (act_elem%stat .EQ. status_calculated) THEN
416  CALL check_and_change_status_of_subtree_elem(act_elem=act_elem, &
417  parent_elem=parent_elem, tmc_env=tmc_env)
418  END IF
419  END DO nacc_loop
420  END IF
421 
422  ! end the timing
423  CALL timestop(handle)
425 
426 ! **************************************************************************************************
427 !> \brief checking the elements and change the status
428 !> \param act_elem actual tree element (new configuration)
429 !> \param parent_elem parent tree element (old configuration)
430 !> \param tmc_env TMC environment parameters
431 !> \author Mandes 12.2012
432 ! **************************************************************************************************
433  SUBROUTINE check_and_change_status_of_subtree_elem(act_elem, parent_elem, tmc_env)
434  TYPE(tree_type), POINTER :: act_elem, parent_elem
435  TYPE(tmc_env_type), POINTER :: tmc_env
436 
437  CHARACTER(LEN=*), PARAMETER :: routinen = 'check_and_change_status_of_subtree_elem'
438 
439  INTEGER :: handle
440  LOGICAL :: flag, result_acc
441  TYPE(global_tree_type), POINTER :: tmp_gt_ptr
442  TYPE(gt_elem_list_type), POINTER :: tmp_gt_list_ptr
443 
444  NULLIFY (tmp_gt_list_ptr, tmp_gt_ptr)
445 
446  ! start the timing
447  CALL timeset(routinen, handle)
448 
449  cpassert(ASSOCIATED(tmc_env))
450  cpassert(ASSOCIATED(tmc_env%params))
451  cpassert(ASSOCIATED(act_elem))
452  cpassert(ASSOCIATED(parent_elem))
453  cpassert(act_elem%stat .EQ. status_calculated)
454  mark_used(parent_elem)
455 
456  flag = .false.
457 
458  tmp_gt_list_ptr => act_elem%gt_nodes_references
459  ! check for all global tree elements referring to this subtree element
460  ! same subtree element can be accepted at a certain temperature and rejected at another one
461  DO WHILE (ASSOCIATED(tmp_gt_list_ptr))
462  cpassert(tmp_gt_list_ptr%gt_elem%stat .NE. status_accepted_result)
463  cpassert(tmp_gt_list_ptr%gt_elem%stat .NE. status_rejected_result)
464 
465  CALL check_elements(gt_act_elem=tmp_gt_list_ptr%gt_elem, tmc_env=tmc_env, &
466  check_done=flag, result_acc=result_acc)
467  IF (flag) THEN
468  ! probability update
469  CALL prob_update(move_types=tmc_env%params%move_types, elem=act_elem, &
470  acc=result_acc, prob_opt=tmc_env%params%esimate_acc_prob)
471 
472  ! change status
473  ! accepted case: delete (and cancel) not accepted branch
474  IF (result_acc .EQV. .true.) THEN
475  tmp_gt_list_ptr%gt_elem%stat = status_accepted
476  IF (ASSOCIATED(tmp_gt_list_ptr%gt_elem%nacc)) THEN
477  tmp_gt_ptr => tmp_gt_list_ptr%gt_elem%nacc
478  CALL remove_unused_g_tree(begin_ptr=tmp_gt_ptr, &
479  end_ptr=tmp_gt_list_ptr%gt_elem, removed=flag, &
480  tmc_env=tmc_env)
481  END IF
482  ELSE
483  ! not accepted case: delete (and cancel) accepted branch
484  tmp_gt_list_ptr%gt_elem%stat = status_rejected
485  IF (ASSOCIATED(tmp_gt_list_ptr%gt_elem%acc)) THEN
486  tmp_gt_ptr => tmp_gt_list_ptr%gt_elem%acc
487  CALL remove_unused_g_tree(begin_ptr=tmp_gt_ptr, &
488  end_ptr=tmp_gt_list_ptr%gt_elem, removed=flag, &
489  tmc_env=tmc_env)
490  END IF
491  END IF
492 
493  IF (tmc_env%params%DRAW_TREE) &
494  CALL create_global_tree_dot_color(gt_tree_element=tmp_gt_list_ptr%gt_elem, &
495  tmc_params=tmc_env%params)
496  END IF
497  tmp_gt_list_ptr => tmp_gt_list_ptr%next
498  END DO
499  ! end the timing
500  CALL timestop(handle)
501  END SUBROUTINE check_and_change_status_of_subtree_elem
502 
503 ! **************************************************************************************************
504 !> \brief change status flag of all subtree elements
505 !> most important to draw the right subtrees
506 !> \param gt_ptr global tree pointer, the related/changed sub tree element
507 !> should change status
508 !> \param stat the status of the global tree element
509 !> \param tmc_params TMC emvironment parameters for drawing
510 !> \author Mandes 12.2012
511 ! **************************************************************************************************
512  SUBROUTINE subtree_configuration_stat_change(gt_ptr, stat, tmc_params)
513  TYPE(global_tree_type), POINTER :: gt_ptr
514  INTEGER :: stat
515  TYPE(tmc_param_type), POINTER :: tmc_params
516 
517  CHARACTER(LEN=*), PARAMETER :: routinen = 'subtree_configuration_stat_change'
518 
519  INTEGER :: handle
520  TYPE(tree_type), POINTER :: ptr
521 
522  NULLIFY (ptr)
523 
524  cpassert(ASSOCIATED(gt_ptr))
525  cpassert(ASSOCIATED(tmc_params))
526 
527  ! start the timing
528  CALL timeset(routinen, handle)
529 
530  ! don't respect swaped nodes (subtree nodes are already in the list,
531  ! and we dont want them in marked in subtrees)
532  IF (.NOT. gt_ptr%swaped) THEN
533  ptr => gt_ptr%conf(gt_ptr%mv_conf)%elem
534  ! dependent on the status (don't map each status 1:1,
535  ! e.g. not the result ones)
536  SELECT CASE (stat)
538  ptr%stat = status_accepted
540  ptr%stat = status_rejected
542  ptr%stat = stat
543  CASE DEFAULT
544  CALL cp_abort(__location__, &
545  "unknown global tree status"// &
546  cp_to_string(stat))
547  END SELECT
548 
549  IF (tmc_params%DRAW_TREE) &
550  CALL create_dot_color(tree_element=ptr, tmc_params=tmc_params)
551  END IF
552 
553  ! end the timing
554  CALL timestop(handle)
555  END SUBROUTINE subtree_configuration_stat_change
556 
557 ! **************************************************************************************************
558 !> \brief checks if the element is ready for an acceptance check
559 !> \param elem sub tree element
560 !> \param ready return value
561 !> \author Mandes 12.2012
562 ! **************************************************************************************************
563  SUBROUTINE elem_ready_to_check(elem, ready)
564  TYPE(tree_type), POINTER :: elem
565  LOGICAL :: ready
566 
567  CHARACTER(LEN=*), PARAMETER :: routinen = 'elem_ready_to_check'
568 
569  INTEGER :: handle
570 
571  cpassert(ASSOCIATED(elem))
572 
573  ! start the timing
574  CALL timeset(routinen, handle)
575 
576  ready = .false.
577 
578  SELECT CASE (elem%stat)
582  ready = .false.
584  ready = .true.
585  CASE DEFAULT
586  CALL cp_abort(__location__, &
587  "status of actual tree node is unknown" &
588  //cp_to_string(elem%stat))
589  END SELECT
590  ! end the timing
591  CALL timestop(handle)
592  END SUBROUTINE elem_ready_to_check
593 
594 ! **************************************************************************************************
595 !> \brief checking the elements (find element and do acceptance check)
596 !> \param gt_act_elem actual global tree element
597 !> \param tmc_env TMC environment
598 !> \param check_done successful checked? (result)
599 !> \param result_acc checked configuration accepted? (result)
600 !> \author Mandes 12.2012
601 ! **************************************************************************************************
602  SUBROUTINE check_elements(gt_act_elem, tmc_env, check_done, result_acc)
603  TYPE(global_tree_type), POINTER :: gt_act_elem
604  TYPE(tmc_env_type), POINTER :: tmc_env
605  LOGICAL :: check_done, result_acc
606 
607  CHARACTER(LEN=*), PARAMETER :: routinen = 'check_elements'
608 
609  INTEGER :: handle
610  LOGICAL :: act_ready, tmp_ready
611  TYPE(tree_type), POINTER :: act_element, tmp_element
612 
613  NULLIFY (act_element, tmp_element)
614  check_done = .false.
615 
616  cpassert(ASSOCIATED(gt_act_elem))
617  cpassert(ASSOCIATED(tmc_env))
618  cpassert(ASSOCIATED(tmc_env%m_env))
619 
620  ! start the timing
621  CALL timeset(routinen, handle)
622 
623  !====================================================================================
624  ! check if global tree element is already checked
625  SELECT CASE (gt_act_elem%stat)
627  check_done = .true.
628  IF (gt_act_elem%stat .EQ. status_accepted) THEN
629  result_acc = .true.
630  ELSE IF (gt_act_elem%stat .EQ. status_rejected) THEN
631  result_acc = .false.
632  ELSE
633  CALL cp_abort(__location__, &
634  "undefinite status of already checked elements:" &
635  //cp_to_string(gt_act_elem%stat))
636  END IF
637  CASE DEFAULT
638  END SELECT
639 
640  IF (.NOT. check_done) THEN
641  !====================================================================================
642  ! get elements related to global tree element to check
643  CALL get_subtree_elements_to_check(gt_act_elem=gt_act_elem, elem1=act_element, &
644  elem2=tmp_element)
645  cpassert(ASSOCIATED(act_element))
646  cpassert(ASSOCIATED(tmp_element))
647 
648  ! check status of both elements (if they are already calculated and hence ready to check)
649  CALL elem_ready_to_check(elem=act_element, ready=act_ready)
650  CALL elem_ready_to_check(elem=tmp_element, ready=tmp_ready)
651 
652  ! both ready ? check
653  IF (act_ready .AND. tmp_ready) THEN
654  ! 2 temperature (swap) check
655  IF (gt_act_elem%swaped) THEN
656  CALL swap_acceptance_check(tree_elem=gt_act_elem, conf1=act_element, &
657  conf2=tmp_element, tmc_params=tmc_env%params, &
658  accept=result_acc)
659  ! volume move check
660  ELSE IF (act_element%move_type .EQ. mv_type_volume_move) THEN
661  CALL volume_acceptance_check(parent_elem=tmp_element, new_elem=act_element, &
662  temperature=tmc_env%params%Temp(gt_act_elem%mv_conf), &
663  rnd_nr=gt_act_elem%rnd_nr, &
664  tmc_params=tmc_env%params, accept=result_acc)
665  ELSE
666  IF (tmc_env%m_env%temp_decrease .NE. 1.0_dp) THEN
667  CALL acceptance_check(tree_element=act_element, parent_element=tmp_element, &
668  tmc_params=tmc_env%params, temperature=gt_act_elem%Temp, &
669  diff_pot_check=.true., accept=result_acc, &
670  rnd_nr=gt_act_elem%rnd_nr)
671  ELSE
672  CALL acceptance_check(tree_element=act_element, parent_element=tmp_element, &
673  tmc_params=tmc_env%params, &
674  temperature=tmc_env%params%Temp(gt_act_elem%mv_conf), &
675  diff_pot_check=.true., accept=result_acc, &
676  rnd_nr=gt_act_elem%rnd_nr)
677  END IF
678  END IF
679  check_done = .true.
680  ELSE
681  ! if element is not ready, update status of global tree element
682  !TODO maybe update this part (how much status we need in global tree from sub tree??)
683  SELECT CASE (gt_act_elem%stat)
684  !-- check if at least the MD move is already done
685  !-- hence new configurations can be created on basis of this configuration
688  IF (gt_act_elem%conf(gt_act_elem%mv_conf)%elem%stat .NE. gt_act_elem%stat) &
689  gt_act_elem%stat = gt_act_elem%conf(gt_act_elem%mv_conf)%elem%stat
690  CASE (status_calculated)
691  CASE DEFAULT
692  CALL cp_abort(__location__, &
693  "status of actual checked node is unknown" &
694  //cp_to_string(gt_act_elem%stat))
695  END SELECT
696  END IF
697  END IF
698  ! end the timing
699  CALL timestop(handle)
700  END SUBROUTINE check_elements
701 
702 ! **************************************************************************************************
703 !> \brief searching tree nodes to check for Markov Chain, elements are marked
704 !> and stored in lists ... (main entry point)
705 !> \param tmc_env TMC environment
706 !> \param result_acc checked configuration accepted? (result)
707 !> \param something_updated ...
708 !> \param
709 !> \param
710 !> \author Mandes 12.2012
711 ! **************************************************************************************************
712  SUBROUTINE tree_update(tmc_env, result_acc, something_updated)
713  TYPE(tmc_env_type), POINTER :: tmc_env
714  LOGICAL :: result_acc, something_updated
715 
716  CHARACTER(LEN=*), PARAMETER :: routinen = 'tree_update'
717 
718  INTEGER :: handle, itmp
719  LOGICAL :: found
720  TYPE(global_tree_type), POINTER :: gt_act_elem
721  TYPE(tree_type), POINTER :: act_element, tmp_element
722 
723  NULLIFY (gt_act_elem, tmp_element, act_element)
724 
725  cpassert(ASSOCIATED(tmc_env))
726 
727  ! start the timing
728  CALL timeset(routinen, handle)
729 
730  result_acc = .false.
731  something_updated = .false.
732 
733  gt_act_elem => tmc_env%m_env%gt_act
734  search_calculated_element_loop: DO
735  NULLIFY (act_element, tmp_element)
736  ! search for element to check
737  CALL search_next_gt_element_to_check(ptr=gt_act_elem, found=found)
738  IF (.NOT. found) EXIT search_calculated_element_loop
739 
740  ! check the elements status end, if possible, do acceptance check
741  CALL check_elements(gt_act_elem=gt_act_elem, tmc_env=tmc_env, &
742  check_done=found, result_acc=result_acc)
743  ! if check was not possible, update the status of the global tree element and return
744  IF (.NOT. found) EXIT search_calculated_element_loop
745 
746  ! get elements related to global tree element, which were checked
747  CALL get_subtree_elements_to_check(gt_act_elem=gt_act_elem, &
748  elem1=act_element, elem2=tmp_element)
749 
750  !========================================================================
751  !-- set result counters
752  ! counter for certain temperature
753  tmc_env%m_env%result_count(gt_act_elem%mv_conf) = &
754  tmc_env%m_env%result_count(gt_act_elem%mv_conf) + 1
755  ! in case of swapped also count the result for
756  ! the other swapped temperature
757  IF (gt_act_elem%swaped) &
758  tmc_env%m_env%result_count(gt_act_elem%mv_conf + 1) = &
759  tmc_env%m_env%result_count(gt_act_elem%mv_conf + 1) + 1
760  ! count also for global tree Markov Chain
761  tmc_env%m_env%result_count(0) = tmc_env%m_env%result_count(0) + 1
762 
763  ! flag for doing tree cleaning with canceling and deallocation
764  something_updated = .true.
765 
766  !IF((.NOT.gt_act_elem%swaped) .AND. act_element%temp_created.NE.0 .AND. &
767  ! act_element%temp_created.NE.gt_act_elem%mv_conf)&
768  ! count_wrong_temp_move(gt_act_elem%mv_conf) = &
769  ! count_wrong_temp_move(gt_act_elem%mv_conf)+1
770 
771  !========================================================================
772  !-- sort element in lists
773  !-- case NOT ACCEPTED
774  IF (.NOT. result_acc) THEN !result NOT accepted
775  IF (gt_act_elem%prob_acc .GT. 0.0_dp) THEN
776  IF (gt_act_elem%prob_acc .GE. 0.5_dp) THEN
777  ! wrong estimate (estimated accepted)
778  tmc_env%m_env%estim_corr_wrong(4) = tmc_env%m_env%estim_corr_wrong(4) + 1
779  IF (debug .GT. 0) WRITE (tmc_env%m_env%io_unit, *) &
780  "Wrong guess for NACC (elem/estim acc prob)", gt_act_elem%nr, gt_act_elem%prob_acc
781  ELSE
782  tmc_env%m_env%estim_corr_wrong(3) = tmc_env%m_env%estim_corr_wrong(3) + 1
783  END IF
784  END IF
785  gt_act_elem%stat = status_rejected_result
786  gt_act_elem%prob_acc = 0.0_dp
787  itmp = gt_act_elem%conf(gt_act_elem%mv_conf)%elem%sub_tree_nr
788 
789  !-- case ACCEPTED
790  ELSE
791  IF (gt_act_elem%prob_acc .GT. 0.0_dp) THEN
792  IF (gt_act_elem%prob_acc .LE. 0.5_dp) THEN
793  ! wrong estimate (estimated NOT accepted)
794  tmc_env%m_env%estim_corr_wrong(2) = tmc_env%m_env%estim_corr_wrong(2) + 1
795  IF (debug .GT. 0) WRITE (tmc_env%m_env%io_unit, *) &
796  "wrong guess for ACC (elem/estim acc prob)", gt_act_elem%nr, gt_act_elem%prob_acc
797  ELSE
798  tmc_env%m_env%estim_corr_wrong(1) = tmc_env%m_env%estim_corr_wrong(1) + 1
799  END IF
800  END IF
801  gt_act_elem%stat = status_accepted_result
802  gt_act_elem%prob_acc = 1.0_dp
803 
804  ! save result in the result list
805  IF (.NOT. gt_act_elem%swaped) THEN
806  !-- saving moved/changed configuration of result node
807  tmc_env%m_env%result_list(gt_act_elem%mv_conf)%elem => &
808  gt_act_elem%conf(gt_act_elem%mv_conf)%elem
809  ELSE
810  ! ATTENTION: act_element != gt_act_elem%conf(gt_act_elem%mv_conf),
811  ! because we take the last accepted conf
812  tmc_env%m_env%result_list(gt_act_elem%mv_conf)%elem => act_element
813  tmc_env%m_env%result_list(gt_act_elem%mv_conf + 1)%elem => tmp_element
814  END IF
815  tmc_env%m_env%gt_act => gt_act_elem
816  END IF ! result acceptance check
817  !======================================================================
818  !-- set status accepted or rejected of certain subtree elements
819  IF (.NOT. gt_act_elem%swaped) &
820  CALL subtree_configuration_stat_change(gt_ptr=gt_act_elem, &
821  stat=gt_act_elem%stat, &
822  tmc_params=tmc_env%params)
823 
824  IF (tmc_env%params%DRAW_TREE) &
825  CALL create_global_tree_dot_color(gt_tree_element=gt_act_elem, &
826  tmc_params=tmc_env%params)
827 
828  ! probability update
829  CALL prob_update(move_types=tmc_env%params%move_types, &
830  pt_el=gt_act_elem, &
831  prob_opt=tmc_env%params%esimate_acc_prob)
832 
833  !writes only different configurations with repetition file if possible
834  CALL write_result_list_element(result_list=tmc_env%m_env%result_list, &
835  result_count=tmc_env%m_env%result_count, &
836  conf_updated=gt_act_elem%mv_conf, accepted=result_acc, &
837  tmc_params=tmc_env%params)
838  IF (gt_act_elem%swaped) &
839  CALL write_result_list_element(result_list=tmc_env%m_env%result_list, &
840  result_count=tmc_env%m_env%result_count, &
841  conf_updated=gt_act_elem%mv_conf + 1, accepted=result_acc, &
842  tmc_params=tmc_env%params)
843 
844  ! save for analysis
845  IF (tmc_env%tmc_comp_set%para_env_m_ana%num_pe .GT. 1 .AND. result_acc) THEN
846  CALL add_to_list(elem=tmc_env%m_env%result_list(gt_act_elem%mv_conf)%elem, &
847  list=tmc_env%m_env%analysis_list, &
848  temp_ind=gt_act_elem%mv_conf, &
849  nr=tmc_env%m_env%result_count(gt_act_elem%mv_conf))
850  IF (gt_act_elem%swaped) THEN
851  CALL add_to_list(elem=tmc_env%m_env%result_list(gt_act_elem%mv_conf + 1)%elem, &
852  list=tmc_env%m_env%analysis_list, &
853  temp_ind=gt_act_elem%mv_conf + 1, &
854  nr=tmc_env%m_env%result_count(gt_act_elem%mv_conf + 1))
855  END IF
856  END IF
857  END DO search_calculated_element_loop
858 
859  ! end the timing
860  CALL timestop(handle)
861 
862  END SUBROUTINE tree_update
863 
864  !============================================================================
865  ! tree node acceptance probability
866  !============================================================================
867 ! **************************************************************************************************
868 !> \brief checks if element is ready for accaptance probability update
869 !> checks status and the amount of already received intermediate energies
870 !> \param elem sub tree element to update
871 !> \return return value
872 !> \author Mandes 12.2012
873 ! **************************************************************************************************
874  FUNCTION ready_for_update_acc_prob(elem) RESULT(ready)
875  TYPE(tree_type), POINTER :: elem
876  LOGICAL :: ready
877 
878  cpassert(ASSOCIATED(elem))
879  ready = .false.
880  IF ((elem%scf_energies_count .GE. 4) &
881  .AND. (elem%stat .NE. status_deleted) .AND. (elem%stat .NE. status_deleted_result) &
882  .AND. (elem%stat .NE. status_canceled_ener)) &
883  ready = .true.
884  END FUNCTION ready_for_update_acc_prob
885 
886 ! **************************************************************************************************
887 !> \brief updates the subtree acceptance probability
888 !> the swap probabilities are handled within the certain checks of the
889 !> global tree elements (pt references)
890 !> \param tree_elem sub tree element to update
891 !> \param tmc_env TMC environment
892 !> \author Mandes 12.2012
893 ! **************************************************************************************************
894  SUBROUTINE check_elements_for_acc_prob_update(tree_elem, tmc_env)
895  TYPE(tree_type), POINTER :: tree_elem
896  TYPE(tmc_env_type), POINTER :: tmc_env
897 
898  CHARACTER(LEN=*), PARAMETER :: routinen = 'check_elements_for_acc_prob_update'
899 
900  INTEGER :: handle
901  TYPE(tree_type), POINTER :: act_elem, parent_elem
902 
903  NULLIFY (parent_elem, act_elem)
904 
905  cpassert(ASSOCIATED(tree_elem))
906  cpassert(ASSOCIATED(tmc_env))
907 
908  ! start the timing
909  CALL timeset(routinen, handle)
910 
911  act_elem => tree_elem
912  !-- nothing to do if option is disabled or element not ready
913  IF (tmc_env%params%esimate_acc_prob .AND. &
914  ready_for_update_acc_prob(act_elem)) THEN
915  ! ------------------------------------------------------
916  ! check this element
917  ! for usual moves and swapping
918  ! get parent subtree elment for case of not swapped configurations
919  parent_elem => search_parent_element(act_elem)
920  ! update the prob of accaptance
921  CALL update_prob_gt_node_list(reference_list=act_elem%gt_nodes_references, &
922  act_elem=act_elem, parent_elem=parent_elem, act_parent=.true., &
923  tmc_env=tmc_env)
924 
925  !------------------------------------------------------
926  ! check the childs of this element
927  parent_elem => tree_elem
928 
929  ! check ACC child (parent element is the entered/updated element)
930  IF (ASSOCIATED(tree_elem%acc)) THEN
931  act_elem => tree_elem%acc
932  ! update the prob of accaptance
933  CALL update_prob_gt_node_list(reference_list=act_elem%gt_nodes_references, &
934  act_elem=act_elem, parent_elem=parent_elem, act_parent=.false., &
935  tmc_env=tmc_env)
936  END IF
937 
938  ! check all NACC childs of next accepted one
939  nacc_loop: DO
940  IF (.NOT. ASSOCIATED(act_elem%nacc)) EXIT nacc_loop
941  act_elem => act_elem%nacc
942  CALL update_prob_gt_node_list(reference_list=act_elem%gt_nodes_references, &
943  act_elem=act_elem, parent_elem=parent_elem, act_parent=.false., &
944  tmc_env=tmc_env)
945  END DO nacc_loop
946  END IF
947  ! end the timing
948  CALL timestop(handle)
950 
951 ! **************************************************************************************************
952 !> \brief search all pt nodes in reference list and update the estimated
953 !> acceptance probabilities
954 !> \param reference_list list of global tree element referring to the updated
955 !> subtree element
956 !> \param act_elem actual sub tree element updated or child of the updated one
957 !> \param parent_elem parent or the actual updated subtree element
958 !> \param act_parent flag if updated element is the actual (TRUE) or
959 !> the parent (FALSE) element
960 !> \param tmc_env TMC environment
961 !> \author Mandes 12.2012
962 ! **************************************************************************************************
963  SUBROUTINE update_prob_gt_node_list(reference_list, act_elem, parent_elem, act_parent, tmc_env)
964  TYPE(gt_elem_list_type), POINTER :: reference_list
965  TYPE(tree_type), POINTER :: act_elem, parent_elem
966  LOGICAL :: act_parent
967  TYPE(tmc_env_type), POINTER :: tmc_env
968 
969  CHARACTER(LEN=*), PARAMETER :: routinen = 'update_prob_gt_node_list'
970 
971  INTEGER :: handle, integration_steps
972  REAL(kind=dp) :: kb, tmp_prob
973  TYPE(gt_elem_list_type), POINTER :: tmp_pt_ptr
974  TYPE(tree_type), POINTER :: tmp_elem, tmp_parent_elem
975 
976  kb = boltzmann/joule
977 
978  NULLIFY (tmp_pt_ptr, tmp_elem, tmp_parent_elem)
979 
980  IF (.NOT. ASSOCIATED(reference_list)) RETURN ! could be canceled already
981 
982  cpassert(ASSOCIATED(reference_list%gt_elem))
983  cpassert(ASSOCIATED(act_elem))
984  cpassert(ASSOCIATED(parent_elem))
985 
986  ! start the timing
987  CALL timeset(routinen, handle)
988 
989  ! check if element is ready
990  IF (ready_for_update_acc_prob(act_elem)) THEN
991  ! set the number of integration steps used for 3 point approximation
992  ! of the exact energy, using the sub step energies
993  ! still fixed value
994  integration_steps = 100
995 
996  tmp_pt_ptr => reference_list
997  ! do for all references using the updated subtree node
998  reference_loop: DO WHILE (ASSOCIATED(tmp_pt_ptr))
999  tmp_prob = -1.0_dp
1000  IF (tmp_pt_ptr%gt_elem%swaped) THEN
1001  NULLIFY (tmp_elem, tmp_parent_elem)
1002  ! in case of swap use the other swaped configuration as related one
1003  CALL get_subtree_elements_to_check(gt_act_elem=tmp_pt_ptr%gt_elem, &
1004  elem1=tmp_elem, elem2=tmp_parent_elem)
1005  ! NOT if parent is the updated one, and check for correct elements ready
1006  IF (act_parent .AND. ASSOCIATED(act_elem, tmp_elem) .AND. &
1007  ready_for_update_acc_prob(elem=tmp_parent_elem)) THEN
1008  ! using ln(rnd)/-(beta_i-beta_j) < U_j-U_i)
1009  tmp_prob = compute_estimated_prob(elem_old=tmp_parent_elem, &
1010  elem_new=act_elem, &
1011  e_classical_diff=0.0_dp, &
1012  rnd_nr=tmp_pt_ptr%gt_elem%rnd_nr, &
1013  beta=1.0_dp/(kb*(tmc_env%params%Temp(tmp_pt_ptr%gt_elem%mv_conf) - &
1014  tmc_env%params%Temp(tmp_pt_ptr%gt_elem%mv_conf + 1))), &
1015  tmc_params=tmc_env%params)
1016  ELSE
1017  tmp_pt_ptr => tmp_pt_ptr%next
1018  cycle reference_loop
1019  END IF
1020  ELSE
1021  ! if no swap, use the parent configuration as related one
1022  IF (ready_for_update_acc_prob(parent_elem)) THEN
1023  tmp_prob = compute_estimated_prob(elem_old=parent_elem, &
1024  elem_new=act_elem, &
1025  e_classical_diff=act_elem%e_pot_approx - parent_elem%e_pot_approx, &
1026  rnd_nr=tmp_pt_ptr%gt_elem%rnd_nr, &
1027  beta=1.0_dp/(kb*tmc_env%params%Temp(tmp_pt_ptr%gt_elem%mv_conf)), &
1028  tmc_params=tmc_env%params)
1029  END IF
1030  END IF
1031  !successful probability update
1032  IF (tmp_prob .GE. 0.0_dp) THEN
1033  tmp_pt_ptr%gt_elem%prob_acc = tmp_prob
1034  !-- speculative canceling for the related direction
1035  IF (tmc_env%params%SPECULATIVE_CANCELING) &
1036  CALL search_canceling_elements(pt_elem_in=tmp_pt_ptr%gt_elem, &
1037  prob=tmp_pt_ptr%gt_elem%prob_acc, tmc_env=tmc_env)
1038  END IF
1039 
1040  ! get next related global tree pointer
1041  tmp_pt_ptr => tmp_pt_ptr%next
1042  END DO reference_loop ! global tree references of actual subtree element
1043  END IF
1044  ! end the timing
1045  CALL timestop(handle)
1046  END SUBROUTINE update_prob_gt_node_list
1047 
1048 END MODULE tmc_tree_acceptance
various routines to log and control the output. The idea is that decisions about where to log should ...
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Definition: list.F:24
Definition of physical constants:
Definition: physcon.F:68
real(kind=dp), parameter, public boltzmann
Definition: physcon.F:129
real(kind=dp), parameter, public joule
Definition: physcon.F:159
calculation section for TreeMonteCarlo
subroutine, public get_scaled_cell(cell, box_scale, scaled_hmat, scaled_cell, vol, abc, vec)
handles properties and calculations of a scaled cell
real(kind=dp) function, public compute_estimated_prob(elem_old, elem_new, E_classical_diff, rnd_nr, beta, tmc_params)
extimates the probability of acceptance considering the intermetiate step energies
module for printing tree structures in GraphViz dot files for visualizing the trees
Definition: tmc_dot_tree.F:19
subroutine, public create_global_tree_dot_color(gt_tree_element, tmc_params)
interfaces the change of color for global tree node on the basis of the element status
Definition: tmc_dot_tree.F:417
subroutine, public create_dot_color(tree_element, tmc_params)
interfaces the change of color for subtree elements on the basis of the element status
Definition: tmc_dot_tree.F:376
writing and printing the files, trajectory (pos, cell, dipoles) as well as restart files
Definition: tmc_file_io.F:20
subroutine, public write_result_list_element(result_list, result_count, conf_updated, accepted, tmc_params)
select the correct configuration to print out the (coordinates, forces, cell ...)
Definition: tmc_file_io.F:365
acceptance ratio handling of the different Monte Carlo Moves types For each move type and each temper...
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_volume_move
integer, parameter, public mv_type_md
tree nodes creation, searching, deallocation, references etc.
Definition: tmc_stati.F:15
integer, parameter, public task_type_gaussian_adaptation
Definition: tmc_stati.F:47
tree nodes acceptance code is separated in 3 parts, first the acceptance criteria,...
subroutine, public tree_update(tmc_env, result_acc, something_updated)
searching tree nodes to check for Markov Chain, elements are marked and stored in lists ....
subroutine, public check_acceptance_of_depending_subtree_nodes(tree_elem, tmc_env)
check acceptance of energy calculated element and related childs, when ready
subroutine, public check_elements_for_acc_prob_update(tree_elem, tmc_env)
updates the subtree acceptance probability the swap probabilities are handled within the certain chec...
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.
recursive subroutine, public remove_unused_g_tree(begin_ptr, end_ptr, removed, tmc_env)
deletes the no more used global tree nodes beside the result nodes from begin_ptr to end_ptr
tree nodes search etc.
recursive type(tree_type) function, pointer, public search_parent_element(current)
searching the parent element (last accepted configuration before)
recursive subroutine, public search_canceling_elements(pt_elem_in, prob, tmc_env)
searches in all branches down below the entered global tree element for elements to cancel,...
subroutine, public get_subtree_elements_to_check(gt_act_elem, elem1, elem2)
get the changed element of the actual global tree element and its related last accepted parent
recursive subroutine, public search_next_gt_element_to_check(ptr, found)
search the next global element in the Markov Chain to check
module handles definition of the tree nodes for the global and the subtrees binary tree parent elemen...
integer, parameter, public status_deleted
integer, parameter, public status_accepted
integer, parameter, public status_calculate_energy
integer, parameter, public status_calculate_md
subroutine, public add_to_list(elem, list, temp_ind, nr)
add a certain element to the specified element list at the beginning
integer, parameter, public status_canceled_ener
integer, parameter, public status_calculated
integer, parameter, public status_cancel_ener
integer, parameter, public status_cancel_nmc
integer, parameter, public status_canceled_nmc
integer, parameter, public status_calc_approx_ener
integer, parameter, public status_rejected
integer, parameter, public status_calculate_nmc_steps
integer, parameter, public status_accepted_result
integer, parameter, public status_deleted_result
integer, parameter, public status_created
integer, parameter, public status_rejected_result
module handles definition of the tree nodes for the global and the subtrees binary tree parent elemen...
Definition: tmc_types.F:32