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 initialize fist environment
10 : !> \author CJM
11 : ! **************************************************************************************************
12 : MODULE fist_environment
13 : USE atomic_kind_types, ONLY: atomic_kind_type,&
14 : get_atomic_kind_set
15 : USE bibliography, ONLY: Devynck2012,&
16 : Dick1958,&
17 : Mitchell1993,&
18 : cite_reference
19 : USE cell_methods, ONLY: read_cell,&
20 : write_cell
21 : USE cell_types, ONLY: cell_release,&
22 : cell_type,&
23 : get_cell
24 : USE cp_log_handling, ONLY: cp_get_default_logger,&
25 : cp_logger_type
26 : USE cp_output_handling, ONLY: cp_print_key_finished_output,&
27 : cp_print_key_unit_nr
28 : USE cp_subsys_methods, ONLY: cp_subsys_create
29 : USE cp_subsys_types, ONLY: cp_subsys_set,&
30 : cp_subsys_type
31 : USE cp_symmetry, ONLY: write_symmetry
32 : USE distribution_1d_types, ONLY: distribution_1d_release,&
33 : distribution_1d_type
34 : USE distribution_methods, ONLY: distribute_molecules_1d
35 : USE ewald_environment_types, ONLY: ewald_env_create,&
36 : ewald_env_get,&
37 : ewald_env_set,&
38 : ewald_environment_type,&
39 : read_ewald_section
40 : USE ewald_pw_methods, ONLY: ewald_pw_grid_update
41 : USE ewald_pw_types, ONLY: ewald_pw_create,&
42 : ewald_pw_type
43 : USE exclusion_types, ONLY: exclusion_type
44 : USE fist_efield_types, ONLY: fist_efield_type,&
45 : read_efield_section
46 : USE fist_energy_types, ONLY: allocate_fist_energy,&
47 : fist_energy_type
48 : USE fist_environment_types, ONLY: fist_env_get,&
49 : fist_env_set,&
50 : fist_environment_type
51 : USE fist_nonbond_env_types, ONLY: fist_nonbond_env_type
52 : USE force_fields, ONLY: force_field_control
53 : USE header, ONLY: fist_header
54 : USE input_section_types, ONLY: section_vals_get_subs_vals,&
55 : section_vals_type
56 : USE kinds, ONLY: dp
57 : USE message_passing, ONLY: mp_para_env_type
58 : USE molecule_kind_types, ONLY: molecule_kind_type,&
59 : write_molecule_kind_set
60 : USE molecule_types, ONLY: molecule_type
61 : USE multipole_types, ONLY: create_multipole_type,&
62 : multipole_type
63 : USE particle_list_types, ONLY: particle_list_create,&
64 : particle_list_release,&
65 : particle_list_type
66 : USE particle_methods, ONLY: write_fist_particle_coordinates,&
67 : write_particle_distances,&
68 : write_structure_data
69 : USE particle_types, ONLY: particle_type
70 : USE qmmm_types_low, ONLY: qmmm_env_mm_type
71 : #include "./base/base_uses.f90"
72 :
73 : IMPLICIT NONE
74 :
75 : PRIVATE
76 :
77 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'fist_environment'
78 : PUBLIC :: fist_init
79 :
80 : CONTAINS
81 : ! **************************************************************************************************
82 : !> \brief reads the input and database file for fist
83 : !> \param fist_env ...
84 : !> \param root_section ...
85 : !> \param para_env ...
86 : !> \param force_env_section ...
87 : !> \param subsys_section ...
88 : !> \param use_motion_section ...
89 : !> \param prev_subsys ...
90 : !> \par Used By
91 : !> fist_main
92 : ! **************************************************************************************************
93 7917 : SUBROUTINE fist_init(fist_env, root_section, para_env, force_env_section, &
94 : subsys_section, use_motion_section, prev_subsys)
95 :
96 : TYPE(fist_environment_type), POINTER :: fist_env
97 : TYPE(section_vals_type), POINTER :: root_section
98 : TYPE(mp_para_env_type), POINTER :: para_env
99 : TYPE(section_vals_type), POINTER :: force_env_section, subsys_section
100 : LOGICAL, INTENT(IN) :: use_motion_section
101 : TYPE(cp_subsys_type), OPTIONAL, POINTER :: prev_subsys
102 :
103 : CHARACTER(len=*), PARAMETER :: routineN = 'fist_init'
104 :
105 : INTEGER :: handle, iw
106 : LOGICAL :: qmmm, shell_adiabatic, shell_present
107 : REAL(KIND=dp), DIMENSION(3) :: abc
108 : TYPE(cell_type), POINTER :: cell, cell_ref
109 : TYPE(cp_logger_type), POINTER :: logger
110 : TYPE(cp_subsys_type), POINTER :: subsys
111 : TYPE(ewald_environment_type), POINTER :: ewald_env
112 2639 : TYPE(exclusion_type), DIMENSION(:), POINTER :: exclusions
113 : TYPE(fist_efield_type), POINTER :: efield
114 : TYPE(fist_nonbond_env_type), POINTER :: fist_nonbond_env
115 : TYPE(particle_list_type), POINTER :: core_particles, shell_particles
116 2639 : TYPE(particle_type), DIMENSION(:), POINTER :: core_particle_set, shell_particle_set
117 : TYPE(qmmm_env_mm_type), POINTER :: qmmm_env
118 : TYPE(section_vals_type), POINTER :: cell_section, ewald_section, mm_section, &
119 : poisson_section
120 :
121 2639 : CALL timeset(routineN, handle)
122 2639 : logger => cp_get_default_logger()
123 :
124 2639 : NULLIFY (subsys, cell, cell_ref)
125 2639 : NULLIFY (ewald_env, fist_nonbond_env, qmmm_env, cell_section, &
126 2639 : poisson_section, shell_particle_set, shell_particles, &
127 2639 : core_particle_set, core_particles, exclusions)
128 2639 : IF (.NOT. ASSOCIATED(subsys_section)) THEN
129 26 : subsys_section => section_vals_get_subs_vals(force_env_section, "SUBSYS")
130 : END IF
131 2639 : mm_section => section_vals_get_subs_vals(force_env_section, "MM")
132 2639 : cell_section => section_vals_get_subs_vals(subsys_section, "CELL")
133 2639 : poisson_section => section_vals_get_subs_vals(mm_section, "POISSON")
134 2639 : ewald_section => section_vals_get_subs_vals(poisson_section, "EWALD")
135 :
136 2639 : CALL fist_env_set(fist_env, input=force_env_section)
137 :
138 : iw = cp_print_key_unit_nr(logger, mm_section, "PRINT%PROGRAM_BANNER", &
139 2639 : extension=".mmLog")
140 2639 : CALL fist_header(iw)
141 2639 : CALL cp_print_key_finished_output(iw, logger, mm_section, "PRINT%PROGRAM_BANNER")
142 :
143 2639 : CALL read_cell(cell, cell_ref, cell_section=cell_section, para_env=para_env)
144 2639 : CALL get_cell(cell, abc=abc)
145 :
146 : ! Print the cell parameters
147 2639 : CALL write_cell(cell, subsys_section)
148 2639 : CALL write_cell(cell_ref, subsys_section)
149 :
150 : ! Create the ewald environment
151 47502 : ALLOCATE (ewald_env)
152 2639 : CALL ewald_env_create(ewald_env, para_env)
153 :
154 : ! Read the input section and set the ewald_env
155 2639 : CALL read_ewald_section(ewald_env, ewald_section)
156 2639 : CALL ewald_env_set(ewald_env, poisson_section=poisson_section)
157 :
158 : ! Read the efield section
159 2639 : NULLIFY (efield)
160 2639 : CALL read_efield_section(mm_section, efield)
161 2639 : CALL fist_env_set(fist_env, efield=efield)
162 :
163 : ! Topology
164 2639 : CALL fist_env_get(fist_env, qmmm=qmmm, qmmm_env=qmmm_env)
165 : CALL cp_subsys_create(subsys, para_env=para_env, root_section=root_section, &
166 : force_env_section=force_env_section, subsys_section=subsys_section, &
167 : qmmm=qmmm, qmmm_env=qmmm_env, exclusions=exclusions, &
168 2639 : use_motion_section=use_motion_section)
169 2639 : CALL fist_env_set(fist_env, subsys=subsys, exclusions=exclusions)
170 :
171 : CALL force_field_control(subsys%atomic_kinds%els, subsys%particles%els, &
172 : subsys%molecule_kinds%els, subsys%molecules%els, &
173 : ewald_env, fist_nonbond_env, root_section, para_env, qmmm=qmmm, &
174 : qmmm_env=qmmm_env, subsys_section=subsys_section, &
175 : mm_section=mm_section, shell_particle_set=shell_particle_set, &
176 2639 : core_particle_set=core_particle_set, cell=cell)
177 :
178 2639 : NULLIFY (shell_particles, core_particles)
179 2639 : IF (ASSOCIATED(shell_particle_set)) THEN
180 258 : CALL cite_reference(Devynck2012)
181 258 : CALL cite_reference(Mitchell1993)
182 258 : CALL cite_reference(Dick1958)
183 258 : CALL particle_list_create(shell_particles, els_ptr=shell_particle_set)
184 : END IF
185 2639 : IF (ASSOCIATED(core_particle_set)) THEN
186 258 : CALL particle_list_create(core_particles, els_ptr=core_particle_set)
187 : END IF
188 : CALL get_atomic_kind_set(atomic_kind_set=subsys%atomic_kinds%els, &
189 2639 : shell_present=shell_present, shell_adiabatic=shell_adiabatic)
190 : CALL fist_env_set(fist_env, shell_model=shell_present, &
191 2639 : shell_model_ad=shell_adiabatic)
192 : CALL cp_subsys_set(subsys, shell_particles=shell_particles, &
193 2639 : core_particles=core_particles)
194 2639 : CALL particle_list_release(shell_particles)
195 2639 : CALL particle_list_release(core_particles)
196 :
197 : CALL fist_init_subsys(fist_env, subsys, cell, cell_ref, fist_nonbond_env, ewald_env, &
198 2639 : force_env_section, subsys_section, prev_subsys)
199 :
200 2639 : CALL cell_release(cell)
201 2639 : CALL cell_release(cell_ref)
202 :
203 2639 : CALL timestop(handle)
204 :
205 2639 : END SUBROUTINE fist_init
206 :
207 : ! **************************************************************************************************
208 : !> \brief Read the input and the database files for the setup of the
209 : !> FIST environment.
210 : !> \param fist_env ...
211 : !> \param subsys ...
212 : !> \param cell ...
213 : !> \param cell_ref ...
214 : !> \param fist_nonbond_env ...
215 : !> \param ewald_env ...
216 : !> \param force_env_section ...
217 : !> \param subsys_section ...
218 : !> \param prev_subsys ...
219 : !> \date 22.05.2000
220 : !> \author MK
221 : !> \version 1.0
222 : ! **************************************************************************************************
223 7917 : SUBROUTINE fist_init_subsys(fist_env, subsys, cell, cell_ref, fist_nonbond_env, &
224 : ewald_env, force_env_section, subsys_section, &
225 : prev_subsys)
226 :
227 : TYPE(fist_environment_type), POINTER :: fist_env
228 : TYPE(cp_subsys_type), POINTER :: subsys
229 : TYPE(cell_type), POINTER :: cell, cell_ref
230 : TYPE(fist_nonbond_env_type), POINTER :: fist_nonbond_env
231 : TYPE(ewald_environment_type), POINTER :: ewald_env
232 : TYPE(section_vals_type), POINTER :: force_env_section, subsys_section
233 : TYPE(cp_subsys_type), OPTIONAL, POINTER :: prev_subsys
234 :
235 : CHARACTER(len=*), PARAMETER :: routineN = 'fist_init_subsys'
236 :
237 : INTEGER :: handle, max_multipole
238 : LOGICAL :: do_multipoles
239 2639 : TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
240 : TYPE(distribution_1d_type), POINTER :: local_molecules, local_particles, &
241 : prev_local_molecules
242 : TYPE(ewald_pw_type), POINTER :: ewald_pw
243 : TYPE(fist_energy_type), POINTER :: thermo
244 2639 : TYPE(molecule_kind_type), DIMENSION(:), POINTER :: molecule_kind_set, prev_molecule_kind_set
245 2639 : TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
246 : TYPE(multipole_type), POINTER :: multipoles
247 2639 : TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
248 : TYPE(section_vals_type), POINTER :: grid_print_section
249 :
250 2639 : CALL timeset(routineN, handle)
251 2639 : NULLIFY (thermo, ewald_pw, local_molecules, local_particles, multipoles)
252 2639 : particle_set => subsys%particles%els
253 2639 : atomic_kind_set => subsys%atomic_kinds%els
254 2639 : molecule_set => subsys%molecules%els
255 2639 : molecule_kind_set => subsys%molecule_kinds%els
256 :
257 2639 : IF (PRESENT(prev_subsys)) THEN
258 44 : prev_molecule_kind_set => prev_subsys%molecule_kinds%els
259 44 : prev_local_molecules => prev_subsys%local_molecules
260 : ELSE
261 2595 : NULLIFY (prev_molecule_kind_set)
262 2595 : NULLIFY (prev_local_molecules)
263 : END IF
264 :
265 : ! Create the fist_energy_type
266 2639 : CALL allocate_fist_energy(thermo)
267 :
268 : ! Print the molecule kind set
269 2639 : CALL write_molecule_kind_set(molecule_kind_set, subsys_section)
270 :
271 : ! Print the atomic coordinates
272 : CALL write_fist_particle_coordinates(particle_set, subsys_section, &
273 2639 : fist_nonbond_env%charges)
274 2639 : CALL write_particle_distances(particle_set, cell, subsys_section)
275 2639 : CALL write_structure_data(particle_set, cell=cell, input_section=subsys_section)
276 :
277 : ! Print symmetry information
278 2639 : CALL write_symmetry(particle_set, cell, subsys_section)
279 :
280 : ! Distribute molecules and atoms using the new data structures ***
281 : CALL distribute_molecules_1d(atomic_kind_set=atomic_kind_set, &
282 : particle_set=particle_set, &
283 : local_particles=local_particles, &
284 : molecule_kind_set=molecule_kind_set, &
285 : molecule_set=molecule_set, &
286 : local_molecules=local_molecules, &
287 : prev_molecule_kind_set=prev_molecule_kind_set, &
288 : prev_local_molecules=prev_local_molecules, &
289 2639 : force_env_section=force_env_section)
290 :
291 : ! Create ewald grids
292 : grid_print_section => section_vals_get_subs_vals(force_env_section, &
293 2639 : "PRINT%GRID_INFORMATION")
294 2639 : ALLOCATE (ewald_pw)
295 2639 : CALL ewald_pw_create(ewald_pw, ewald_env, cell, cell_ref, grid_print_section)
296 :
297 : ! Initialize ewald grids
298 2639 : CALL ewald_pw_grid_update(ewald_pw, ewald_env, cell%hmat)
299 :
300 : ! Possibly Initialize the multipole environment
301 : CALL ewald_env_get(ewald_env, do_multipoles=do_multipoles, &
302 2639 : max_multipole=max_multipole)
303 2639 : IF (do_multipoles) THEN
304 690 : ALLOCATE (multipoles)
305 138 : CALL create_multipole_type(multipoles, particle_set, subsys_section, max_multipole)
306 : END IF
307 2639 : CALL cp_subsys_set(subsys, multipoles=multipoles, cell=cell)
308 :
309 : ! Set the fist_env
310 : CALL fist_env_set(fist_env=fist_env, &
311 : cell_ref=cell_ref, &
312 : local_molecules=local_molecules, &
313 : local_particles=local_particles, &
314 : ewald_env=ewald_env, ewald_pw=ewald_pw, &
315 : fist_nonbond_env=fist_nonbond_env, &
316 2639 : thermo=thermo)
317 :
318 2639 : CALL distribution_1d_release(local_particles)
319 2639 : CALL distribution_1d_release(local_molecules)
320 2639 : CALL timestop(handle)
321 :
322 2639 : END SUBROUTINE fist_init_subsys
323 : END MODULE fist_environment
|