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