LCOV - code coverage report
Current view: top level - src/tmc - tmc_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:66ce584) Lines: 99.1 % 115 114
Test Date: 2026-09-12 06:50:25 Functions: 50.0 % 16 8

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2026 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief module handles definition of the tree nodes for the global and
      10              : !>      the subtrees binary tree
      11              : !>      --------------------------------------------------
      12              : !>      |              parent element                    |
      13              : !>      |                 /      \                       |
      14              : !>      | accepted (acc) /        \  not accepted (nacc) |
      15              : !>      |               /          \                     |
      16              : !>      |             child       child                  |
      17              : !>      |              / \         / \                   |
      18              : !>      |                    ...                         |
      19              : !>      --------------------------------------------------
      20              : !>      tree creation assuming acceptance (acc) AND rejectance (nacc)
      21              : !>        of configuration
      22              : !>      if configuration is accepted: new configuration (child on acc) on basis
      23              : !>        of last configuration (one level up)
      24              : !>      if configuration is rejected: child on nacc on basis of last accepted
      25              : !>        element (last element which is on acc brach of its parent element)
      26              : !>      The global tree handles all configurations of different subtrees.
      27              : !>      The structure element "conf" is an array related to the temperature
      28              : !>        (sorted) and points to the subtree elements.
      29              : !> \par History
      30              : !>      11.2012 created [Mandes Schoenherr]
      31              : !> \author Mandes
      32              : ! **************************************************************************************************
      33              : 
      34              : MODULE tmc_types
      35              :    USE cell_types,                      ONLY: cell_type
      36              :    USE kinds,                           ONLY: default_path_length,&
      37              :                                               default_string_length,&
      38              :                                               dp
      39              :    USE message_passing,                 ONLY: mp_para_env_release,&
      40              :                                               mp_para_env_type
      41              :    USE parallel_rng_types,              ONLY: rng_stream_type
      42              :    USE tmc_move_types,                  ONLY: tmc_move_type
      43              :    USE tmc_stati,                       ONLY: task_type_MC
      44              :    USE tmc_tree_types,                  ONLY: clean_list,&
      45              :                                               elem_array_type,&
      46              :                                               elem_list_type,&
      47              :                                               global_tree_type
      48              : #include "../base/base_uses.f90"
      49              : 
      50              :    IMPLICIT NONE
      51              : 
      52              :    PRIVATE
      53              : 
      54              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'tmc_types'
      55              : 
      56              :    PUBLIC :: tmc_env_type, tmc_comp_set_type, tmc_param_type
      57              :    PUBLIC :: tmc_env_create, tmc_env_release, &
      58              :              tmc_master_env_create, tmc_master_env_release, &
      59              :              tmc_worker_env_create, tmc_worker_env_release
      60              :    PUBLIC :: tmc_atom_type
      61              :    PUBLIC :: allocate_tmc_atom_type
      62              : 
      63              :    ! global environment
      64              :    TYPE tmc_env_type
      65              :       TYPE(tmc_comp_set_type), POINTER              :: tmc_comp_set => NULL()
      66              :       TYPE(tmc_param_type), POINTER                 :: params => NULL()
      67              :       TYPE(rng_stream_type), ALLOCATABLE            :: rng_stream
      68              :       TYPE(master_env_type), POINTER                :: m_env => NULL()
      69              :       TYPE(worker_env_type), POINTER                :: w_env => NULL()
      70              :    END TYPE tmc_env_type
      71              : 
      72              :    ! structure for remembering the main values used for reordering MPI communicators
      73              :    ! \param group_nr: the first group_ener_nr groups are for energy calculation,
      74              :    !                  then the Configurational Change groups,
      75              :    !                  the global master has group 0 and unused cores have negative group numbering
      76              :    TYPE tmc_comp_set_type
      77              :       INTEGER                                       :: group_ener_size = 0
      78              :       INTEGER                                       :: group_ener_nr = 0
      79              :       INTEGER                                       :: group_cc_size = 0
      80              :       INTEGER                                       :: group_cc_nr = 0
      81              :       INTEGER                                       :: group_nr = 0
      82              :       INTEGER                                       :: ana_on_the_fly = -1
      83              :       ! the communicators (para_env)
      84              :       TYPE(mp_para_env_type), POINTER               :: para_env_m_w => NULL()
      85              :       TYPE(mp_para_env_type), POINTER               :: para_env_sub_group => NULL()
      86              :       TYPE(mp_para_env_type), POINTER               :: para_env_m_first_w => NULL()
      87              :       TYPE(mp_para_env_type), POINTER               :: para_env_m_ana => NULL()
      88              :       TYPE(mp_para_env_type), POINTER               :: para_env_m_only => NULL()
      89              :    END TYPE tmc_comp_set_type
      90              : 
      91              :    ! struct for TMC global variables
      92              :    TYPE tmc_param_type
      93              :       INTEGER                                       :: task_type = task_type_MC
      94              :       INTEGER                                       :: dim_per_elem = 3
      95              :       INTEGER                                       :: nr_temp = -1
      96              :       REAL(KIND=dp), DIMENSION(:), POINTER          :: Temp => NULL()
      97              :       TYPE(cell_type), POINTER                      :: cell => NULL()
      98              :       REAL(KIND=dp), DIMENSION(:), POINTER          :: sub_box_size => NULL()
      99              :       TYPE(tmc_atom_type), DIMENSION(:), POINTER    :: atoms => NULL()
     100              : 
     101              :       INTEGER                                       :: nr_elem_mv = -1
     102              :       TYPE(tmc_move_type), POINTER                  :: move_types => NULL()
     103              :       TYPE(tmc_move_type), POINTER                  :: nmc_move_types => NULL()
     104              :       REAL(KIND=dp)                                 :: pressure = 0.0_dp
     105              :       LOGICAL                                       :: v_isotropic = .FALSE.
     106              :       LOGICAL                                       :: mv_cen_of_mass = .FALSE.
     107              :       LOGICAL                                       :: esimate_acc_prob = .FALSE.
     108              :       LOGICAL                                       :: SPECULATIVE_CANCELING = .FALSE.
     109              :       LOGICAL                                       :: use_scf_energy_info = .FALSE.
     110              :       LOGICAL                                       :: USE_REDUCED_TREE = .FALSE.
     111              :       CHARACTER(LEN=default_path_length)          :: energy_inp_file = ""
     112              :       CHARACTER(LEN=default_path_length)          :: NMC_inp_file = ""
     113              :       LOGICAL                                       :: DRAW_TREE = .FALSE.
     114              :       CHARACTER(LEN=default_path_length)          :: dot_file_name = ""
     115              :       CHARACTER(LEN=default_path_length)          :: all_conf_file_name = ""
     116              :       LOGICAL                                       :: print_only_diff_conf = .FALSE.
     117              :       LOGICAL                                       :: print_trajectory = .FALSE.
     118              :       LOGICAL                                       :: print_dipole = .FALSE.
     119              :       LOGICAL                                       :: print_forces = .FALSE.
     120              :       LOGICAL                                       :: print_cell = .FALSE.
     121              :       LOGICAL                                       :: print_energies = .FALSE.
     122              :       TYPE(prior_estimate_acceptance_type), POINTER :: prior_NMC_acc => NULL()
     123              :       LOGICAL                                       :: print_test_output = .FALSE.
     124              :    END TYPE tmc_param_type
     125              : 
     126              :    TYPE tmc_atom_type
     127              :       CHARACTER(LEN=default_string_length)   :: name = ""
     128              :       REAL(KIND=dp)                        :: mass = 0.0_dp
     129              :    END TYPE tmc_atom_type
     130              : 
     131              :    ! to estimate the prior acceptance
     132              :    TYPE prior_estimate_acceptance_type
     133              :       INTEGER :: counter = 0
     134              :       REAL(KIND=dp) :: aver = 0.0_dp, aver_2 = 0.0_dp
     135              :    END TYPE prior_estimate_acceptance_type
     136              : 
     137              :    ! environments for the master
     138              :    TYPE master_env_type
     139              :       INTEGER                                       :: num_MC_elem = 0! the specified number of Markov Chain elements, to be reached
     140              :       CHARACTER(LEN=default_path_length)          :: restart_in_file_name = ""
     141              :       CHARACTER(LEN=default_path_length)          :: restart_out_file_name = ""
     142              :       INTEGER                                       :: restart_out_step = 0
     143              :       INTEGER                                       :: io_unit = -1
     144              :       INTEGER                                       :: info_out_step_size = 0
     145              :       REAL(KIND=dp)                                 :: walltime = 0.0_dp
     146              :       INTEGER                                       :: rnd_init = 0
     147              :       REAL(KIND=dp)                                 :: temp_decrease = 0.0_dp ! for simulated annealing
     148              :       TYPE(elem_list_type), POINTER                 :: cancelation_list => NULL()
     149              :       INTEGER                                       :: count_cancel_ener = 0
     150              :       INTEGER                                       :: count_cancel_NMC = 0
     151              :       ! masters tree stuff
     152              :       TYPE(global_tree_type), POINTER               :: gt_head => NULL(), gt_act => NULL()
     153              :       INTEGER, DIMENSION(:), POINTER                :: tree_node_count => NULL()
     154              :       INTEGER, DIMENSION(:), POINTER                :: result_count => NULL()
     155              :       TYPE(elem_array_type), DIMENSION(:), &
     156              :          POINTER                                  :: result_list => NULL(), &
     157              :                                                      st_heads => NULL(), &
     158              :                                                      st_clean_ends => NULL()
     159              :       TYPE(global_tree_type), POINTER              :: gt_clean_end => NULL()
     160              :       INTEGER, DIMENSION(4)                         :: estim_corr_wrong = 0
     161              :       TYPE(elem_list_type), POINTER                 :: analysis_list => NULL()
     162              :    END TYPE master_env_type
     163              : 
     164              :    ! environment for the worker
     165              :    TYPE worker_env_type
     166              :       INTEGER                                       :: env_id_ener = -1, env_id_approx = -1
     167              :       INTEGER                                       :: io_unit = -1
     168              :       REAL(KIND=dp)                                 :: act_temp = 0.0_dp
     169              :    END TYPE worker_env_type
     170              : 
     171              : CONTAINS
     172              : 
     173              : ! **************************************************************************************************
     174              : !> \brief creates a new structure environment for TMC
     175              : !> \param tmc_env structure with parameters for TMC
     176              : !> \author Mandes 11.2012
     177              : ! **************************************************************************************************
     178           40 :    SUBROUTINE tmc_env_create(tmc_env)
     179              :       TYPE(tmc_env_type), POINTER                        :: tmc_env
     180              : 
     181              :       CHARACTER(LEN=*), PARAMETER                        :: routineN = 'tmc_env_create'
     182              : 
     183              :       INTEGER                                            :: handle
     184              : 
     185           40 :       CALL timeset(routineN, handle)
     186              : 
     187           40 :       CPASSERT(.NOT. ASSOCIATED(tmc_env))
     188              : 
     189           40 :       ALLOCATE (tmc_env)
     190              : 
     191           40 :       ALLOCATE (tmc_env%tmc_comp_set)
     192              : 
     193              :       ! initialize the parameter section
     194           40 :       ALLOCATE (tmc_env%params)
     195              : 
     196           40 :       ALLOCATE (tmc_env%params%sub_box_size(tmc_env%params%dim_per_elem))
     197          160 :       tmc_env%params%sub_box_size(:) = -1.0_dp
     198              : 
     199           40 :       CALL timestop(handle)
     200              : 
     201           40 :    END SUBROUTINE tmc_env_create
     202              : 
     203              : ! **************************************************************************************************
     204              : !> \brief releases the structure environment for TMC
     205              : !> \param tmc_env structure with parameters for TMC
     206              : !> \author Mandes 11.2012
     207              : ! **************************************************************************************************
     208           40 :    SUBROUTINE tmc_env_release(tmc_env)
     209              :       TYPE(tmc_env_type), POINTER                        :: tmc_env
     210              : 
     211              :       CHARACTER(LEN=*), PARAMETER                        :: routineN = 'tmc_env_release'
     212              : 
     213              :       INTEGER                                            :: handle
     214              : 
     215           40 :       CALL timeset(routineN, handle)
     216              : 
     217           40 :       CPASSERT(ASSOCIATED(tmc_env))
     218           40 :       CPASSERT(ASSOCIATED(tmc_env%params))
     219              : 
     220           40 :       DEALLOCATE (tmc_env%params%sub_box_size)
     221           40 :       IF (ASSOCIATED(tmc_env%params%Temp)) THEN
     222           28 :          DEALLOCATE (tmc_env%params%Temp)
     223              :       END IF
     224           40 :       IF (ASSOCIATED(tmc_env%params%cell)) THEN
     225           34 :          DEALLOCATE (tmc_env%params%cell)
     226              :       END IF
     227           40 :       IF (ASSOCIATED(tmc_env%params%atoms)) THEN
     228           20 :          CALL deallocate_tmc_atom_type(tmc_env%params%atoms)
     229              :       END IF
     230           40 :       DEALLOCATE (tmc_env%params)
     231              : 
     232           40 :       CALL mp_para_env_release(tmc_env%tmc_comp_set%para_env_sub_group)
     233           40 :       CALL mp_para_env_release(tmc_env%tmc_comp_set%para_env_m_w)
     234           40 :       IF (ASSOCIATED(tmc_env%tmc_comp_set%para_env_m_first_w)) THEN
     235           28 :          CALL mp_para_env_release(tmc_env%tmc_comp_set%para_env_m_first_w)
     236              :       END IF
     237           40 :       IF (ASSOCIATED(tmc_env%tmc_comp_set%para_env_m_ana)) THEN
     238           26 :          CALL mp_para_env_release(tmc_env%tmc_comp_set%para_env_m_ana)
     239              :       END IF
     240           40 :       IF (ASSOCIATED(tmc_env%tmc_comp_set%para_env_m_only)) THEN
     241           14 :          CALL mp_para_env_release(tmc_env%tmc_comp_set%para_env_m_only)
     242              :       END IF
     243              : 
     244           40 :       DEALLOCATE (tmc_env%tmc_comp_set)
     245              : 
     246           40 :       DEALLOCATE (tmc_env)
     247              : 
     248           40 :       CALL timestop(handle)
     249              : 
     250           40 :    END SUBROUTINE tmc_env_release
     251              : 
     252              : ! **************************************************************************************************
     253              : !> \brief creates a new structure environment for TMC master
     254              : !> \param tmc_env structure with parameters for TMC
     255              : !> \author Mandes 11.2012
     256              : ! **************************************************************************************************
     257           14 :    SUBROUTINE tmc_master_env_create(tmc_env)
     258              :       TYPE(tmc_env_type), POINTER                        :: tmc_env
     259              : 
     260              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'tmc_master_env_create'
     261              : 
     262              :       INTEGER                                            :: handle, i
     263              : 
     264           14 :       CALL timeset(routineN, handle)
     265              : 
     266           14 :       CPASSERT(ASSOCIATED(tmc_env))
     267           14 :       CPASSERT(ASSOCIATED(tmc_env%params))
     268           14 :       CPASSERT(tmc_env%params%nr_temp > 0)
     269              : 
     270           14 :       CPASSERT(.NOT. ASSOCIATED(tmc_env%m_env))
     271              : 
     272           70 :       ALLOCATE (tmc_env%m_env)
     273           14 :       NULLIFY (tmc_env%m_env%gt_head, tmc_env%m_env%gt_act, tmc_env%m_env%tree_node_count, &
     274           14 :                tmc_env%m_env%result_count, tmc_env%m_env%result_list, &
     275           14 :                tmc_env%m_env%st_heads, tmc_env%m_env%st_clean_ends, &
     276           14 :                tmc_env%m_env%gt_clean_end, tmc_env%m_env%cancelation_list, tmc_env%m_env%analysis_list)
     277              : 
     278           14 :       tmc_env%m_env%restart_in_file_name = ""
     279           14 :       tmc_env%m_env%restart_out_file_name = ""
     280           42 :       ALLOCATE (tmc_env%m_env%tree_node_count(0:tmc_env%params%nr_temp))
     281           54 :       tmc_env%m_env%tree_node_count(:) = 0
     282           42 :       ALLOCATE (tmc_env%m_env%result_count(0:tmc_env%params%nr_temp))
     283           54 :       tmc_env%m_env%result_count(:) = 0
     284           68 :       ALLOCATE (tmc_env%m_env%st_heads(tmc_env%params%nr_temp))
     285           68 :       ALLOCATE (tmc_env%m_env%st_clean_ends(tmc_env%params%nr_temp))
     286              : 
     287           68 :       IF (tmc_env%params%USE_REDUCED_TREE) ALLOCATE (tmc_env%m_env%result_list(tmc_env%params%nr_temp))
     288              : 
     289           40 :       DO i = 1, tmc_env%params%nr_temp
     290           26 :          tmc_env%m_env%st_heads(i)%elem => NULL()
     291           26 :          tmc_env%m_env%st_clean_ends(i)%elem => NULL()
     292           40 :          IF (tmc_env%params%USE_REDUCED_TREE) THEN
     293           26 :             tmc_env%m_env%result_list(i)%elem => NULL()
     294              :          END IF
     295              :       END DO
     296           14 :       tmc_env%m_env%gt_head => NULL()
     297           14 :       tmc_env%m_env%gt_clean_end => NULL()
     298           14 :       tmc_env%m_env%temp_decrease = 1.0_dp
     299           14 :       tmc_env%m_env%count_cancel_ener = 0
     300           14 :       tmc_env%m_env%count_cancel_NMC = 0
     301           70 :       tmc_env%m_env%estim_corr_wrong(:) = 0
     302              : 
     303           14 :       ALLOCATE (tmc_env%params%prior_NMC_acc)
     304           14 :       tmc_env%params%prior_NMC_acc%counter = 0
     305           14 :       tmc_env%params%prior_NMC_acc%aver = 0.0_dp
     306           14 :       tmc_env%params%prior_NMC_acc%aver_2 = 0.0_dp
     307              : 
     308           14 :       CALL timestop(handle)
     309              : 
     310           14 :    END SUBROUTINE tmc_master_env_create
     311              : 
     312              : ! **************************************************************************************************
     313              : !> \brief releases the structure environment for TMC master
     314              : !> \param tmc_env structure with parameters for TMC
     315              : !> \author Mandes 11.2012
     316              : ! **************************************************************************************************
     317           14 :    SUBROUTINE tmc_master_env_release(tmc_env)
     318              :       TYPE(tmc_env_type), POINTER                        :: tmc_env
     319              : 
     320              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'tmc_master_env_release'
     321              : 
     322              :       INTEGER                                            :: handle
     323              : 
     324           14 :       CALL timeset(routineN, handle)
     325              : 
     326           14 :       CPASSERT(ASSOCIATED(tmc_env))
     327           14 :       CPASSERT(ASSOCIATED(tmc_env%m_env))
     328              : 
     329           14 :       CALL clean_list(tmc_env%m_env%analysis_list)
     330           14 :       CALL clean_list(tmc_env%m_env%cancelation_list)
     331              : 
     332           14 :       DEALLOCATE (tmc_env%m_env%tree_node_count)
     333           14 :       DEALLOCATE (tmc_env%m_env%result_count)
     334           14 :       DEALLOCATE (tmc_env%m_env%st_heads)
     335           14 :       DEALLOCATE (tmc_env%m_env%st_clean_ends)
     336           14 :       IF (tmc_env%params%USE_REDUCED_TREE) DEALLOCATE (tmc_env%m_env%result_list)
     337           14 :       DEALLOCATE (tmc_env%params%prior_NMC_acc)
     338              : 
     339           14 :       DEALLOCATE (tmc_env%m_env)
     340              : 
     341           14 :       CALL timestop(handle)
     342              : 
     343           14 :    END SUBROUTINE tmc_master_env_release
     344              : 
     345              : ! **************************************************************************************************
     346              : !> \brief creates a new structure environment for TMC master
     347              : !> \param tmc_env structure with parameters for TMC
     348              : !> \author Mandes 11.2012
     349              : ! **************************************************************************************************
     350           14 :    SUBROUTINE tmc_worker_env_create(tmc_env)
     351              :       TYPE(tmc_env_type), POINTER                        :: tmc_env
     352              : 
     353              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'tmc_worker_env_create'
     354              : 
     355              :       INTEGER                                            :: handle
     356              : 
     357           14 :       CALL timeset(routineN, handle)
     358              : 
     359           14 :       CPASSERT(ASSOCIATED(tmc_env))
     360           14 :       CPASSERT(.NOT. ASSOCIATED(tmc_env%w_env))
     361              : 
     362           14 :       ALLOCATE (tmc_env%w_env)
     363              : 
     364           14 :       tmc_env%w_env%env_id_ener = -1
     365           14 :       tmc_env%w_env%env_id_approx = -1
     366           14 :       tmc_env%w_env%io_unit = -1
     367           14 :       tmc_env%w_env%act_temp = -1.0_dp
     368              : 
     369           14 :       CALL timestop(handle)
     370              : 
     371           14 :    END SUBROUTINE tmc_worker_env_create
     372              : 
     373              : ! **************************************************************************************************
     374              : !> \brief releases the structure environment for TMC master
     375              : !> \param tmc_env structure with parameters for TMC
     376              : !> \author Mandes 11.2012
     377              : ! **************************************************************************************************
     378           14 :    SUBROUTINE tmc_worker_env_release(tmc_env)
     379              :       TYPE(tmc_env_type), POINTER                        :: tmc_env
     380              : 
     381              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'tmc_worker_env_release'
     382              : 
     383              :       INTEGER                                            :: handle
     384              : 
     385           14 :       CALL timeset(routineN, handle)
     386              : 
     387           14 :       CPASSERT(ASSOCIATED(tmc_env))
     388           14 :       CPASSERT(ASSOCIATED(tmc_env%w_env))
     389              : 
     390           14 :       DEALLOCATE (tmc_env%w_env)
     391              : 
     392           14 :       CALL timestop(handle)
     393              : 
     394           14 :    END SUBROUTINE tmc_worker_env_release
     395              : 
     396              : ! **************************************************************************************************
     397              : !> \brief creates a structure for storing the atom informations
     398              : !> \param atoms pointer to a list of tmc_atoms_type
     399              : !> \param nr_atoms the amount of atoms
     400              : !> \author Mandes 01.2013
     401              : ! **************************************************************************************************
     402           34 :    SUBROUTINE allocate_tmc_atom_type(atoms, nr_atoms)
     403              :       TYPE(tmc_atom_type), DIMENSION(:), POINTER         :: atoms
     404              :       INTEGER, INTENT(IN)                                :: nr_atoms
     405              : 
     406           34 :       CPASSERT(.NOT. ASSOCIATED(atoms))
     407           34 :       CPASSERT(nr_atoms > 0)
     408              : 
     409         3988 :       ALLOCATE (atoms(nr_atoms))
     410              : 
     411           34 :       CPASSERT(ASSOCIATED(atoms))
     412              : 
     413           34 :    END SUBROUTINE allocate_tmc_atom_type
     414              : 
     415              : ! **************************************************************************************************
     416              : !> \brief releases the structure for storing the atom informations
     417              : !> \param atoms pointer to a list of tmc_atoms_type
     418              : !> \author Mandes 01.2013
     419              : ! **************************************************************************************************
     420           20 :    SUBROUTINE deallocate_tmc_atom_type(atoms)
     421              :       TYPE(tmc_atom_type), DIMENSION(:), POINTER         :: atoms
     422              : 
     423           20 :       CPASSERT(ASSOCIATED(atoms))
     424              : 
     425           20 :       DEALLOCATE (atoms)
     426              : 
     427              :       CPASSERT(.NOT. ASSOCIATED(atoms))
     428           20 :    END SUBROUTINE deallocate_tmc_atom_type
     429              : 
     430            0 : END MODULE tmc_types
        

Generated by: LCOV version 2.0-1