Line data Source code
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 Typo for Nudged Elastic Band Calculation 10 : !> \note 11 : !> Numerical accuracy for parallel runs: 12 : !> Each replica starts the SCF run from the one optimized 13 : !> in a previous run. It may happen then energies and derivatives 14 : !> of a serial run and a parallel run could be slightly different 15 : !> 'cause of a different starting density matrix. 16 : !> Exact results are obtained using: 17 : !> EXTRAPOLATION USE_GUESS in QS section (Teo 09.2006) 18 : !> \author Teodoro Laino 10.2006 19 : ! ************************************************************************************************** 20 : MODULE neb_types 21 : 22 : USE force_env_types, ONLY: force_env_type 23 : USE input_constants, ONLY: band_md_opt,& 24 : do_b_neb,& 25 : do_band_cartesian,& 26 : do_band_collective,& 27 : pot_neb_full 28 : USE input_section_types, ONLY: section_vals_type 29 : USE kinds, ONLY: default_string_length,& 30 : dp 31 : #include "../base/base_uses.f90" 32 : 33 : IMPLICIT NONE 34 : PRIVATE 35 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'neb_types' 36 : 37 : PUBLIC :: neb_type, & 38 : neb_var_type, & 39 : neb_var_create, & 40 : neb_var_release 41 : 42 : ! ************************************************************************************************** 43 : TYPE neb_type 44 : ! NEB parameters 45 : INTEGER :: id_type = do_b_neb 46 : INTEGER :: opt_type = band_md_opt 47 : INTEGER :: pot_type = pot_neb_full 48 : INTEGER :: number_of_replica = 0, nsize_xyz = 0, nsize_int = 0 49 : INTEGER :: nsteps_it = 0, istep = 0 50 : INTEGER :: nr_HE_image = 0 51 : LOGICAL :: rotate_frames = .FALSE., align_frames = .FALSE. 52 : LOGICAL :: optimize_end_points = .FALSE. 53 : LOGICAL :: use_colvar = .FALSE. 54 : LOGICAL :: reparametrize_frames = .FALSE. 55 : INTEGER :: spline_order = 0 56 : REAL(KIND=dp) :: K = 0.0_dp, spring_energy = 0.0_dp, avg_distance = 0.0_dp 57 : REAL(KIND=dp) :: smoothing = 0.0_dp 58 : CHARACTER(LEN=default_string_length) :: opt_type_label = "" 59 : ! Section used for restart 60 : TYPE(force_env_type), POINTER :: force_env => NULL() 61 : TYPE(section_vals_type), POINTER :: root_section => NULL() 62 : TYPE(section_vals_type), POINTER :: motion_print_section => NULL() 63 : TYPE(section_vals_type), POINTER :: force_env_section => NULL() 64 : TYPE(section_vals_type), POINTER :: neb_section => NULL() 65 : END TYPE neb_type 66 : 67 : ! ************************************************************************************************** 68 : TYPE neb_var_type 69 : INTEGER :: in_use = do_band_collective, size_wrk(2) = 0 70 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: xyz => NULL(), int => NULL(), wrk => NULL() 71 : REAL(KIND=dp), DIMENSION(:, :, :), POINTER :: Mmatrix => NULL() 72 : END TYPE neb_var_type 73 : 74 : CONTAINS 75 : ! ************************************************************************************************** 76 : !> \brief Creates a variable type for BAND calculation 77 : !> \param neb_var ... 78 : !> \param neb_env ... 79 : !> \param full_allocation ... 80 : !> \date 05.2007 81 : !> \author Teodoro Laino [tlaino] - University of Zurich 82 : ! ************************************************************************************************** 83 136 : SUBROUTINE neb_var_create(neb_var, neb_env, full_allocation) 84 : TYPE(neb_var_type), POINTER :: neb_var 85 : TYPE(neb_type), POINTER :: neb_env 86 : LOGICAL, INTENT(IN), OPTIONAL :: full_allocation 87 : 88 : INTEGER :: neb_nr_replica 89 : LOGICAL :: allocate_all 90 : 91 136 : CPASSERT(.NOT. ASSOCIATED(neb_var)) 92 136 : allocate_all = .FALSE. 93 136 : IF (PRESENT(full_allocation)) allocate_all = full_allocation 94 136 : neb_nr_replica = neb_env%number_of_replica 95 544 : ALLOCATE (neb_var) 96 : NULLIFY (neb_var%xyz, neb_var%int, neb_var%wrk, neb_var%Mmatrix) 97 136 : IF (allocate_all) THEN 98 208 : ALLOCATE (neb_var%xyz(neb_env%nsize_xyz, neb_nr_replica)) 99 78848 : neb_var%xyz = 0.0_dp 100 : END IF 101 136 : IF (neb_env%use_colvar) THEN 102 16 : neb_var%in_use = do_band_collective 103 16 : CPASSERT(neb_env%nsize_int > 0) 104 64 : ALLOCATE (neb_var%int(neb_env%nsize_int, neb_nr_replica)) 105 176 : neb_var%int = 0.0_dp 106 16 : neb_var%wrk => neb_var%int 107 : ELSE 108 120 : neb_var%in_use = do_band_cartesian 109 120 : IF (.NOT. allocate_all) THEN 110 288 : ALLOCATE (neb_var%xyz(neb_env%nsize_xyz, neb_nr_replica)) 111 85108 : neb_var%xyz = 0.0_dp 112 : END IF 113 120 : neb_var%wrk => neb_var%xyz 114 : END IF 115 136 : neb_var%size_wrk(1) = SIZE(neb_var%wrk, 1) 116 136 : neb_var%size_wrk(2) = SIZE(neb_var%wrk, 2) 117 : 118 136 : END SUBROUTINE neb_var_create 119 : 120 : ! ************************************************************************************************** 121 : !> \brief Releases a variable type for BAND calculation 122 : !> \param neb_var ... 123 : !> \date 05.2007 124 : !> \author Teodoro Laino [tlaino] - University of Zurich 125 : ! ************************************************************************************************** 126 136 : SUBROUTINE neb_var_release(neb_var) 127 : TYPE(neb_var_type), POINTER :: neb_var 128 : 129 136 : CPASSERT(ASSOCIATED(neb_var)) 130 136 : IF (ASSOCIATED(neb_var%xyz)) THEN 131 124 : DEALLOCATE (neb_var%xyz) 132 : END IF 133 136 : IF (neb_var%in_use == do_band_collective) THEN 134 16 : DEALLOCATE (neb_var%int) 135 : END IF 136 136 : NULLIFY (neb_var%wrk) 137 136 : DEALLOCATE (neb_var) 138 : 139 136 : END SUBROUTINE neb_var_release 140 : 141 0 : END MODULE neb_types