Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2025 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
|