Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2023 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, first_time, ehrenfest_md
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 1729 : 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 : NULLIFY (md_env%itimes)
103 : NULLIFY (md_env%constant)
104 : NULLIFY (md_env%t)
105 : NULLIFY (md_env%cell)
106 : NULLIFY (md_env%simpar)
107 : NULLIFY (md_env%thermostats)
108 : NULLIFY (md_env%barostat)
109 : NULLIFY (md_env%force_env)
110 : NULLIFY (md_env%fe_env)
111 : NULLIFY (md_env%md_ener)
112 : NULLIFY (md_env%reftraj)
113 : NULLIFY (md_env%averages)
114 : NULLIFY (md_env%thermal_regions)
115 1729 : md_env%para_env => para_env
116 1729 : CALL md_env%para_env%retain()
117 1729 : ALLOCATE (md_env%itimes)
118 1729 : ALLOCATE (md_env%constant)
119 1729 : ALLOCATE (md_env%used_time)
120 1729 : ALLOCATE (md_env%t)
121 1729 : md_env%itimes = -1
122 1729 : md_env%constant = 0.0_dp
123 1729 : md_env%used_time = 0.0_dp
124 1729 : md_env%t = 0.0_dp
125 1729 : md_env%init = .TRUE.
126 1729 : md_env%first_time = .TRUE.
127 1729 : md_env%ehrenfest_md = .FALSE.
128 1729 : averages_section => section_vals_get_subs_vals(md_section, "AVERAGES")
129 1729 : CALL create_averages(md_env%averages, averages_section, force_env=force_env)
130 :
131 1729 : END SUBROUTINE md_env_create
132 :
133 : ! **************************************************************************************************
134 : !> \brief releases the given md env
135 : !> \param md_env the md environment to release
136 : !> \par History
137 : !> 04.2003 created [fawzi]
138 : !> \author fawzi
139 : ! **************************************************************************************************
140 1729 : SUBROUTINE md_env_release(md_env)
141 : TYPE(md_environment_type), INTENT(INOUT) :: md_env
142 :
143 1729 : CALL fe_env_release(md_env%fe_env)
144 1729 : CALL mp_para_env_release(md_env%para_env)
145 1729 : DEALLOCATE (md_env%itimes)
146 1729 : DEALLOCATE (md_env%constant)
147 1729 : DEALLOCATE (md_env%used_time)
148 1729 : DEALLOCATE (md_env%t)
149 :
150 1729 : NULLIFY (md_env%cell)
151 1729 : NULLIFY (md_env%simpar)
152 1729 : CALL release_barostat_type(md_env%barostat)
153 1729 : IF (ASSOCIATED(md_env%thermostats)) THEN
154 522 : CALL release_thermostats(md_env%thermostats)
155 522 : DEALLOCATE (md_env%thermostats)
156 : END IF
157 1729 : IF (ASSOCIATED(md_env%reftraj)) THEN
158 32 : CALL release_reftraj(md_env%reftraj)
159 32 : DEALLOCATE (md_env%reftraj)
160 : END IF
161 1729 : IF (ASSOCIATED(md_env%md_ener)) THEN
162 1729 : CALL release_md_ener(md_env%md_ener)
163 1729 : DEALLOCATE (md_env%md_ener)
164 : END IF
165 1729 : CALL force_env_release(md_env%force_env)
166 1729 : CALL release_averages(md_env%averages)
167 1729 : IF (ASSOCIATED(md_env%thermal_regions)) THEN
168 14 : CALL release_thermal_regions(md_env%thermal_regions)
169 14 : DEALLOCATE (md_env%thermal_regions)
170 : END IF
171 :
172 1729 : END SUBROUTINE md_env_release
173 :
174 : ! **************************************************************************************************
175 : !> \brief get components of MD environment type
176 : !> \param md_env the force environment to retain
177 : !> \param itimes ...
178 : !> \param constant ...
179 : !> \param used_time ...
180 : !> \param cell ...
181 : !> \param simpar ...
182 : !> \param npt ...
183 : !> \param force_env ...
184 : !> \param para_env ...
185 : !> \param reftraj ...
186 : !> \param t ...
187 : !> \param init ...
188 : !> \param first_time ...
189 : !> \param fe_env ...
190 : !> \param thermostats ...
191 : !> \param barostat ...
192 : !> \param thermostat_coeff ...
193 : !> \param thermostat_part ...
194 : !> \param thermostat_shell ...
195 : !> \param thermostat_baro ...
196 : !> \param thermostat_fast ...
197 : !> \param thermostat_slow ...
198 : !> \param md_ener ...
199 : !> \param averages ...
200 : !> \param thermal_regions ...
201 : !> \param ehrenfest_md ...
202 : ! **************************************************************************************************
203 509882 : SUBROUTINE get_md_env(md_env, itimes, constant, used_time, cell, simpar, npt, &
204 : force_env, para_env, reftraj, t, init, first_time, fe_env, thermostats, barostat, &
205 : thermostat_coeff, thermostat_part, thermostat_shell, thermostat_baro, &
206 : thermostat_fast, thermostat_slow, md_ener, averages, &
207 : thermal_regions, ehrenfest_md)
208 :
209 : TYPE(md_environment_type), INTENT(IN) :: md_env
210 : INTEGER, OPTIONAL, POINTER :: itimes
211 : REAL(KIND=dp), OPTIONAL, POINTER :: constant, used_time
212 : TYPE(cell_type), OPTIONAL, POINTER :: cell
213 : TYPE(simpar_type), OPTIONAL, POINTER :: simpar
214 : TYPE(npt_info_type), OPTIONAL, POINTER :: npt(:, :)
215 : TYPE(force_env_type), OPTIONAL, POINTER :: force_env
216 : TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env
217 : TYPE(reftraj_type), OPTIONAL, POINTER :: reftraj
218 : REAL(KIND=dp), OPTIONAL, POINTER :: t
219 : LOGICAL, OPTIONAL :: init, first_time
220 : TYPE(free_energy_type), OPTIONAL, POINTER :: fe_env
221 : TYPE(thermostats_type), OPTIONAL, POINTER :: thermostats
222 : TYPE(barostat_type), OPTIONAL, POINTER :: barostat
223 : TYPE(thermostat_type), OPTIONAL, POINTER :: thermostat_coeff, thermostat_part, &
224 : thermostat_shell, thermostat_baro, &
225 : thermostat_fast, thermostat_slow
226 : TYPE(md_ener_type), OPTIONAL, POINTER :: md_ener
227 : TYPE(average_quantities_type), OPTIONAL, POINTER :: averages
228 : TYPE(thermal_regions_type), OPTIONAL, POINTER :: thermal_regions
229 : LOGICAL, OPTIONAL :: ehrenfest_md
230 :
231 509882 : IF (PRESENT(itimes)) itimes => md_env%itimes
232 509882 : IF (PRESENT(fe_env)) fe_env => md_env%fe_env
233 509882 : IF (PRESENT(constant)) constant => md_env%constant
234 509882 : IF (PRESENT(used_time)) used_time => md_env%used_time
235 509882 : IF (PRESENT(t)) t => md_env%t
236 509882 : IF (PRESENT(cell)) cell => md_env%cell
237 509882 : IF (PRESENT(simpar)) simpar => md_env%simpar
238 509882 : IF (PRESENT(thermostats)) thermostats => md_env%thermostats
239 509882 : IF (PRESENT(barostat)) barostat => md_env%barostat
240 : IF (PRESENT(thermostat_part) .OR. PRESENT(thermostat_coeff) .OR. &
241 : PRESENT(thermostat_baro) .OR. PRESENT(thermostat_shell) .OR. &
242 509882 : PRESENT(thermostat_fast) .OR. PRESENT(thermostat_slow)) THEN
243 85592 : IF (ASSOCIATED(md_env%thermostats)) THEN
244 20652 : IF (PRESENT(thermostat_part)) THEN
245 20236 : thermostat_part => md_env%thermostats%thermostat_part
246 : END IF
247 20652 : IF (PRESENT(thermostat_coeff)) THEN
248 15226 : thermostat_coeff => md_env%thermostats%thermostat_coef
249 : END IF
250 20652 : IF (PRESENT(thermostat_shell)) THEN
251 20652 : thermostat_shell => md_env%thermostats%thermostat_shell
252 : END IF
253 20652 : IF (PRESENT(thermostat_fast)) THEN
254 0 : thermostat_fast => md_env%thermostats%thermostat_fast
255 : END IF
256 20652 : IF (PRESENT(thermostat_slow)) THEN
257 0 : thermostat_slow => md_env%thermostats%thermostat_slow
258 : END IF
259 20652 : IF (PRESENT(thermostat_baro)) THEN
260 5250 : thermostat_baro => md_env%thermostats%thermostat_baro
261 : END IF
262 : END IF
263 : END IF
264 509882 : IF (PRESENT(npt)) THEN
265 9870 : IF (ASSOCIATED(md_env%barostat)) THEN
266 4768 : npt => md_env%barostat%npt
267 : END IF
268 : END IF
269 509882 : IF (PRESENT(averages)) averages => md_env%averages
270 509882 : IF (PRESENT(force_env)) force_env => md_env%force_env
271 509882 : IF (PRESENT(para_env)) para_env => md_env%para_env
272 509882 : IF (PRESENT(reftraj)) reftraj => md_env%reftraj
273 509882 : IF (PRESENT(md_ener)) md_ener => md_env%md_ener
274 509882 : IF (PRESENT(init)) init = md_env%init
275 509882 : IF (PRESENT(first_time)) first_time = md_env%first_time
276 509882 : IF (PRESENT(ehrenfest_md)) ehrenfest_md = md_env%ehrenfest_md
277 509882 : IF (PRESENT(thermal_regions)) thermal_regions => md_env%thermal_regions
278 :
279 509882 : END SUBROUTINE get_md_env
280 :
281 : ! **************************************************************************************************
282 : !> \brief Set the integrator environment to the correct program.
283 : !> \param md_env the force environment to retain
284 : !> \param itimes ...
285 : !> \param constant ...
286 : !> \param cell ...
287 : !> \param simpar ...
288 : !> \param fe_env ...
289 : !> \param force_env ...
290 : !> \param para_env ...
291 : !> \param init ...
292 : !> \param first_time ...
293 : !> \param thermostats ...
294 : !> \param barostat ...
295 : !> \param reftraj ...
296 : !> \param md_ener ...
297 : !> \param averages ...
298 : !> \param thermal_regions ...
299 : !> \param ehrenfest_md ...
300 : ! **************************************************************************************************
301 50053 : SUBROUTINE set_md_env(md_env, itimes, constant, cell, simpar, fe_env, force_env, &
302 : para_env, init, first_time, thermostats, barostat, reftraj, md_ener, averages, &
303 : thermal_regions, ehrenfest_md)
304 :
305 : TYPE(md_environment_type), INTENT(INOUT) :: md_env
306 : INTEGER, OPTIONAL, POINTER :: itimes
307 : REAL(KIND=dp), OPTIONAL, POINTER :: constant
308 : TYPE(cell_type), OPTIONAL, POINTER :: cell
309 : TYPE(simpar_type), OPTIONAL, POINTER :: simpar
310 : TYPE(free_energy_type), OPTIONAL, POINTER :: fe_env
311 : TYPE(force_env_type), OPTIONAL, POINTER :: force_env
312 : TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env
313 : LOGICAL, OPTIONAL :: init, first_time
314 : TYPE(thermostats_type), OPTIONAL, POINTER :: thermostats
315 : TYPE(barostat_type), OPTIONAL, POINTER :: barostat
316 : TYPE(reftraj_type), OPTIONAL, POINTER :: reftraj
317 : TYPE(md_ener_type), OPTIONAL, POINTER :: md_ener
318 : TYPE(average_quantities_type), OPTIONAL, POINTER :: averages
319 : TYPE(thermal_regions_type), OPTIONAL, POINTER :: thermal_regions
320 : LOGICAL, OPTIONAL :: ehrenfest_md
321 :
322 50053 : IF (PRESENT(init)) md_env%init = init
323 50053 : IF (PRESENT(first_time)) md_env%first_time = first_time
324 50053 : IF (PRESENT(ehrenfest_md)) md_env%ehrenfest_md = ehrenfest_md
325 50053 : IF (PRESENT(cell)) md_env%cell => cell
326 50053 : IF (PRESENT(barostat)) THEN
327 1729 : IF (ASSOCIATED(md_env%barostat)) THEN
328 0 : IF (.NOT. ASSOCIATED(md_env%barostat, barostat)) THEN
329 0 : CALL release_barostat_type(md_env%barostat)
330 : END IF
331 : END IF
332 1729 : md_env%barostat => barostat
333 : END IF
334 50053 : IF (PRESENT(thermostats)) THEN
335 1729 : IF (ASSOCIATED(md_env%thermostats)) THEN
336 0 : IF (.NOT. ASSOCIATED(md_env%thermostats, thermostats)) THEN
337 0 : CALL release_thermostats(md_env%thermostats)
338 0 : DEALLOCATE (md_env%thermostats)
339 : END IF
340 : END IF
341 1729 : md_env%thermostats => thermostats
342 : END IF
343 50053 : IF (PRESENT(simpar)) md_env%simpar => simpar
344 50053 : IF (PRESENT(itimes)) md_env%itimes => itimes
345 50053 : IF (PRESENT(fe_env)) md_env%fe_env => fe_env
346 50053 : IF (PRESENT(constant)) md_env%constant => constant
347 50053 : IF (PRESENT(para_env)) md_env%para_env => para_env
348 50053 : IF (PRESENT(force_env)) THEN
349 1729 : IF (ASSOCIATED(force_env)) THEN
350 1729 : CALL force_env_retain(force_env)
351 : END IF
352 1729 : IF (ASSOCIATED(md_env%force_env)) THEN
353 0 : CALL force_env_release(md_env%force_env)
354 : END IF
355 1729 : md_env%force_env => force_env
356 : END IF
357 50053 : IF (PRESENT(reftraj)) THEN
358 32 : IF (ASSOCIATED(md_env%reftraj)) THEN
359 0 : IF (.NOT. ASSOCIATED(md_env%reftraj, reftraj)) THEN
360 0 : CALL release_reftraj(md_env%reftraj)
361 0 : DEALLOCATE (md_env%reftraj)
362 : END IF
363 : END IF
364 32 : md_env%reftraj => reftraj
365 : END IF
366 50053 : IF (PRESENT(md_ener)) THEN
367 1729 : IF (ASSOCIATED(md_env%md_ener)) THEN
368 0 : IF (.NOT. ASSOCIATED(md_env%md_ener, md_ener)) THEN
369 0 : CALL release_md_ener(md_env%md_ener)
370 0 : DEALLOCATE (md_env%md_ener)
371 : END IF
372 : END IF
373 1729 : md_env%md_ener => md_ener
374 : END IF
375 50053 : IF (PRESENT(averages)) THEN
376 20 : CALL release_averages(md_env%averages)
377 20 : CALL retain_averages(averages)
378 20 : md_env%averages => averages
379 : END IF
380 50053 : IF (PRESENT(thermal_regions)) THEN
381 1729 : IF (ASSOCIATED(md_env%thermal_regions)) THEN
382 0 : IF (.NOT. ASSOCIATED(md_env%thermal_regions, thermal_regions)) THEN
383 0 : CALL release_thermal_regions(md_env%thermal_regions)
384 0 : DEALLOCATE (md_env%thermal_regions)
385 : END IF
386 : END IF
387 1729 : md_env%thermal_regions => thermal_regions
388 : END IF
389 :
390 50053 : END SUBROUTINE set_md_env
391 :
392 : ! **************************************************************************************************
393 : !> \brief ...
394 : !> \param md_env ...
395 : !> \return ...
396 : !> \par History
397 : !> 02.2012 created [noamb]
398 : !> \author Noam Bernstein
399 : ! **************************************************************************************************
400 1773 : PURE FUNCTION need_per_atom_wiener_process(md_env)
401 : TYPE(md_environment_type), INTENT(IN) :: md_env
402 : LOGICAL :: need_per_atom_wiener_process
403 :
404 : ! return value
405 : ! check for Langevin ensemble
406 :
407 1773 : need_per_atom_wiener_process = (md_env%simpar%ensemble == langevin_ensemble)
408 1773 : IF (need_per_atom_wiener_process) RETURN
409 :
410 : ! check for adaptive-Langevin thermostat
411 1689 : IF (.NOT. ASSOCIATED(md_env%thermostats)) RETURN
412 526 : IF (.NOT. ASSOCIATED(md_env%thermostats%thermostat_part)) RETURN
413 510 : need_per_atom_wiener_process = (md_env%thermostats%thermostat_part%type_of_thermostat == do_thermo_al)
414 :
415 510 : END FUNCTION need_per_atom_wiener_process
416 :
417 0 : END MODULE md_environment_types
|