(git:374b731)
Loading...
Searching...
No Matches
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
20 USE kinds, ONLY: dp
21 USE physcon, ONLY: boltzmann,&
22 joule
29 USE tmc_move_types, ONLY: mv_type_md,&
37 USE tmc_tree_types, ONLY: &
43 USE tmc_types, ONLY: tmc_env_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
60CONTAINS
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
1048END 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
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
subroutine, public get_scaled_cell(cell, box_scale, scaled_hmat, scaled_cell, vol, abc, vec)
handles properties and calculations of a scaled cell
module for printing tree structures in GraphViz dot files for visualizing the trees
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
subroutine, public create_dot_color(tree_element, tmc_params)
interfaces the change of color for subtree elements on the basis of the element status
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 ...)
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