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