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 : !> \par History
10 : !> give the md_env its own para_env Joost VandeVondele 07.2003
11 : !> Teodoro Laino - 09.2007 - University of Zurich - generalizing thermostats
12 : !> and barostats
13 : !> \author CJM SEPT-12-02
14 : ! **************************************************************************************************
15 : MODULE md_environment_types
16 : USE averages_types, ONLY: average_quantities_type,&
17 : create_averages,&
18 : release_averages,&
19 : retain_averages
20 : USE barostat_types, ONLY: barostat_type,&
21 : release_barostat_type
22 : USE cell_types, ONLY: cell_type
23 : USE extended_system_types, ONLY: npt_info_type
24 : USE force_env_types, ONLY: force_env_release,&
25 : force_env_retain,&
26 : force_env_type
27 : USE free_energy_types, ONLY: fe_env_release,&
28 : free_energy_type
29 : USE input_constants, ONLY: do_thermo_al,&
30 : langevin_ensemble
31 : USE input_section_types, ONLY: section_vals_get_subs_vals,&
32 : section_vals_type
33 : USE kinds, ONLY: dp
34 : USE md_ener_types, ONLY: md_ener_type,&
35 : release_md_ener
36 : USE message_passing, ONLY: mp_para_env_release,&
37 : mp_para_env_type
38 : USE reftraj_types, ONLY: reftraj_type,&
39 : release_reftraj
40 : USE simpar_types, ONLY: simpar_type
41 : USE thermal_region_types, ONLY: release_thermal_regions,&
42 : thermal_regions_type
43 : USE thermostat_types, ONLY: release_thermostats,&
44 : thermostat_type,&
45 : thermostats_type
46 : #include "../base/base_uses.f90"
47 :
48 : IMPLICIT NONE
49 :
50 : PRIVATE
51 :
52 : ! **************************************************************************************************
53 : TYPE md_environment_type
54 : ! para_env is the parallel environment of the MD, i.e. the systems
55 : ! that are dealt with by the integrator e.g in the PIMD this could
56 : ! be parent of every bead.
57 : PRIVATE
58 : LOGICAL :: init = .FALSE., first_time = .FALSE., ehrenfest_md = .FALSE.
59 : INTEGER, POINTER :: itimes => NULL()
60 : REAL(KIND=dp), POINTER :: used_time => NULL(), t => NULL()
61 : REAL(KIND=dp), POINTER :: constant => NULL()
62 : TYPE(mp_para_env_type), POINTER :: para_env => NULL()
63 : TYPE(cell_type), POINTER :: cell => NULL()
64 : TYPE(force_env_type), POINTER :: force_env => NULL()
65 : TYPE(md_ener_type), POINTER :: md_ener => NULL()
66 : TYPE(thermostats_type), POINTER :: thermostats => NULL()
67 : TYPE(barostat_type), POINTER :: barostat => NULL()
68 : TYPE(reftraj_type), POINTER :: reftraj => NULL()
69 : TYPE(free_energy_type), POINTER :: fe_env => NULL()
70 : TYPE(simpar_type), POINTER :: simpar => NULL()
71 : TYPE(average_quantities_type), POINTER :: averages => NULL()
72 : TYPE(thermal_regions_type), POINTER :: thermal_regions => NULL()
73 : END TYPE md_environment_type
74 :
75 : ! *** Public subroutines and data types ***
76 : PUBLIC :: md_environment_type, set_md_env, get_md_env, md_env_create, &
77 : md_env_release, need_per_atom_wiener_process
78 :
79 : ! *** Global parameters ***
80 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'md_environment_types'
81 :
82 : CONTAINS
83 :
84 : ! **************************************************************************************************
85 : !> \brief Creates MD environment
86 : !> Purpose: Initialise the integrator environment.
87 : !> retain the para_env for this environment (should be used for parallel
88 : !> communications)
89 : !> \param md_env the force environment to retain
90 : !> \param md_section ...
91 : !> \param para_env ...
92 : !> \param force_env ...
93 : ! **************************************************************************************************
94 1786 : SUBROUTINE md_env_create(md_env, md_section, para_env, force_env)
95 : TYPE(md_environment_type), INTENT(OUT) :: md_env
96 : TYPE(section_vals_type), POINTER :: md_section
97 : TYPE(mp_para_env_type), POINTER :: para_env
98 : TYPE(force_env_type), POINTER :: force_env
99 :
100 : TYPE(section_vals_type), POINTER :: averages_section
101 :
102 1786 : md_env%para_env => para_env
103 1786 : CALL md_env%para_env%retain()
104 1786 : ALLOCATE (md_env%itimes)
105 1786 : ALLOCATE (md_env%constant)
106 1786 : ALLOCATE (md_env%used_time)
107 1786 : ALLOCATE (md_env%t)
108 1786 : md_env%itimes = -1
109 1786 : md_env%constant = 0.0_dp
110 1786 : md_env%used_time = 0.0_dp
111 1786 : md_env%t = 0.0_dp
112 1786 : md_env%init = .TRUE.
113 1786 : md_env%first_time = .TRUE.
114 1786 : md_env%ehrenfest_md = .FALSE.
115 1786 : averages_section => section_vals_get_subs_vals(md_section, "AVERAGES")
116 1786 : CALL create_averages(md_env%averages, averages_section, force_env=force_env)
117 :
118 1786 : END SUBROUTINE md_env_create
119 :
120 : ! **************************************************************************************************
121 : !> \brief releases the given md env
122 : !> \param md_env the md environment to release
123 : !> \par History
124 : !> 04.2003 created [fawzi]
125 : !> \author fawzi
126 : ! **************************************************************************************************
127 1786 : SUBROUTINE md_env_release(md_env)
128 : TYPE(md_environment_type), INTENT(INOUT) :: md_env
129 :
130 1786 : CALL fe_env_release(md_env%fe_env)
131 1786 : CALL mp_para_env_release(md_env%para_env)
132 1786 : DEALLOCATE (md_env%itimes)
133 1786 : DEALLOCATE (md_env%constant)
134 1786 : DEALLOCATE (md_env%used_time)
135 1786 : DEALLOCATE (md_env%t)
136 :
137 1786 : NULLIFY (md_env%cell)
138 1786 : NULLIFY (md_env%simpar)
139 1786 : CALL release_barostat_type(md_env%barostat)
140 1786 : IF (ASSOCIATED(md_env%thermostats)) THEN
141 542 : CALL release_thermostats(md_env%thermostats)
142 542 : DEALLOCATE (md_env%thermostats)
143 : END IF
144 1786 : IF (ASSOCIATED(md_env%reftraj)) THEN
145 38 : CALL release_reftraj(md_env%reftraj)
146 38 : DEALLOCATE (md_env%reftraj)
147 : END IF
148 1786 : IF (ASSOCIATED(md_env%md_ener)) THEN
149 1786 : CALL release_md_ener(md_env%md_ener)
150 1786 : DEALLOCATE (md_env%md_ener)
151 : END IF
152 1786 : CALL force_env_release(md_env%force_env)
153 1786 : CALL release_averages(md_env%averages)
154 1786 : IF (ASSOCIATED(md_env%thermal_regions)) THEN
155 14 : CALL release_thermal_regions(md_env%thermal_regions)
156 14 : DEALLOCATE (md_env%thermal_regions)
157 : END IF
158 :
159 1786 : END SUBROUTINE md_env_release
160 :
161 : ! **************************************************************************************************
162 : !> \brief get components of MD environment type
163 : !> \param md_env the force environment to retain
164 : !> \param itimes ...
165 : !> \param constant ...
166 : !> \param used_time ...
167 : !> \param cell ...
168 : !> \param simpar ...
169 : !> \param npt ...
170 : !> \param force_env ...
171 : !> \param para_env ...
172 : !> \param reftraj ...
173 : !> \param t ...
174 : !> \param init ...
175 : !> \param first_time ...
176 : !> \param fe_env ...
177 : !> \param thermostats ...
178 : !> \param barostat ...
179 : !> \param thermostat_coeff ...
180 : !> \param thermostat_part ...
181 : !> \param thermostat_shell ...
182 : !> \param thermostat_baro ...
183 : !> \param thermostat_fast ...
184 : !> \param thermostat_slow ...
185 : !> \param md_ener ...
186 : !> \param averages ...
187 : !> \param thermal_regions ...
188 : !> \param ehrenfest_md ...
189 : ! **************************************************************************************************
190 534693 : SUBROUTINE get_md_env(md_env, itimes, constant, used_time, cell, simpar, npt, &
191 : force_env, para_env, reftraj, t, init, first_time, fe_env, thermostats, barostat, &
192 : thermostat_coeff, thermostat_part, thermostat_shell, thermostat_baro, &
193 : thermostat_fast, thermostat_slow, md_ener, averages, &
194 : thermal_regions, ehrenfest_md)
195 :
196 : TYPE(md_environment_type), INTENT(IN) :: md_env
197 : INTEGER, OPTIONAL, POINTER :: itimes
198 : REAL(KIND=dp), OPTIONAL, POINTER :: constant, used_time
199 : TYPE(cell_type), OPTIONAL, POINTER :: cell
200 : TYPE(simpar_type), OPTIONAL, POINTER :: simpar
201 : TYPE(npt_info_type), OPTIONAL, POINTER :: npt(:, :)
202 : TYPE(force_env_type), OPTIONAL, POINTER :: force_env
203 : TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env
204 : TYPE(reftraj_type), OPTIONAL, POINTER :: reftraj
205 : REAL(KIND=dp), OPTIONAL, POINTER :: t
206 : LOGICAL, OPTIONAL :: init, first_time
207 : TYPE(free_energy_type), OPTIONAL, POINTER :: fe_env
208 : TYPE(thermostats_type), OPTIONAL, POINTER :: thermostats
209 : TYPE(barostat_type), OPTIONAL, POINTER :: barostat
210 : TYPE(thermostat_type), OPTIONAL, POINTER :: thermostat_coeff, thermostat_part, &
211 : thermostat_shell, thermostat_baro, &
212 : thermostat_fast, thermostat_slow
213 : TYPE(md_ener_type), OPTIONAL, POINTER :: md_ener
214 : TYPE(average_quantities_type), OPTIONAL, POINTER :: averages
215 : TYPE(thermal_regions_type), OPTIONAL, POINTER :: thermal_regions
216 : LOGICAL, OPTIONAL :: ehrenfest_md
217 :
218 534693 : IF (PRESENT(itimes)) itimes => md_env%itimes
219 534693 : IF (PRESENT(fe_env)) fe_env => md_env%fe_env
220 534693 : IF (PRESENT(constant)) constant => md_env%constant
221 534693 : IF (PRESENT(used_time)) used_time => md_env%used_time
222 534693 : IF (PRESENT(t)) t => md_env%t
223 534693 : IF (PRESENT(cell)) cell => md_env%cell
224 534693 : IF (PRESENT(simpar)) simpar => md_env%simpar
225 534693 : IF (PRESENT(thermostats)) thermostats => md_env%thermostats
226 534693 : IF (PRESENT(barostat)) barostat => md_env%barostat
227 : IF (PRESENT(thermostat_part) .OR. PRESENT(thermostat_coeff) .OR. &
228 : PRESENT(thermostat_baro) .OR. PRESENT(thermostat_shell) .OR. &
229 534693 : PRESENT(thermostat_fast) .OR. PRESENT(thermostat_slow)) THEN
230 89450 : IF (ASSOCIATED(md_env%thermostats)) THEN
231 21562 : IF (PRESENT(thermostat_part)) THEN
232 21146 : thermostat_part => md_env%thermostats%thermostat_part
233 : END IF
234 21562 : IF (PRESENT(thermostat_coeff)) THEN
235 15258 : thermostat_coeff => md_env%thermostats%thermostat_coef
236 : END IF
237 21562 : IF (PRESENT(thermostat_shell)) THEN
238 21562 : thermostat_shell => md_env%thermostats%thermostat_shell
239 : END IF
240 21562 : IF (PRESENT(thermostat_fast)) THEN
241 0 : thermostat_fast => md_env%thermostats%thermostat_fast
242 : END IF
243 21562 : IF (PRESENT(thermostat_slow)) THEN
244 0 : thermostat_slow => md_env%thermostats%thermostat_slow
245 : END IF
246 21562 : IF (PRESENT(thermostat_baro)) THEN
247 6128 : thermostat_baro => md_env%thermostats%thermostat_baro
248 : END IF
249 : END IF
250 : END IF
251 534693 : IF (PRESENT(npt)) THEN
252 10762 : IF (ASSOCIATED(md_env%barostat)) THEN
253 5648 : npt => md_env%barostat%npt
254 : END IF
255 : END IF
256 534693 : IF (PRESENT(averages)) averages => md_env%averages
257 534693 : IF (PRESENT(force_env)) force_env => md_env%force_env
258 534693 : IF (PRESENT(para_env)) para_env => md_env%para_env
259 534693 : IF (PRESENT(reftraj)) reftraj => md_env%reftraj
260 534693 : IF (PRESENT(md_ener)) md_ener => md_env%md_ener
261 534693 : IF (PRESENT(init)) init = md_env%init
262 534693 : IF (PRESENT(first_time)) first_time = md_env%first_time
263 534693 : IF (PRESENT(ehrenfest_md)) ehrenfest_md = md_env%ehrenfest_md
264 534693 : IF (PRESENT(thermal_regions)) thermal_regions => md_env%thermal_regions
265 :
266 534693 : END SUBROUTINE get_md_env
267 :
268 : ! **************************************************************************************************
269 : !> \brief Set the integrator environment to the correct program.
270 : !> \param md_env the force environment to retain
271 : !> \param itimes ...
272 : !> \param constant ...
273 : !> \param cell ...
274 : !> \param simpar ...
275 : !> \param fe_env ...
276 : !> \param force_env ...
277 : !> \param para_env ...
278 : !> \param init ...
279 : !> \param first_time ...
280 : !> \param thermostats ...
281 : !> \param barostat ...
282 : !> \param reftraj ...
283 : !> \param md_ener ...
284 : !> \param averages ...
285 : !> \param thermal_regions ...
286 : !> \param ehrenfest_md ...
287 : ! **************************************************************************************************
288 52321 : SUBROUTINE set_md_env(md_env, itimes, constant, cell, simpar, fe_env, force_env, &
289 : para_env, init, first_time, thermostats, barostat, reftraj, md_ener, averages, &
290 : thermal_regions, ehrenfest_md)
291 :
292 : TYPE(md_environment_type), INTENT(INOUT) :: md_env
293 : INTEGER, OPTIONAL, POINTER :: itimes
294 : REAL(KIND=dp), OPTIONAL, POINTER :: constant
295 : TYPE(cell_type), OPTIONAL, POINTER :: cell
296 : TYPE(simpar_type), OPTIONAL, POINTER :: simpar
297 : TYPE(free_energy_type), OPTIONAL, POINTER :: fe_env
298 : TYPE(force_env_type), OPTIONAL, POINTER :: force_env
299 : TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env
300 : LOGICAL, OPTIONAL :: init, first_time
301 : TYPE(thermostats_type), OPTIONAL, POINTER :: thermostats
302 : TYPE(barostat_type), OPTIONAL, POINTER :: barostat
303 : TYPE(reftraj_type), OPTIONAL, POINTER :: reftraj
304 : TYPE(md_ener_type), OPTIONAL, POINTER :: md_ener
305 : TYPE(average_quantities_type), OPTIONAL, POINTER :: averages
306 : TYPE(thermal_regions_type), OPTIONAL, POINTER :: thermal_regions
307 : LOGICAL, OPTIONAL :: ehrenfest_md
308 :
309 52321 : IF (PRESENT(init)) md_env%init = init
310 52321 : IF (PRESENT(first_time)) md_env%first_time = first_time
311 52321 : IF (PRESENT(ehrenfest_md)) md_env%ehrenfest_md = ehrenfest_md
312 52321 : IF (PRESENT(cell)) md_env%cell => cell
313 52321 : IF (PRESENT(barostat)) THEN
314 1786 : IF (ASSOCIATED(md_env%barostat)) THEN
315 0 : IF (.NOT. ASSOCIATED(md_env%barostat, barostat)) THEN
316 0 : CALL release_barostat_type(md_env%barostat)
317 : END IF
318 : END IF
319 1786 : md_env%barostat => barostat
320 : END IF
321 52321 : IF (PRESENT(thermostats)) THEN
322 1786 : IF (ASSOCIATED(md_env%thermostats)) THEN
323 0 : IF (.NOT. ASSOCIATED(md_env%thermostats, thermostats)) THEN
324 0 : CALL release_thermostats(md_env%thermostats)
325 0 : DEALLOCATE (md_env%thermostats)
326 : END IF
327 : END IF
328 1786 : md_env%thermostats => thermostats
329 : END IF
330 52321 : IF (PRESENT(simpar)) md_env%simpar => simpar
331 52321 : IF (PRESENT(itimes)) md_env%itimes => itimes
332 52321 : IF (PRESENT(fe_env)) md_env%fe_env => fe_env
333 52321 : IF (PRESENT(constant)) md_env%constant => constant
334 52321 : IF (PRESENT(para_env)) md_env%para_env => para_env
335 52321 : IF (PRESENT(force_env)) THEN
336 1786 : IF (ASSOCIATED(force_env)) THEN
337 1786 : CALL force_env_retain(force_env)
338 : END IF
339 1786 : IF (ASSOCIATED(md_env%force_env)) THEN
340 0 : CALL force_env_release(md_env%force_env)
341 : END IF
342 1786 : md_env%force_env => force_env
343 : END IF
344 52321 : IF (PRESENT(reftraj)) THEN
345 38 : IF (ASSOCIATED(md_env%reftraj)) THEN
346 0 : IF (.NOT. ASSOCIATED(md_env%reftraj, reftraj)) THEN
347 0 : CALL release_reftraj(md_env%reftraj)
348 0 : DEALLOCATE (md_env%reftraj)
349 : END IF
350 : END IF
351 38 : md_env%reftraj => reftraj
352 : END IF
353 52321 : IF (PRESENT(md_ener)) THEN
354 1786 : IF (ASSOCIATED(md_env%md_ener)) THEN
355 0 : IF (.NOT. ASSOCIATED(md_env%md_ener, md_ener)) THEN
356 0 : CALL release_md_ener(md_env%md_ener)
357 0 : DEALLOCATE (md_env%md_ener)
358 : END IF
359 : END IF
360 1786 : md_env%md_ener => md_ener
361 : END IF
362 52321 : IF (PRESENT(averages)) THEN
363 20 : CALL release_averages(md_env%averages)
364 20 : CALL retain_averages(averages)
365 20 : md_env%averages => averages
366 : END IF
367 52321 : IF (PRESENT(thermal_regions)) THEN
368 1786 : IF (ASSOCIATED(md_env%thermal_regions)) THEN
369 0 : IF (.NOT. ASSOCIATED(md_env%thermal_regions, thermal_regions)) THEN
370 0 : CALL release_thermal_regions(md_env%thermal_regions)
371 0 : DEALLOCATE (md_env%thermal_regions)
372 : END IF
373 : END IF
374 1786 : md_env%thermal_regions => thermal_regions
375 : END IF
376 :
377 52321 : END SUBROUTINE set_md_env
378 :
379 : ! **************************************************************************************************
380 : !> \brief ...
381 : !> \param md_env ...
382 : !> \return ...
383 : !> \par History
384 : !> 02.2012 created [noamb]
385 : !> \author Noam Bernstein
386 : ! **************************************************************************************************
387 1830 : PURE FUNCTION need_per_atom_wiener_process(md_env)
388 : TYPE(md_environment_type), INTENT(IN) :: md_env
389 : LOGICAL :: need_per_atom_wiener_process
390 :
391 : ! return value
392 : ! check for Langevin ensemble
393 :
394 1830 : need_per_atom_wiener_process = (md_env%simpar%ensemble == langevin_ensemble)
395 1830 : IF (need_per_atom_wiener_process) RETURN
396 :
397 : ! check for adaptive-Langevin thermostat
398 1746 : IF (.NOT. ASSOCIATED(md_env%thermostats)) RETURN
399 546 : IF (.NOT. ASSOCIATED(md_env%thermostats%thermostat_part)) RETURN
400 530 : need_per_atom_wiener_process = (md_env%thermostats%thermostat_part%type_of_thermostat == do_thermo_al)
401 :
402 530 : END FUNCTION need_per_atom_wiener_process
403 :
404 0 : END MODULE md_environment_types
|