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 : !> \par History
10 : !> gt sept-23-02 added atomic_kind_set to replica_environment_type
11 : !> to allow use of kind_based neighbor list
12 : !> CJM rewrite
13 : !> \author CJM SEPT-01-02
14 : ! **************************************************************************************************
15 : MODULE fist_environment_types
16 : USE atomic_kind_list_types, ONLY: atomic_kind_list_create,&
17 : atomic_kind_list_release,&
18 : atomic_kind_list_type
19 : USE atomic_kind_types, ONLY: atomic_kind_type
20 : USE cell_types, ONLY: cell_release,&
21 : cell_retain,&
22 : cell_type
23 : USE cp_result_types, ONLY: cp_result_type
24 : USE cp_subsys_types, ONLY: cp_subsys_get,&
25 : cp_subsys_release,&
26 : cp_subsys_set,&
27 : cp_subsys_type
28 : USE distribution_1d_types, ONLY: distribution_1d_type
29 : USE ewald_environment_types, ONLY: ewald_env_release,&
30 : ewald_environment_type
31 : USE ewald_pw_types, ONLY: ewald_pw_release,&
32 : ewald_pw_type
33 : USE exclusion_types, ONLY: exclusion_release,&
34 : exclusion_type
35 : USE fist_efield_types, ONLY: fist_efield_type
36 : USE fist_energy_types, ONLY: deallocate_fist_energy,&
37 : fist_energy_type
38 : USE fist_nonbond_env_types, ONLY: fist_nonbond_env_release,&
39 : fist_nonbond_env_type
40 : USE input_section_types, ONLY: section_vals_release,&
41 : section_vals_retain,&
42 : section_vals_type
43 : USE message_passing, ONLY: mp_para_env_release,&
44 : mp_para_env_type
45 : USE molecule_kind_list_types, ONLY: molecule_kind_list_create,&
46 : molecule_kind_list_release,&
47 : molecule_kind_list_type
48 : USE molecule_kind_types, ONLY: molecule_kind_type
49 : USE molecule_list_types, ONLY: molecule_list_create,&
50 : molecule_list_release,&
51 : molecule_list_type
52 : USE molecule_types, ONLY: molecule_type
53 : USE multipole_types, ONLY: multipole_type
54 : USE particle_list_types, ONLY: particle_list_create,&
55 : particle_list_release,&
56 : particle_list_type
57 : USE particle_types, ONLY: particle_type
58 : USE qmmm_types_low, ONLY: qmmm_env_mm_create,&
59 : qmmm_env_mm_release,&
60 : qmmm_env_mm_type
61 : #include "./base/base_uses.f90"
62 :
63 : IMPLICIT NONE
64 : PRIVATE
65 :
66 : ! **************************************************************************************************
67 : !> \par History
68 : !> 11/03
69 : !> \author CJM
70 : ! **************************************************************************************************
71 : TYPE fist_environment_type
72 : PRIVATE
73 : LOGICAL :: qmmm = .FALSE.
74 : LOGICAL :: shell_model = .FALSE., shell_model_ad = .FALSE.
75 : TYPE(qmmm_env_mm_type), POINTER :: qmmm_env => NULL()
76 : TYPE(cell_type), POINTER :: cell_ref => NULL()
77 : TYPE(ewald_environment_type), POINTER :: ewald_env => NULL()
78 : TYPE(ewald_pw_type), POINTER :: ewald_pw => NULL()
79 : TYPE(fist_energy_type), POINTER :: thermo => NULL()
80 : TYPE(mp_para_env_type), POINTER :: para_env => NULL()
81 : TYPE(cp_subsys_type), POINTER :: subsys => NULL()
82 : TYPE(fist_nonbond_env_type), POINTER :: fist_nonbond_env => NULL()
83 : TYPE(section_vals_type), POINTER :: input => NULL()
84 : TYPE(exclusion_type), DIMENSION(:), POINTER :: exclusions => NULL()
85 : TYPE(fist_efield_type), POINTER :: efield => NULL()
86 : END TYPE fist_environment_type
87 :
88 : ! *** Public data types ***
89 : PUBLIC :: fist_environment_type
90 :
91 : ! *** Public subroutines ***
92 : PUBLIC :: fist_env_get, &
93 : fist_env_set, &
94 : fist_env_create, &
95 : fist_env_release
96 :
97 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'fist_environment_types'
98 :
99 : !***
100 :
101 : CONTAINS
102 :
103 : ! **************************************************************************************************
104 : !> \brief Purpose: Get the FIST environment.
105 : !> \param fist_env the pointer to the fist_env
106 : !> \param atomic_kind_set ...
107 : !> \param particle_set ...
108 : !> \param ewald_pw ...
109 : !> \param local_particles ...
110 : !> \param local_molecules ...
111 : !> \param molecule_kind_set ...
112 : !> \param molecule_set ...
113 : !> \param cell ...
114 : !> \param cell_ref ...
115 : !> \param ewald_env ...
116 : !> \param fist_nonbond_env ...
117 : !> \param thermo ...
118 : !> \param para_env ...
119 : !> \param subsys ...
120 : !> \param qmmm ...
121 : !> \param qmmm_env ...
122 : !> \param input ...
123 : !> \param shell_model ...
124 : !> \param shell_model_ad ...
125 : !> \param shell_particle_set ...
126 : !> \param core_particle_set ...
127 : !> \param multipoles ...
128 : !> \param results ...
129 : !> \param exclusions ...
130 : !> \param efield ...
131 : !> \par History
132 : !> 11/03
133 : !> \author CJM
134 : ! **************************************************************************************************
135 2054112 : SUBROUTINE fist_env_get(fist_env, atomic_kind_set, particle_set, ewald_pw, &
136 : local_particles, local_molecules, molecule_kind_set, molecule_set, cell, &
137 : cell_ref, ewald_env, fist_nonbond_env, thermo, para_env, subsys, qmmm, &
138 : qmmm_env, input, shell_model, shell_model_ad, shell_particle_set, &
139 : core_particle_set, multipoles, results, exclusions, efield)
140 :
141 : TYPE(fist_environment_type), INTENT(IN) :: fist_env
142 : TYPE(atomic_kind_type), OPTIONAL, POINTER :: atomic_kind_set(:)
143 : TYPE(particle_type), OPTIONAL, POINTER :: particle_set(:)
144 : TYPE(ewald_pw_type), OPTIONAL, POINTER :: ewald_pw
145 : TYPE(distribution_1d_type), OPTIONAL, POINTER :: local_particles, local_molecules
146 : TYPE(molecule_kind_type), OPTIONAL, POINTER :: molecule_kind_set(:)
147 : TYPE(molecule_type), OPTIONAL, POINTER :: molecule_set(:)
148 : TYPE(cell_type), OPTIONAL, POINTER :: cell, cell_ref
149 : TYPE(ewald_environment_type), OPTIONAL, POINTER :: ewald_env
150 : TYPE(fist_nonbond_env_type), OPTIONAL, POINTER :: fist_nonbond_env
151 : TYPE(fist_energy_type), OPTIONAL, POINTER :: thermo
152 : TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env
153 : TYPE(cp_subsys_type), OPTIONAL, POINTER :: subsys
154 : LOGICAL, OPTIONAL :: qmmm
155 : TYPE(qmmm_env_mm_type), OPTIONAL, POINTER :: qmmm_env
156 : TYPE(section_vals_type), OPTIONAL, POINTER :: input
157 : LOGICAL, OPTIONAL :: shell_model, shell_model_ad
158 : TYPE(particle_type), OPTIONAL, POINTER :: shell_particle_set(:), &
159 : core_particle_set(:)
160 : TYPE(multipole_type), OPTIONAL, POINTER :: multipoles
161 : TYPE(cp_result_type), OPTIONAL, POINTER :: results
162 : TYPE(exclusion_type), DIMENSION(:), OPTIONAL, &
163 : POINTER :: exclusions
164 : TYPE(fist_efield_type), OPTIONAL, POINTER :: efield
165 :
166 : TYPE(atomic_kind_list_type), POINTER :: atomic_kinds
167 : TYPE(molecule_kind_list_type), POINTER :: molecule_kinds
168 : TYPE(molecule_list_type), POINTER :: molecules
169 : TYPE(multipole_type), POINTER :: fist_multipoles
170 : TYPE(particle_list_type), POINTER :: core_particles, particles, &
171 : shell_particles
172 :
173 2054112 : NULLIFY (atomic_kinds, particles, molecules, molecule_kinds, fist_multipoles)
174 :
175 2054112 : IF (PRESENT(input)) input => fist_env%input
176 2054112 : IF (PRESENT(qmmm)) qmmm = fist_env%qmmm
177 2054112 : IF (PRESENT(qmmm_env)) qmmm_env => fist_env%qmmm_env
178 2054112 : IF (PRESENT(cell_ref)) cell_ref => fist_env%cell_ref
179 2054112 : IF (PRESENT(ewald_env)) ewald_env => fist_env%ewald_env
180 2054112 : IF (PRESENT(thermo)) thermo => fist_env%thermo
181 2054112 : IF (PRESENT(exclusions)) exclusions => fist_env%exclusions
182 2054112 : IF (PRESENT(para_env)) para_env => fist_env%para_env
183 2054112 : IF (PRESENT(ewald_pw)) ewald_pw => fist_env%ewald_pw
184 2054112 : IF (PRESENT(fist_nonbond_env)) fist_nonbond_env => fist_env%fist_nonbond_env
185 2054112 : IF (PRESENT(shell_model)) shell_model = fist_env%shell_model
186 2054112 : IF (PRESENT(shell_model_ad)) shell_model_ad = fist_env%shell_model_ad
187 2054112 : IF (PRESENT(subsys)) subsys => fist_env%subsys
188 2054112 : IF (PRESENT(efield)) efield => fist_env%efield
189 :
190 2054112 : IF (ASSOCIATED(fist_env%subsys)) THEN
191 : CALL cp_subsys_get(fist_env%subsys, &
192 : atomic_kinds=atomic_kinds, &
193 : local_molecules=local_molecules, &
194 : local_particles=local_particles, &
195 : particles=particles, &
196 : molecule_kinds=molecule_kinds, &
197 : molecules=molecules, &
198 : shell_particles=shell_particles, &
199 : core_particles=core_particles, &
200 : multipoles=fist_multipoles, &
201 : results=results, &
202 2051475 : cell=cell)
203 : END IF
204 2054112 : IF (PRESENT(atomic_kind_set)) atomic_kind_set => atomic_kinds%els
205 2054112 : IF (PRESENT(particle_set)) particle_set => particles%els
206 2054112 : IF (PRESENT(molecule_kind_set)) molecule_kind_set => molecule_kinds%els
207 2054112 : IF (PRESENT(molecule_set)) molecule_set => molecules%els
208 2054112 : IF (PRESENT(shell_particle_set)) shell_particle_set => shell_particles%els
209 2054112 : IF (PRESENT(core_particle_set)) core_particle_set => core_particles%els
210 2054112 : IF (PRESENT(multipoles)) multipoles => fist_multipoles
211 2054112 : END SUBROUTINE fist_env_get
212 :
213 : ! **************************************************************************************************
214 : !> \brief Initialise the FIST environment.
215 : !> \param fist_env the pointer to the fist_env
216 : !> \param para_env ...
217 : !> \par History
218 : !> 11/03
219 : !> \author CJM
220 : ! **************************************************************************************************
221 2637 : SUBROUTINE init_fist_env(fist_env, para_env)
222 :
223 : TYPE(fist_environment_type), INTENT(OUT) :: fist_env
224 : TYPE(mp_para_env_type), POINTER :: para_env
225 :
226 : NULLIFY (fist_env%input)
227 : NULLIFY (fist_env%qmmm_env)
228 : NULLIFY (fist_env%cell_ref)
229 : NULLIFY (fist_env%ewald_env)
230 : NULLIFY (fist_env%ewald_pw)
231 : NULLIFY (fist_env%thermo)
232 : NULLIFY (fist_env%fist_nonbond_env)
233 : NULLIFY (fist_env%subsys)
234 : NULLIFY (fist_env%exclusions)
235 : NULLIFY (fist_env%efield)
236 : fist_env%qmmm = .FALSE.
237 : fist_env%shell_model = .FALSE.
238 : fist_env%shell_model_ad = .FALSE.
239 2637 : ALLOCATE (fist_env%qmmm_env)
240 2637 : CALL qmmm_env_mm_create(fist_env%qmmm_env)
241 2637 : NULLIFY (fist_env%subsys)
242 2637 : CALL para_env%retain()
243 2637 : fist_env%para_env => para_env
244 :
245 2637 : END SUBROUTINE init_fist_env
246 :
247 : ! **************************************************************************************************
248 : !> \brief Set the FIST environment.
249 : !> \param fist_env the pointer to the fist_env
250 : !> \param atomic_kind_set ...
251 : !> \param particle_set ...
252 : !> \param ewald_pw ...
253 : !> \param local_particles ...
254 : !> \param local_molecules ...
255 : !> \param molecule_kind_set ...
256 : !> \param molecule_set ...
257 : !> \param cell_ref ...
258 : !> \param ewald_env ...
259 : !> \param fist_nonbond_env ...
260 : !> \param thermo ...
261 : !> \param subsys ...
262 : !> \param qmmm ...
263 : !> \param qmmm_env ...
264 : !> \param input ...
265 : !> \param shell_model ...
266 : !> \param shell_model_ad ...
267 : !> \param exclusions ...
268 : !> \param efield ...
269 : !> \par History
270 : !> 11/03
271 : !> \author CJM
272 : ! **************************************************************************************************
273 15822 : SUBROUTINE fist_env_set(fist_env, atomic_kind_set, particle_set, ewald_pw, &
274 : local_particles, local_molecules, molecule_kind_set, &
275 : molecule_set, cell_ref, ewald_env, &
276 : fist_nonbond_env, thermo, subsys, qmmm, qmmm_env, &
277 : input, shell_model, shell_model_ad, exclusions, efield)
278 :
279 : TYPE(fist_environment_type), INTENT(INOUT) :: fist_env
280 : TYPE(atomic_kind_type), OPTIONAL, POINTER :: atomic_kind_set(:)
281 : TYPE(particle_type), OPTIONAL, POINTER :: particle_set(:)
282 : TYPE(ewald_pw_type), OPTIONAL, POINTER :: ewald_pw
283 : TYPE(distribution_1d_type), OPTIONAL, POINTER :: local_particles, local_molecules
284 : TYPE(molecule_kind_type), OPTIONAL, POINTER :: molecule_kind_set(:)
285 : TYPE(molecule_type), OPTIONAL, POINTER :: molecule_set(:)
286 : TYPE(cell_type), OPTIONAL, POINTER :: cell_ref
287 : TYPE(ewald_environment_type), OPTIONAL, POINTER :: ewald_env
288 : TYPE(fist_nonbond_env_type), OPTIONAL, POINTER :: fist_nonbond_env
289 : TYPE(fist_energy_type), OPTIONAL, POINTER :: thermo
290 : TYPE(cp_subsys_type), OPTIONAL, POINTER :: subsys
291 : LOGICAL, OPTIONAL :: qmmm
292 : TYPE(qmmm_env_mm_type), OPTIONAL, POINTER :: qmmm_env
293 : TYPE(section_vals_type), OPTIONAL, POINTER :: input
294 : LOGICAL, OPTIONAL :: shell_model, shell_model_ad
295 : TYPE(exclusion_type), DIMENSION(:), OPTIONAL, &
296 : POINTER :: exclusions
297 : TYPE(fist_efield_type), OPTIONAL, POINTER :: efield
298 :
299 : TYPE(atomic_kind_list_type), POINTER :: atomic_kinds
300 : TYPE(molecule_kind_list_type), POINTER :: molecule_kinds
301 : TYPE(molecule_list_type), POINTER :: molecules
302 : TYPE(particle_list_type), POINTER :: particles
303 :
304 15822 : IF (PRESENT(qmmm)) fist_env%qmmm = qmmm
305 15822 : IF (PRESENT(qmmm_env)) THEN
306 394 : IF (ASSOCIATED(fist_env%qmmm_env)) THEN
307 394 : CALL qmmm_env_mm_release(fist_env%qmmm_env)
308 394 : DEALLOCATE (fist_env%qmmm_env)
309 : END IF
310 394 : fist_env%qmmm_env => qmmm_env
311 : END IF
312 15822 : IF (PRESENT(ewald_env)) THEN
313 2637 : IF (ASSOCIATED(fist_env%ewald_env)) THEN
314 0 : IF (.NOT. ASSOCIATED(fist_env%ewald_env, ewald_env)) THEN
315 0 : CALL ewald_env_release(fist_env%ewald_env)
316 0 : DEALLOCATE (fist_env%ewald_env)
317 : END IF
318 : END IF
319 2637 : fist_env%ewald_env => ewald_env
320 : END IF
321 15822 : IF (PRESENT(ewald_pw)) THEN
322 2637 : IF (ASSOCIATED(fist_env%ewald_pw)) THEN
323 0 : IF (.NOT. ASSOCIATED(fist_env%ewald_pw, ewald_pw)) THEN
324 0 : CALL ewald_pw_release(fist_env%ewald_pw)
325 0 : DEALLOCATE (fist_env%ewald_pw)
326 : END IF
327 : END IF
328 2637 : fist_env%ewald_pw => ewald_pw
329 : END IF
330 15822 : IF (PRESENT(cell_ref)) THEN
331 2637 : CALL cell_retain(cell_ref)
332 2637 : CALL cell_release(fist_env%cell_ref)
333 2637 : fist_env%cell_ref => cell_ref
334 : END IF
335 15822 : IF (PRESENT(fist_nonbond_env)) THEN
336 2637 : IF (ASSOCIATED(fist_env%fist_nonbond_env)) THEN
337 0 : IF (.NOT. ASSOCIATED(fist_env%fist_nonbond_env, fist_nonbond_env)) THEN
338 0 : CALL fist_nonbond_env_release(fist_env%fist_nonbond_env)
339 0 : DEALLOCATE (fist_env%fist_nonbond_env)
340 : END IF
341 : END IF
342 2637 : fist_env%fist_nonbond_env => fist_nonbond_env
343 : END IF
344 15822 : IF (PRESENT(input)) THEN
345 2637 : CALL section_vals_retain(input)
346 2637 : CALL section_vals_release(fist_env%input)
347 2637 : fist_env%input => input
348 : END IF
349 15822 : IF (PRESENT(thermo)) fist_env%thermo => thermo
350 15822 : IF (PRESENT(subsys)) THEN
351 2637 : IF (ASSOCIATED(fist_env%subsys)) THEN
352 0 : IF (.NOT. ASSOCIATED(fist_env%subsys, subsys)) THEN
353 0 : CALL cp_subsys_release(fist_env%subsys)
354 : END IF
355 : END IF
356 2637 : fist_env%subsys => subsys
357 : END IF
358 15822 : IF (PRESENT(atomic_kind_set)) THEN
359 : CALL atomic_kind_list_create(atomic_kinds, &
360 0 : els_ptr=atomic_kind_set)
361 : CALL cp_subsys_set(fist_env%subsys, &
362 0 : atomic_kinds=atomic_kinds)
363 0 : CALL atomic_kind_list_release(atomic_kinds)
364 : END IF
365 15822 : IF (PRESENT(particle_set)) THEN
366 : CALL particle_list_create(particles, &
367 0 : els_ptr=particle_set)
368 : CALL cp_subsys_set(fist_env%subsys, &
369 0 : particles=particles)
370 0 : CALL particle_list_release(particles)
371 : END IF
372 15822 : IF (PRESENT(local_particles)) THEN
373 : CALL cp_subsys_set(fist_env%subsys, &
374 2637 : local_particles=local_particles)
375 : END IF
376 15822 : IF (PRESENT(local_molecules)) THEN
377 : CALL cp_subsys_set(fist_env%subsys, &
378 2637 : local_molecules=local_molecules)
379 : END IF
380 15822 : IF (PRESENT(molecule_kind_set)) THEN
381 : CALL molecule_kind_list_create(molecule_kinds, &
382 0 : els_ptr=molecule_kind_set)
383 : CALL cp_subsys_set(fist_env%subsys, &
384 0 : molecule_kinds=molecule_kinds)
385 0 : CALL molecule_kind_list_release(molecule_kinds)
386 : END IF
387 15822 : IF (PRESENT(molecule_set)) THEN
388 : CALL molecule_list_create(molecules, &
389 0 : els_ptr=molecule_set)
390 : CALL cp_subsys_set(fist_env%subsys, &
391 0 : molecules=molecules)
392 0 : CALL molecule_list_release(molecules)
393 : END IF
394 15822 : IF (PRESENT(exclusions)) fist_env%exclusions => exclusions
395 15822 : IF (PRESENT(shell_model)) THEN
396 2637 : fist_env%shell_model = shell_model
397 : END IF
398 15822 : IF (PRESENT(shell_model_ad)) THEN
399 2637 : fist_env%shell_model_ad = shell_model_ad
400 : END IF
401 15822 : IF (PRESENT(efield)) fist_env%efield => efield
402 :
403 15822 : END SUBROUTINE fist_env_set
404 :
405 : ! **************************************************************************************************
406 : !> \brief allocates and intitializes a fist_env
407 : !> \param fist_env the object to create
408 : !> \param para_env the parallel environment for the qs_env
409 : !> \par History
410 : !> 12.2002 created [fawzi]
411 : !> \author Fawzi Mohamed
412 : ! **************************************************************************************************
413 2637 : SUBROUTINE fist_env_create(fist_env, para_env)
414 : TYPE(fist_environment_type), INTENT(OUT) :: fist_env
415 : TYPE(mp_para_env_type), INTENT(IN), POINTER :: para_env
416 :
417 2637 : CALL init_fist_env(fist_env, para_env=para_env)
418 2637 : END SUBROUTINE fist_env_create
419 :
420 : ! **************************************************************************************************
421 : !> \brief releases the given fist_env (see doc/ReferenceCounting.html)
422 : !> \param fist_env the object to release
423 : !> \par History
424 : !> 12.2002 created [fawzi]
425 : !> \author Fawzi Mohamed
426 : ! **************************************************************************************************
427 2637 : SUBROUTINE fist_env_release(fist_env)
428 : TYPE(fist_environment_type), INTENT(INOUT) :: fist_env
429 :
430 2637 : IF (ASSOCIATED(fist_env%qmmm_env)) THEN
431 2637 : CALL qmmm_env_mm_release(fist_env%qmmm_env)
432 2637 : DEALLOCATE (fist_env%qmmm_env)
433 : END IF
434 2637 : CALL cell_release(fist_env%cell_ref)
435 2637 : IF (ASSOCIATED(fist_env%ewald_pw)) THEN
436 2637 : CALL ewald_pw_release(fist_env%ewald_pw)
437 2637 : DEALLOCATE (fist_env%ewald_pw)
438 : END IF
439 2637 : IF (ASSOCIATED(fist_env%ewald_env)) THEN
440 2637 : CALL ewald_env_release(fist_env%ewald_env)
441 2637 : DEALLOCATE (fist_env%ewald_env)
442 : END IF
443 2637 : CALL mp_para_env_release(fist_env%para_env)
444 2637 : CALL deallocate_fist_energy(fist_env%thermo)
445 :
446 2637 : IF (ASSOCIATED(fist_env%fist_nonbond_env)) THEN
447 2637 : CALL fist_nonbond_env_release(fist_env%fist_nonbond_env)
448 2637 : DEALLOCATE (fist_env%fist_nonbond_env)
449 : END IF
450 2637 : CALL cp_subsys_release(fist_env%subsys)
451 2637 : CALL section_vals_release(fist_env%input)
452 2637 : CALL exclusion_release(fist_env%exclusions)
453 :
454 2637 : IF (ASSOCIATED(fist_env%efield)) THEN
455 2637 : DEALLOCATE (fist_env%efield)
456 : END IF
457 :
458 2637 : END SUBROUTINE fist_env_release
459 :
460 0 : END MODULE fist_environment_types
|