(git:0e87843)
Loading...
Searching...
No Matches
md_run.F
Go to the documentation of this file.
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 Perform a molecular dynamics (MD) run using QUICKSTEP
10!> \par History
11!> - Added support for Langevin regions (2014/02/05, LT)
12!> \author Matthias Krack (07.11.2002)
13! **************************************************************************************************
14MODULE md_run
17 USE barostat_types, ONLY: barostat_type,&
19 USE cell_types, ONLY: cell_type
27 cp_p_file,&
44 USE input_constants, ONLY: &
53 USE kinds, ONLY: default_string_length,&
54 dp
55 USE machine, ONLY: m_flush,&
57 USE md_ener_types, ONLY: create_md_ener,&
61 md_energy,&
69 USE md_util, ONLY: md_output,&
71 USE md_vel_utils, ONLY: angvel_control,&
76 USE mdctrl_types, ONLY: mdctrl_type
88 USE reftraj_types, ONLY: create_reftraj,&
104 USE virial_types, ONLY: virial_type
107#include "../base/base_uses.f90"
108
109 IMPLICIT NONE
110
111 PRIVATE
112
113 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'md_run'
114
115 PUBLIC :: qs_mol_dyn
116
117CONTAINS
118
119! **************************************************************************************************
120!> \brief Main driver module for Molecular Dynamics
121!> \param force_env ...
122!> \param globenv ...
123!> \param averages ...
124!> \param rm_restart_info ...
125!> \param hmc_e_initial ...
126!> \param hmc_e_final ...
127!> \param mdctrl ...
128! **************************************************************************************************
129 SUBROUTINE qs_mol_dyn(force_env, globenv, averages, rm_restart_info, hmc_e_initial, hmc_e_final, mdctrl)
130
131 TYPE(force_env_type), POINTER :: force_env
132 TYPE(global_environment_type), POINTER :: globenv
133 TYPE(average_quantities_type), OPTIONAL, POINTER :: averages
134 LOGICAL, INTENT(IN), OPTIONAL :: rm_restart_info
135 REAL(kind=dp), OPTIONAL :: hmc_e_initial, hmc_e_final
136 TYPE(mdctrl_type), OPTIONAL, POINTER :: mdctrl
137
138 LOGICAL :: my_rm_restart_info
139 TYPE(md_environment_type), POINTER :: md_env
140 TYPE(mp_para_env_type), POINTER :: para_env
141 TYPE(section_vals_type), POINTER :: md_section, motion_section
142
143 my_rm_restart_info = .true.
144 IF (PRESENT(rm_restart_info)) my_rm_restart_info = rm_restart_info
145 NULLIFY (md_env, para_env)
146
147 ! Tell ACE that this is a dynamic run: Bypass C will use full HFX
148 ! for the entire first MD step so wavefunction propagation delivers
149 ! a near-converged C_occ to step 1, making the ACE BUILD accurate.
150 CALL hfx_ace_set_dynamic_mode(.true.)
151
152 para_env => force_env%para_env
153 motion_section => section_vals_get_subs_vals(force_env%root_section, "MOTION")
154 md_section => section_vals_get_subs_vals(motion_section, "MD")
155
156 ! Real call to MD driver - Low Level
157 ALLOCATE (md_env)
158 CALL md_env_create(md_env, md_section, para_env, force_env=force_env)
159 CALL set_md_env(md_env, averages=averages)
160 IF (PRESENT(hmc_e_initial) .AND. PRESENT(hmc_e_final)) THEN
161 CALL qs_mol_dyn_low(md_env, md_section, motion_section, force_env, globenv, &
162 hmc_e_initial=hmc_e_initial, hmc_e_final=hmc_e_final)
163 ELSE
164 CALL qs_mol_dyn_low(md_env, md_section, motion_section, force_env, globenv, mdctrl=mdctrl)
165 END IF
166 CALL md_env_release(md_env)
167 DEALLOCATE (md_env)
168
169 ! Clean restartable sections..
170 IF (my_rm_restart_info) CALL remove_restart_info(force_env%root_section)
171 END SUBROUTINE qs_mol_dyn
172
173! **************************************************************************************************
174!> \brief Purpose: Driver routine for MD run using QUICKSTEP.
175!> \param md_env ...
176!> \param md_section ...
177!> \param motion_section ...
178!> \param force_env ...
179!> \param globenv ...
180!> \param hmc_e_initial ...
181!> \param hmc_e_final ...
182!> \param mdctrl ...
183!> \par History
184!> - Cleaning (09.2007) Teodoro Laino [tlaino] - University of Zurich
185!> - Added lines to print out langevin regions (2014/02/04, LT)
186!> \author Creation (07.11.2002,MK)
187! **************************************************************************************************
188 SUBROUTINE qs_mol_dyn_low(md_env, md_section, motion_section, force_env, globenv, hmc_e_initial, hmc_e_final, mdctrl)
189
190 TYPE(md_environment_type), POINTER :: md_env
191 TYPE(section_vals_type), POINTER :: md_section, motion_section
192 TYPE(force_env_type), POINTER :: force_env
193 TYPE(global_environment_type), POINTER :: globenv
194 REAL(kind=dp), OPTIONAL :: hmc_e_initial, hmc_e_final
195 TYPE(mdctrl_type), OPTIONAL, POINTER :: mdctrl
196
197 CHARACTER(LEN=*), PARAMETER :: routinen = 'qs_mol_dyn_low'
198
199 CHARACTER(LEN=80) :: md_step_line
200 CHARACTER(LEN=default_string_length) :: my_act, my_pos
201 INTEGER :: handle, i, istep, md_stride, &
202 output_unit, run_type_id
203 INTEGER, POINTER :: itimes
204 LOGICAL :: check, ehrenfest_md, save_mem, &
205 should_stop, write_binary_restart_file
206 REAL(kind=dp) :: dummy, time_iter_start, time_iter_stop
207 REAL(kind=dp), POINTER :: constant, time, used_time
208 TYPE(atomic_kind_list_type), POINTER :: atomic_kinds
209 TYPE(barostat_type), POINTER :: barostat
210 TYPE(cell_type), POINTER :: cell
211 TYPE(cp_logger_type), POINTER :: logger
212 TYPE(cp_subsys_type), POINTER :: subsys, subsys_i
213 TYPE(distribution_1d_type), POINTER :: local_particles
214 TYPE(free_energy_type), POINTER :: fe_env
215 TYPE(md_ener_type), POINTER :: md_ener
216 TYPE(mp_para_env_type), POINTER :: para_env
217 TYPE(particle_list_type), POINTER :: particles
218 TYPE(reftraj_type), POINTER :: reftraj
219 TYPE(section_vals_type), POINTER :: constraint_section, force_env_section, &
220 free_energy_section, global_section, reftraj_section, subsys_section, work_section
221 TYPE(simpar_type), POINTER :: simpar
222 TYPE(thermal_regions_type), POINTER :: thermal_regions
223 TYPE(thermostats_type), POINTER :: thermostats
224 TYPE(virial_type), POINTER :: virial
225
226 CALL timeset(routinen, handle)
227 cpassert(ASSOCIATED(globenv))
228 cpassert(ASSOCIATED(force_env))
229
230 NULLIFY (particles, cell, simpar, itimes, used_time, subsys, &
231 md_ener, thermostats, barostat, reftraj, force_env_section, &
232 reftraj_section, work_section, atomic_kinds, &
233 local_particles, time, fe_env, free_energy_section, &
234 constraint_section, thermal_regions, virial, subsys_i)
235 logger => cp_get_default_logger()
236 para_env => force_env%para_env
237 output_unit = cp_logger_get_default_io_unit(logger)
238
239 global_section => section_vals_get_subs_vals(force_env%root_section, "GLOBAL")
240 free_energy_section => section_vals_get_subs_vals(motion_section, "FREE_ENERGY")
241 constraint_section => section_vals_get_subs_vals(motion_section, "CONSTRAINT")
242 CALL section_vals_val_get(global_section, "SAVE_MEM", l_val=save_mem)
243
244 CALL section_vals_val_get(global_section, "RUN_TYPE", i_val=run_type_id)
245 IF (run_type_id == ehrenfest) CALL set_md_env(md_env, ehrenfest_md=.true.)
246
247 CALL create_simpar_type(simpar)
248 force_env_section => force_env%force_env_section
249 subsys_section => section_vals_get_subs_vals(force_env_section, "SUBSYS")
250 CALL cp_add_iter_level(logger%iter_info, "MD")
251 CALL cp_iterate(logger%iter_info, iter_nr=0)
252 ! Read MD section
253 CALL read_md_section(simpar, motion_section, md_section)
254 ! Setup print_keys
255 simpar%info_constraint = cp_print_key_unit_nr(logger, constraint_section, &
256 "CONSTRAINT_INFO", extension=".shakeLog", log_filename=.false.)
257 simpar%lagrange_multipliers = cp_print_key_unit_nr(logger, constraint_section, &
258 "LAGRANGE_MULTIPLIERS", extension=".LagrangeMultLog", log_filename=.false.)
259 simpar%dump_lm = btest(cp_print_key_should_output(logger%iter_info, constraint_section, &
260 "LAGRANGE_MULTIPLIERS"), cp_p_file)
261
262 ! Create the structure for the md energies
263 ALLOCATE (md_ener)
264 CALL create_md_ener(md_ener)
265 CALL set_md_env(md_env, md_ener=md_ener)
266 NULLIFY (md_ener)
267
268 ! If requested setup Thermostats
269 CALL create_thermostats(thermostats, md_section, force_env, simpar, para_env, &
270 globenv, global_section)
271
272 ! If requested setup Barostat
273 CALL create_barostat_type(barostat, md_section, force_env, simpar, globenv)
274
275 ! If requested setup different thermal regions
276 CALL create_thermal_regions(thermal_regions, md_section, simpar, force_env)
277
278 ! If doing langevin_ensemble, then print out langevin_regions information upon request
279 IF (simpar%ensemble == langevin_ensemble) THEN
280 my_pos = "REWIND"
281 my_act = "WRITE"
282 CALL print_thermal_regions_langevin(thermal_regions, simpar, &
283 pos=my_pos, act=my_act)
284 END IF
285
286 CALL set_md_env(md_env, thermostats=thermostats, barostat=barostat, thermal_regions=thermal_regions)
287
288 CALL get_md_env(md_env, ehrenfest_md=ehrenfest_md)
289
290 !If requested set up the REFTRAJ run
291 IF (simpar%ensemble == reftraj_ensemble .AND. ehrenfest_md) THEN
292 cpabort("Ehrenfest MD does not support reftraj ensemble ")
293 END IF
294 IF (simpar%ensemble == reftraj_ensemble) THEN
295 reftraj_section => section_vals_get_subs_vals(md_section, "REFTRAJ")
296 ALLOCATE (reftraj)
297 CALL create_reftraj(reftraj, reftraj_section, para_env)
298 CALL set_md_env(md_env, reftraj=reftraj)
299 END IF
300
301 CALL force_env_get(force_env, subsys=subsys, cell=cell, &
302 force_env_section=force_env_section)
303 CALL cp_subsys_get(subsys, virial=virial)
304
305 ! Set V0 if needed
306 IF (simpar%ensemble == nph_uniaxial_ensemble .OR. simpar%ensemble == nph_uniaxial_damped_ensemble) THEN
307 IF (simpar%v0 == 0._dp) simpar%v0 = cell%deth
308 END IF
309
310 ! Initialize velocities possibly applying constraints at the zeroth MD step
311 CALL section_vals_val_get(motion_section, "PRINT%RESTART%SPLIT_RESTART_FILE", &
312 l_val=write_binary_restart_file)
313 CALL setup_velocities(force_env, simpar, globenv, md_env, md_section, constraint_section, &
314 write_binary_restart_file)
315
316 ! Setup Free Energy Calculation (if required)
317 CALL fe_env_create(fe_env, free_energy_section)
318
319 CALL set_md_env(md_env=md_env, simpar=simpar, fe_env=fe_env, cell=cell, &
320 force_env=force_env)
321 IF (simpar%constraint) CALL initialize_moving_colvars(force_env, motion_section, simpar)
322
323 ! Possibly initialize Wiener processes
324 ![NB] Tested again within create_wiener_process. Why??
326
327 time_iter_start = m_walltime()
328
329 CALL get_md_env(md_env, force_env=force_env, itimes=itimes, constant=constant, &
330 md_ener=md_ener, t=time, used_time=used_time)
331
332 ! Attach the time counter of the meta_env to the one of the MD
333 CALL set_meta_env(force_env%meta_env, time=time)
334
335 ! Initialize the md_ener structure
336 CALL initialize_md_ener(md_ener, force_env, simpar)
337
338 ! Check for ensembles requiring the stress tensor - takes into account the possibility for
339 ! multiple force_evals
340 IF ((simpar%ensemble == npt_i_ensemble) .OR. &
341 (simpar%ensemble == npt_ia_ensemble) .OR. &
342 (simpar%ensemble == npt_f_ensemble) .OR. &
343 (simpar%ensemble == npe_f_ensemble) .OR. &
344 (simpar%ensemble == npe_i_ensemble) .OR. &
345 (simpar%ensemble == nph_uniaxial_ensemble) .OR. &
346 (simpar%ensemble == nph_uniaxial_damped_ensemble)) THEN
347 check = virial%pv_availability
348 IF (.NOT. check) THEN
349 CALL cp_abort(__location__, &
350 "Virial evaluation not requested for this run in the input file!"// &
351 " You may consider to switch on the virial evaluation with the keyword: STRESS_TENSOR."// &
352 " Be sure the method you are using can compute the virial!")
353 END IF
354 IF (ASSOCIATED(force_env%sub_force_env)) THEN
355 DO i = 1, SIZE(force_env%sub_force_env)
356 IF (ASSOCIATED(force_env%sub_force_env(i)%force_env)) THEN
357 CALL force_env_get(force_env%sub_force_env(i)%force_env, subsys=subsys_i)
358 CALL cp_subsys_get(subsys_i, virial=virial)
359 check = check .AND. virial%pv_availability
360 END IF
361 END DO
362 END IF
363 IF (.NOT. check) THEN
364 CALL cp_abort(__location__, &
365 "Virial evaluation not requested for all the force_eval sections present in"// &
366 " the input file! You have to switch on the virial evaluation with the keyword: STRESS_TENSOR"// &
367 " in each force_eval section. Be sure the method you are using can compute the virial!")
368 END IF
369 END IF
370
371 ! Computing Forces at zero MD step
372 IF (simpar%ensemble /= reftraj_ensemble) THEN
373 CALL section_vals_val_get(md_section, "STEP_START_VAL", i_val=itimes)
374 CALL section_vals_val_get(md_section, "TIME_START_VAL", r_val=time)
375 CALL section_vals_val_get(md_section, "ECONS_START_VAL", r_val=constant)
376 CALL cp_iterate(logger%iter_info, iter_nr=itimes)
377 IF (save_mem) THEN
378 work_section => section_vals_get_subs_vals(subsys_section, "VELOCITY")
379 CALL section_vals_remove_values(work_section)
380 work_section => section_vals_get_subs_vals(subsys_section, "SHELL_VELOCITY")
381 CALL section_vals_remove_values(work_section)
382 work_section => section_vals_get_subs_vals(subsys_section, "CORE_VELOCITY")
383 CALL section_vals_remove_values(work_section)
384 END IF
385
386 IF (ehrenfest_md) THEN
387 CALL rt_prop_setup(force_env)
388 force_env%qs_env%rtp%dt = simpar%dt
389 ELSE
390 ![NB] Lets let all methods, even ones without consistent energies, succeed here.
391 ! They'll fail in actual integrator if needed
392 ! consistent_energies=.FALSE. by default
393 CALL force_env_calc_energy_force(force_env, calc_force=.true.)
394 END IF
395
396 IF (ASSOCIATED(force_env%qs_env)) THEN
397 CALL qs_env_time_update(force_env%qs_env, time, itimes)
398 END IF
399 ! Warm-up engines for metadynamics
400 IF (ASSOCIATED(force_env%meta_env)) THEN
401 ! Setup stuff for plumed if needed
402 IF (force_env%meta_env%use_plumed .EQV. .true.) THEN
403 CALL metadyn_initialise_plumed(force_env, simpar, itimes)
404 ! Include the bias in the first half kick and initial energy/pressure.
405 ! This also initializes PLUMED's first-step bookkeeping on restart.
406 CALL metadyn_integrator(force_env, itimes)
407 ELSE
408 IF (force_env%meta_env%langevin) THEN
409 CALL create_wiener_process_cv(force_env%meta_env)
410 END IF
411 IF (force_env%meta_env%well_tempered) THEN
412 force_env%meta_env%wttemperature = simpar%temp_ext
413 IF (force_env%meta_env%wtgamma > epsilon(1._dp)) THEN
414 dummy = force_env%meta_env%wttemperature*(force_env%meta_env%wtgamma - 1._dp)
415 IF (force_env%meta_env%delta_t > epsilon(1._dp)) THEN
416 check = abs(force_env%meta_env%delta_t - dummy) < 1.e+3_dp*epsilon(1._dp)
417 IF (.NOT. check) THEN
418 CALL cp_abort(__location__, &
419 "Inconsistency between DELTA_T and WTGAMMA (both specified):"// &
420 " please, verify that DELTA_T=(WTGAMMA-1)*TEMPERATURE")
421 END IF
422 ELSE
423 force_env%meta_env%delta_t = dummy
424 END IF
425 ELSE
426 force_env%meta_env%wtgamma = 1._dp &
427 + force_env%meta_env%delta_t/force_env%meta_env%wttemperature
428 END IF
429 force_env%meta_env%invdt = 1._dp/force_env%meta_env%delta_t
430 END IF
431 CALL metadyn_forces(force_env)
432 CALL metadyn_write_colvar(force_env)
433 END IF
434 END IF
435
436 IF (simpar%do_respa) THEN
437 CALL force_env_calc_energy_force(force_env%sub_force_env(1)%force_env, &
438 calc_force=.true.)
439 END IF
440
441 CALL force_env_get(force_env, subsys=subsys)
442
443 CALL cp_subsys_get(subsys, atomic_kinds=atomic_kinds, local_particles=local_particles, &
444 particles=particles, virial=virial)
445
446 CALL virial_evaluate(atomic_kinds%els, particles%els, local_particles, &
447 virial, force_env%para_env)
448
449 CALL md_energy(md_env, md_ener)
450 CALL md_write_output(md_env) !inits the print env at itimes == 0 also writes trajectories
451 md_stride = 1
452 ELSE
453 CALL get_md_env(md_env, reftraj=reftraj)
454 CALL initialize_reftraj(reftraj, reftraj_section, md_env)
455 itimes = reftraj%info%first_snapshot - 1
456 md_stride = reftraj%info%stride
457 IF (ASSOCIATED(force_env%meta_env)) THEN
458 IF (force_env%meta_env%use_plumed .EQV. .true.) THEN
459 CALL metadyn_initialise_plumed(force_env, simpar, itimes)
460 END IF
461 END IF
462 END IF
463
464 CALL cp_print_key_finished_output(simpar%info_constraint, logger, &
465 constraint_section, "CONSTRAINT_INFO")
466 CALL cp_print_key_finished_output(simpar%lagrange_multipliers, logger, &
467 constraint_section, "LAGRANGE_MULTIPLIERS")
468
469! if we need the initial kinetic energy for Hybrid Monte Carlo
470 IF (PRESENT(hmc_e_initial)) hmc_e_initial = md_ener%ekin
471
472 IF (itimes >= simpar%max_steps) CALL cp_abort(__location__, &
473 "maximum step number smaller than initial step value")
474
475 ! Real MD Loop
476 DO istep = 1, simpar%nsteps, md_stride
477 ! Increase counters
478 itimes = itimes + 1
479 time = time + simpar%dt
480 !needed when electric field fields are applied
481 IF (ASSOCIATED(force_env%qs_env)) THEN
482 CALL qs_env_time_update(force_env%qs_env, time, itimes)
483 END IF
484 IF (ehrenfest_md) force_env%qs_env%rtp%istep = istep
485
486 IF (.NOT. logger%iter_info%last_iter(logger%iter_info%n_rlevel)) THEN
487 CALL cp_iterate(logger%iter_info, last=(istep == simpar%nsteps), iter_nr=itimes)
488 ELSE
489 CALL cp_iterate(logger%iter_info, last=.true., iter_nr=itimes)
490 END IF
491
492 IF (output_unit > 0 .AND. &
493 btest(cp_print_key_should_output(logger%iter_info, md_section, &
494 "PRINT%PROGRAM_RUN_INFO"), cp_p_file)) THEN
495 WRITE (md_step_line, fmt="(A,I12,A,I0)") "MD STEP: ", istep, " / ", simpar%nsteps
496
497 WRITE (unit=output_unit, fmt="(/,T2,A)") repeat("-", len_trim(md_step_line))
498 WRITE (unit=output_unit, fmt="(T2,A)") trim(md_step_line)
499 WRITE (unit=output_unit, fmt="(T2,A)") repeat("-", len_trim(md_step_line))
500 CALL m_flush(output_unit)
501 END IF
502
503 ! Open possible Shake output units
504 simpar%info_constraint = cp_print_key_unit_nr(logger, constraint_section, "CONSTRAINT_INFO", &
505 extension=".shakeLog", log_filename=.false.)
506 simpar%lagrange_multipliers = cp_print_key_unit_nr( &
507 logger, constraint_section, &
508 "LAGRANGE_MULTIPLIERS", extension=".LagrangeMultLog", log_filename=.false.)
509 simpar%dump_lm = btest(cp_print_key_should_output(logger%iter_info, constraint_section, &
510 "LAGRANGE_MULTIPLIERS"), cp_p_file)
511
512 ! Update temperature for thermal regions and thermostat regions
513 CALL update_expected_temperature(md_env)
514
515 ! Velocity Verlet Integrator
516 CALL velocity_verlet(md_env, globenv)
517
518 ! Close Shake output if requested...
519 CALL cp_print_key_finished_output(simpar%info_constraint, logger, &
520 constraint_section, "CONSTRAINT_INFO")
521 CALL cp_print_key_finished_output(simpar%lagrange_multipliers, logger, &
522 constraint_section, "LAGRANGE_MULTIPLIERS")
523
524 ! Free Energy calculation
525 CALL free_energy_evaluate(md_env, should_stop, free_energy_section)
526
527 IF (should_stop) EXIT
528
529 ! Test for <PROJECT_NAME>.EXIT_MD or for WALL_TIME to exit
530 ! Default:
531 ! IF so we don't overwrite the restart or append to the trajectory
532 ! because the execution could in principle stop inside the SCF where energy
533 ! and forces are not converged.
534 ! But:
535 ! You can force to print the last step (for example if the method used
536 ! to compute energy and forces is not SCF based) activating the print_key
537 ! MOTION%MD%PRINT%FORCE_LAST.
538 CALL external_control(should_stop, "MD", globenv=globenv)
539
540 !check if upper bound of total steps has been reached
541 IF (.NOT. (istep == simpar%nsteps) .AND. logger%iter_info%last_iter(logger%iter_info%n_rlevel)) should_stop = .true.
542 IF (itimes >= simpar%max_steps) should_stop = .true.
543
544 ! call external hook e.g. from global optimization
545 IF (PRESENT(mdctrl)) THEN
546 CALL mdctrl_callback(mdctrl, md_env, should_stop)
547 END IF
548
549 IF (should_stop) THEN
550 CALL cp_iterate(logger%iter_info, last=.true., iter_nr=itimes)
551 !In Ehrenfest molecular dynamics the external control is only checked after a converged propagation
552 !The restart needs to be written in order to be consistent with the mos/density matrix for the restart
553 IF (run_type_id == ehrenfest) THEN
554 CALL md_output(md_env, md_section, force_env%root_section, .false.)
555 ELSE
556 CALL md_output(md_env, md_section, force_env%root_section, should_stop)
557 END IF
558 EXIT
559 END IF
560
561 IF (simpar%ensemble /= reftraj_ensemble) THEN
562 CALL md_energy(md_env, md_ener)
563 CALL temperature_control(simpar, md_env, md_ener, force_env, logger)
564 CALL comvel_control(md_ener, force_env, md_section, logger)
565 CALL angvel_control(md_ener, force_env, md_section, logger)
566 ELSE
567 CALL md_ener_reftraj(md_env, md_ener)
568 END IF
569
570 time_iter_stop = m_walltime()
571 used_time = time_iter_stop - time_iter_start
572 time_iter_start = time_iter_stop
573
574 CALL md_output(md_env, md_section, force_env%root_section, should_stop)
575 IF (simpar%ensemble == reftraj_ensemble) THEN
576 CALL write_output_reftraj(md_env)
577 END IF
578 END DO
579
580! if we need the final kinetic energy for Hybrid Monte Carlo
581 IF (PRESENT(hmc_e_final)) hmc_e_final = md_ener%ekin
582
583 ! Remove the iteration level
584 CALL cp_rm_iter_level(logger%iter_info, "MD")
585
586 ! Clean up PLUMED
587 IF (ASSOCIATED(force_env%meta_env)) THEN
588 IF (force_env%meta_env%use_plumed .EQV. .true.) THEN
590 END IF
591 END IF
592
593 ! Deallocate Thermostats and Barostats
594 CALL release_simpar_type(simpar)
595 CALL timestop(handle)
596
597 END SUBROUTINE qs_mol_dyn_low
598
599! **************************************************************************************************
600!> \brief Project initial or restarted velocities onto the upcoming target rate.
601!> \param force_env ...
602!> \param motion_section ...
603!> \param simpar ...
604! **************************************************************************************************
605 SUBROUTINE initialize_moving_colvars(force_env, motion_section, simpar)
606 TYPE(force_env_type), POINTER :: force_env
607 TYPE(section_vals_type), POINTER :: motion_section
608 TYPE(simpar_type), POINTER :: simpar
609
610 INTEGER :: i
611 LOGICAL :: moving
612 REAL(kind=dp) :: dt
613 TYPE(cp_subsys_type), POINTER :: subsys
614 TYPE(global_constraint_type), POINTER :: gci
615 TYPE(molecule_kind_type), POINTER :: kinds(:)
616
617 CALL force_env_get(force_env, subsys=subsys)
618 CALL cp_subsys_get(subsys, molecule_kind_set=kinds, gci=gci)
619 dt = simpar%dt
620 IF (simpar%do_respa) dt = dt/simpar%n_time_steps
621 moving = .false.
622 DO i = 1, SIZE(kinds)
623 IF (.NOT. ASSOCIATED(kinds(i)%colv_list)) cycle
624 CALL shake_update_colv_low(kinds(i)%colv_list, dt, motion_section, initialize=.true.)
625 moving = moving .OR. any(kinds(i)%colv_list%expected_value_growth_speed /= 0.0_dp)
626 END DO
627 IF (ASSOCIATED(gci%colv_list)) THEN
628 CALL shake_update_colv_low(gci%colv_list, dt, motion_section, initialize=.true.)
629 moving = moving .OR. any(gci%colv_list%expected_value_growth_speed /= 0.0_dp)
630 END IF
631 gci%joint_colvar_checks = moving
632 IF (moving) CALL force_env_rattle(force_env, dt=dt, shake_tol=simpar%shake_tol, reset=.true.)
633 END SUBROUTINE initialize_moving_colvars
634
635END MODULE md_run
represent a simple array based list of the given type
Handles the type to compute averages during an MD.
Barostat structure: module containing barostat available for MD.
subroutine, public create_barostat_type(barostat, md_section, force_env, simpar, globenv)
...
Handles all functions related to the CELL.
Definition cell_types.F:15
Module that handles the COLLECTIVE constraints.
subroutine, public shake_update_colv_low(colv_list, dt, motion_section, initialize)
Cache the actual target rate, including a partially clamped interval.
Routines to handle the external control of CP2K.
subroutine, public external_control(should_stop, flag, globenv, target_time, start_time, force_check)
External manipulations during a run : when the <PROJECT_NAME>.EXIT_$runtype command is sent the progr...
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer, parameter, public cp_p_file
subroutine, public cp_iterate(iteration_info, last, iter_nr, increment, iter_nr_out)
adds one to the actual iteration
subroutine, public cp_rm_iter_level(iteration_info, level_name, n_rlevel_att)
Removes an iteration level.
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
subroutine, public cp_add_iter_level(iteration_info, level_name, n_rlevel_new)
Adds an iteration level.
types that represent a subsys, i.e. a part of the system
subroutine, public cp_subsys_get(subsys, ref_count, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell, cell_ref, use_ref_cell)
returns information about various attributes of the given subsys
stores a lists of integer that are local to a processor. The idea is that these integers represent ob...
Interface for the force calculations.
recursive subroutine, public force_env_calc_energy_force(force_env, calc_force, consistent_energies, skip_external_control, eval_energy_forces, require_consistent_energy_force, linres, calc_stress_tensor)
Interface routine for force and energy calculations.
Interface for the force calculations.
recursive subroutine, public force_env_get(force_env, in_use, fist_env, qs_env, meta_env, fp_env, subsys, para_env, potential_energy, additional_potential, kinetic_energy, harmonic_shell, kinetic_shell, cell, sub_force_env, qmmm_env, qmmmx_env, eip_env, pwdft_env, globenv, input, force_env_section, method_name_id, root_section, mixed_env, nnp_env, embed_env, ipi_env)
returns various attributes about the force environment
Util force_env module.
subroutine, public force_env_rattle(force_env, dt, shake_tol, log_unit, lagrange_mult, dump_lm, vel, reset)
perform rattle (enforcing of constraints on velocities) This routine can be easily adapted to perform...
Methods to perform free energy and free energy derivatives calculations.
subroutine, public free_energy_evaluate(md_env, converged, fe_section)
Main driver for free energy calculations In this routine we handle specifically biased MD.
defines types for metadynamics calculation
subroutine, public fe_env_create(fe_env, fe_section)
creates the fe_env
Define type storing the global information of a run. Keep the amount of stored data small....
Adaptively Compressed Exchange (ACE) operator for HFX. Reference: Lin, J. Chem. Theory Comput....
subroutine, public hfx_ace_set_dynamic_mode(is_dynamic)
Mark this run as dynamic (GEO_OPT/MD) so Bypass C fires for geo step 0. Call this once from the geo_o...
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public ehrenfest
integer, parameter, public nph_uniaxial_ensemble
integer, parameter, public npt_i_ensemble
integer, parameter, public nph_uniaxial_damped_ensemble
integer, parameter, public npe_f_ensemble
integer, parameter, public langevin_ensemble
integer, parameter, public npe_i_ensemble
integer, parameter, public npt_ia_ensemble
integer, parameter, public npt_f_ensemble
integer, parameter, public reftraj_ensemble
checks the input and perform some automatic "magic" on it
subroutine, public remove_restart_info(input_file)
Removes section used to restart a calculation from an input file in memory.
objects that represent the structure of input sections and the data contained in an input section
subroutine, public section_vals_remove_values(section_vals)
removes the values of a repetition of the section
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
Machine interface based on Fortran 2003 and POSIX.
Definition machine.F:17
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
Definition machine.F:126
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Definition machine.F:143
Split md_ener module from md_environment_type.
subroutine, public create_md_ener(md_ener)
retains the given md_ener structure
prints all energy info per timestep to the screen or to user defined output files
Definition md_energies.F:16
subroutine, public md_ener_reftraj(md_env, md_ener)
...
subroutine, public initialize_md_ener(md_ener, force_env, simpar)
...
subroutine, public md_energy(md_env, md_ener)
...
subroutine, public md_write_output(md_env)
This routine computes the conserved quantity, temperature and things like that and prints them out.
subroutine, public set_md_env(md_env, itimes, constant, cell, simpar, fe_env, force_env, para_env, init, first_time, thermostats, barostat, reftraj, md_ener, averages, thermal_regions, ehrenfest_md)
Set the integrator environment to the correct program.
subroutine, public md_env_create(md_env, md_section, para_env, force_env)
Creates MD environment Purpose: Initialise the integrator environment. retain the para_env for this e...
subroutine, public md_env_release(md_env)
releases the given md env
pure logical function, public need_per_atom_wiener_process(md_env)
...
subroutine, public get_md_env(md_env, itimes, constant, used_time, cell, simpar, npt, force_env, para_env, reftraj, t, init, first_time, fe_env, thermostats, barostat, thermostat_coeff, thermostat_part, thermostat_shell, thermostat_baro, thermostat_fast, thermostat_slow, md_ener, averages, thermal_regions, ehrenfest_md)
get components of MD environment type
Perform a molecular dynamics (MD) run using QUICKSTEP.
Definition md_run.F:14
subroutine, public qs_mol_dyn(force_env, globenv, averages, rm_restart_info, hmc_e_initial, hmc_e_final, mdctrl)
Main driver module for Molecular Dynamics.
Definition md_run.F:130
Utilities for Molecular Dynamics.
Definition md_util.F:12
subroutine, public md_output(md_env, md_section, root_section, forced_io)
collects the part of the MD that, basically, does the output
Definition md_util.F:125
subroutine, public update_expected_temperature(md_env)
update_expected_temperature
Definition md_util.F:71
Collection of utilities for setting-up and handle velocities in MD runs.
subroutine, public setup_velocities(force_env, simpar, globenv, md_env, md_section, constraint_section, write_binary_restart_file)
Initialize Velocities for MD runs.
subroutine, public angvel_control(md_ener, force_env, md_section, logger)
Set to 0 the angular velocity along MD runs, if required.
subroutine, public temperature_control(simpar, md_env, md_ener, force_env, logger)
Perform all temperature manipulations during a QS MD run.
subroutine, public comvel_control(md_ener, force_env, md_section, logger)
Set to 0 the velocity of the COM along MD runs, if required.
A common interface (wrapper) for a callback into the md_run loop. Currently this is only used by the ...
subroutine, public mdctrl_callback(mdctrl, md_env, should_stop)
This is called by md_run for each step during during its main-loop.
A common interface for passing a callback into the md_run loop.
Interface to the message passing library MPI.
defines types for metadynamics calculation
subroutine, public set_meta_env(meta_env, time)
sets the meta_env
Performs the metadynamics calculation.
subroutine, public metadyn_finalise_plumed()
makes sure PLUMED is shut down cleanly
subroutine, public metadyn_initialise_plumed(force_env, simpar, itimes)
...
subroutine, public metadyn_forces(force_env, vel)
add forces to the subsys due to the metadynamics run possibly modifies the velocites (if reflective w...
subroutine, public metadyn_integrator(force_env, itimes, vel, rand)
General driver for applying metadynamics.
subroutine, public metadyn_write_colvar(force_env)
Write down COLVAR information evolved according to Vanden-Eijnden Ciccotti C.Phys....
Define the molecule kind structure types and the corresponding functionality.
Define the data structure for the molecule information.
represent a simple array based list of the given type
qs_environment methods that use many other modules
subroutine, public qs_env_time_update(qs_env, time, itimes)
...
initialization of the reftraj structure used to analyse previously generated trajectories
subroutine, public create_reftraj(reftraj, reftraj_section, para_env)
...
Initialize the analysis of trajectories to be done by activating the REFTRAJ ensemble.
subroutine, public write_output_reftraj(md_env)
...
subroutine, public initialize_reftraj(reftraj, reftraj_section, md_env)
...
Routines for the real time propagation.
subroutine, public rt_prop_setup(force_env)
creates rtp_type, gets the initial state, either by reading MO's from file or calling SCF run
Methods for storing MD parameters type.
subroutine, public read_md_section(simpar, motion_section, md_section)
Reads the MD section and setup the simulation parameters type.
Type for storing MD parameters.
subroutine, public release_simpar_type(simpar)
Releases the simulation parameters type.
subroutine, public create_simpar_type(simpar)
Creates the simulation parameters type.
Thermal regions type: to initialize and control the temperature of different regions.
Setup of regions with different temperature.
subroutine, public print_thermal_regions_langevin(thermal_regions, simpar, pos, act)
print out information regarding to langevin regions defined in thermal_regions section
subroutine, public create_thermal_regions(thermal_regions, md_section, simpar, force_env)
create thermal_regions
Methods for Thermostats.
subroutine, public create_thermostats(thermostats, md_section, force_env, simpar, para_env, globenv, global_section)
...
Thermostat structure: module containing thermostat available for MD.
Provides an interface to the velocity-verlet based integrator routines for all ensembles.
subroutine, public velocity_verlet(md_env, globenv)
...
subroutine, public virial_evaluate(atomic_kind_set, particle_set, local_particles, virial, igroup)
Computes the kinetic part of the pressure tensor and updates the full VIRIAL (PV).
Handling of the Wiener process currently employed in turn of the Langevin dynamics.
subroutine, public create_wiener_process(md_env)
Create a Wiener process for Langevin dynamics and initialize an independent random number generator f...
subroutine, public create_wiener_process_cv(meta_env)
Create a Wiener process for Langevin dynamics used for metadynamics and initialize an independent ran...
subroutine check(condition, label)
Stops with an error message if a test fails.
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
type of a logger, at the moment it contains just a print level starting at which level it should be l...
represents a system: atoms, molecules, their pos,vel,...
structure to store local (to a processor) ordered lists of integers.
wrapper to abstract the force evaluation of the various methods
contains the initially parsed file and the initial parallel environment
stores all the informations relevant to an mpi environment
Simulation parameter type for molecular dynamics.