(git:f824184)
Loading...
Searching...
No Matches
cp2k_runs.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! **************************************************************************************************
10 USE atom, ONLY: atom_code
11 USE bibliography, ONLY: iannuzzi2026,&
12 cite_reference,&
14 USE bsse, ONLY: do_bsse_calculation
15 USE cell_opt, ONLY: cp_cell_opt
17 USE cp2k_info, ONLY: compile_date,&
22 USE cp_dbcsr_api, ONLY: dbcsr_finalize_lib,&
23 dbcsr_print_config,&
24 dbcsr_print_statistics
26 USE cp_files, ONLY: close_file,&
41 USE cp_units, ONLY: cp_unit_set_create,&
46 USE dbt_api, ONLY: dbt_library_print_stats
47 USE environment, ONLY: cp2k_finalize,&
48 cp2k_init,&
49 cp2k_read,&
54 f77_default_para_env => default_para_env,&
58 USE farming_methods, ONLY: do_deadlock,&
60 do_wait,&
71 USE geo_opt, ONLY: cp_geo_opt
77 USE input_constants, ONLY: &
90 USE input_section_types, ONLY: &
94 USE ipi_driver, ONLY: run_driver
95 USE kinds, ONLY: default_path_length,&
97 dp,&
98 int_8
99 USE library_tests, ONLY: lib_test
100 USE machine, ONLY: default_output_unit,&
101 m_chdir,&
102 m_flush,&
103 m_getcwd,&
104 m_memory,&
107 USE mc_run, ONLY: do_mon_car
108 USE md_run, ONLY: qs_mol_dyn
109 USE message_passing, ONLY: mp_any_source,&
113 USE mimic_loop, ONLY: do_mimic_loop
114 USE mscfg_methods, ONLY: do_mol_loop,&
117 USE neb_methods, ONLY: neb
118 USE negf_methods, ONLY: do_negf
122 USE pint_methods, ONLY: do_pint_run
126 USE rt_bse, ONLY: run_propagation_bse
129 USE swarm, ONLY: run_swarm
130 USE tamc_run, ONLY: qs_tamc
131 USE tmc_setup, ONLY: do_analyze_files,&
132 do_tmc
134#include "../base/base_uses.f90"
135
136 IMPLICIT NONE
137
138 PRIVATE
139
140 PUBLIC :: write_xml_file, run_input
141
142 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'cp2k_runs'
143
144CONTAINS
145
146! **************************************************************************************************
147!> \brief performs an instance of a cp2k run
148!> \param input_declaration ...
149!> \param input_file_name name of the file to be opened for input
150!> \param output_unit unit to which output should be written
151!> \param mpi_comm ...
152!> \param initial_variables key-value list of initial preprocessor variables
153!> \author Joost VandeVondele
154!> \note
155!> para_env should be a valid communicator
156!> output_unit should be writeable by at least the lowest rank of the mpi group
157!>
158!> recursive because a given run_type might need to be able to perform
159!> another cp2k_run as part of its job (e.g. farming, classical equilibration, ...)
160!>
161!> the idea is that a cp2k instance should be able to run with just three
162!> arguments, i.e. a given input file, output unit, mpi communicator.
163!> giving these three to cp2k_run should produce a valid run.
164!> the only task of the PROGRAM cp2k is to create valid instances of the
165!> above arguments. Ideally, anything that is called afterwards should be
166!> able to run simultaneously / multithreaded / sequential / parallel / ...
167!> and able to fail safe
168! **************************************************************************************************
169 RECURSIVE SUBROUTINE cp2k_run(input_declaration, input_file_name, output_unit, mpi_comm, initial_variables)
170 TYPE(section_type), POINTER :: input_declaration
171 CHARACTER(LEN=*), INTENT(IN) :: input_file_name
172 INTEGER, INTENT(IN) :: output_unit
173
174 CLASS(mp_comm_type) :: mpi_comm
175 CHARACTER(len=default_path_length), &
176 DIMENSION(:, :), INTENT(IN) :: initial_variables
177
178 INTEGER :: f_env_handle, grid_backend, ierr, &
179 iter_level, method_name_id, &
180 new_env_id, prog_name_id, run_type_id
181 INTEGER(KIND=int_8) :: m_memory_max_mpi
182 LOGICAL :: echo_input, grid_apply_cutoff, &
183 grid_validate, has_excited_states, &
184 has_properties, I_was_ionode
185 TYPE(cp_logger_type), POINTER :: logger, sublogger
186 TYPE(mp_para_env_type), POINTER :: para_env
187 TYPE(dft_control_type), POINTER :: dft_control
188 TYPE(f_env_type), POINTER :: f_env
189 TYPE(force_env_type), POINTER :: force_env
190 TYPE(global_environment_type), POINTER :: globenv
191 TYPE(section_vals_type), POINTER :: glob_section, input_file, root_section, &
192 section
193
194 NULLIFY (para_env, f_env, dft_control)
195 ALLOCATE (para_env)
196 para_env = mpi_comm
197
198 ! The surrounding CP2K runtime owns DBCSR. Only redirect its diagnostics
199 ! to this run's output; the DBCSR API leaves an active library initialized.
200 CALL configure_dbcsr(mpi_comm, output_unit)
201
202 NULLIFY (globenv, force_env)
203
206
207 ! Parse the input
208 input_file => read_input(input_declaration, input_file_name, &
209 initial_variables=initial_variables, &
210 para_env=para_env)
211
212 CALL para_env%sync()
213
214 logger => cp_get_default_logger()
215
216 glob_section => section_vals_get_subs_vals(input_file, "GLOBAL")
217 CALL section_vals_val_get(glob_section, "ECHO_INPUT", l_val=echo_input)
218 IF (echo_input .AND. (output_unit > 0)) THEN
219 CALL section_vals_write(input_file, &
220 unit_nr=output_unit, &
221 hide_root=.true., &
222 hide_defaults=.false.)
223 END IF
224
225 CALL check_cp2k_input(input_declaration, input_file, para_env=para_env, output_unit=output_unit)
226 root_section => input_file
227 CALL section_vals_val_get(input_file, "GLOBAL%PROGRAM_NAME", &
228 i_val=prog_name_id)
229 CALL section_vals_val_get(input_file, "GLOBAL%RUN_TYPE", &
230 i_val=run_type_id)
231 CALL section_vals_val_get(root_section, "FORCE_EVAL%METHOD", i_val=method_name_id)
232
233 IF (prog_name_id /= do_cp2k) THEN
234 ! initial setup (cp2k does it in the creation of the force_env)
235 CALL globenv_create(globenv)
236 CALL section_vals_retain(input_file)
237 CALL cp2k_init(para_env, output_unit, globenv, input_file_name=input_file_name)
238 CALL cp2k_read(root_section, para_env, globenv)
239 CALL cp2k_setup(root_section, para_env, globenv)
240 END IF
241
242 CALL cp_dbcsr_config(root_section)
243 IF (output_unit > 0 .AND. &
245 CALL dbcsr_print_config(unit_nr=output_unit)
246 WRITE (unit=output_unit, fmt='()')
247 END IF
248
249 ! Configure the grid library.
250 CALL section_vals_val_get(root_section, "GLOBAL%GRID%BACKEND", i_val=grid_backend)
251 CALL section_vals_val_get(root_section, "GLOBAL%GRID%VALIDATE", l_val=grid_validate)
252 CALL section_vals_val_get(root_section, "GLOBAL%GRID%APPLY_CUTOFF", l_val=grid_apply_cutoff)
253
254 CALL grid_library_set_config(backend=grid_backend, &
255 validate=grid_validate, &
256 apply_cutoff=grid_apply_cutoff)
257
258 SELECT CASE (prog_name_id)
259 CASE (do_atom)
260 globenv%run_type_id = none_run
261 CALL atom_code(root_section)
262 CASE (do_optimize_input)
263 CALL run_optimize_input(input_declaration, root_section, para_env)
264 CASE (do_swarm)
265 CALL run_swarm(input_declaration, root_section, para_env, globenv, input_file_name)
266 CASE (do_farming)
267 ! FARMING temporarily replaces the runtime communicator with disjoint
268 ! job communicators. Each job owns DBCSR until its communicator is freed.
269 CALL dbcsr_finalize_lib()
270 CALL farming_run(input_declaration, root_section, para_env, initial_variables)
271 CALL configure_dbcsr(mpi_comm, output_unit)
272 CASE (do_opt_basis)
273 CALL run_optimize_basis(input_declaration, root_section, para_env, globenv)
274 globenv%run_type_id = none_run
275 CASE (do_cp2k)
276 CALL create_force_env(new_env_id, &
277 input_declaration=input_declaration, &
278 input_path=input_file_name, &
279 output_path="__STD_OUT__", mpi_comm=para_env, &
280 output_unit=output_unit, &
281 owns_out_unit=.false., &
282 input=input_file, ierr=ierr)
283 cpassert(ierr == 0)
284 CALL f_env_add_defaults(new_env_id, f_env, handle=f_env_handle)
285 force_env => f_env%force_env
286 CALL force_env_get(force_env, globenv=globenv)
287 CASE (do_test)
288 CALL lib_test(root_section, para_env, globenv)
289 CASE (do_tree_mc) ! TMC entry point
290 CALL do_tmc(input_declaration, root_section, para_env, globenv)
291 CASE (do_tree_mc_ana)
292 CALL do_analyze_files(input_declaration, root_section, para_env)
293 CASE default
294 cpabort("Unknown program")
295 END SELECT
296 CALL section_vals_release(input_file)
297
298 SELECT CASE (globenv%run_type_id)
299 CASE (pint_run)
300 CALL do_pint_run(para_env, root_section, input_declaration, globenv)
301 CASE (none_run, tree_mc_run)
302 ! do nothing
303 CASE (driver_run)
304 CALL run_driver(force_env, globenv)
306 IF (method_name_id /= do_qs .AND. &
307 method_name_id /= do_sirius .AND. &
308 method_name_id /= do_qmmm .AND. &
309 method_name_id /= do_mixed .AND. &
310 method_name_id /= do_nnp .AND. &
311 method_name_id /= do_embed .AND. &
312 method_name_id /= do_fist .AND. &
313 method_name_id /= do_ipi) THEN
314 cpabort("Energy/Force run not available for all methods ")
315 END IF
316
317 sublogger => cp_get_default_logger()
318 CALL cp_add_iter_level(sublogger, "JUST_ENERGY", n_rlevel_new=iter_level)
319
320 ! loop over molecules to generate a molecular guess
321 ! this procedure is initiated here to avoid passing globenv deep down
322 ! the subroutine stack
323 IF (do_mol_loop(force_env=force_env)) THEN
324 CALL loop_over_molecules(globenv, force_env)
325 END IF
326
327 ! Only this driver knows that no later geometry step will be requested.
328 ! Keep history for nested/repeated SCF consumers and for library/shell use.
329 IF (method_name_id == do_qs) THEN
330 CALL get_qs_env(force_env%qs_env, dft_control=dft_control)
331 section => section_vals_get_subs_vals(force_env%qs_env%input, "PROPERTIES")
332 CALL section_vals_get(section, explicit=has_properties)
333 section => section_vals_get_subs_vals(force_env%qs_env%input, "DFT%EXCITED_STATES")
334 CALL section_vals_get(section, explicit=has_excited_states)
335 force_env%qs_env%skip_wf_history = .NOT. (has_properties .OR. has_excited_states .OR. &
336 dft_control%qs_control%cdft .OR. &
337 dft_control%qs_control%et_coupling_calc .OR. &
338 dft_control%do_xas_calculation .OR. &
339 dft_control%do_xas_tdp_calculation .OR. &
340 force_env%qs_env%scf_control%density_guess == history_guess)
341 END IF
342
343 SELECT CASE (globenv%run_type_id)
344 CASE (energy_run)
345 CALL force_env_calc_energy_force(force_env, calc_force=.false.)
346 CASE (energy_force_run)
347 CALL force_env_calc_energy_force(force_env, calc_force=.true.)
348 CASE default
349 cpabort("Unknown run type")
350 END SELECT
351 IF (method_name_id == do_qs) force_env%qs_env%skip_wf_history = .false.
352 CALL cp_rm_iter_level(sublogger, "JUST_ENERGY", n_rlevel_att=iter_level)
353 CASE (mol_dyn_run)
354 CALL qs_mol_dyn(force_env, globenv)
355 CASE (geo_opt_run)
356 CALL cp_geo_opt(force_env, globenv)
357 CASE (cell_opt_run)
358 CALL cp_cell_opt(force_env, globenv)
359 CASE (mon_car_run)
360 CALL do_mon_car(force_env, globenv, input_declaration, input_file_name)
361 CASE (do_tamc)
362 CALL qs_tamc(force_env, globenv)
364 IF (method_name_id /= do_qs) THEN
365 cpabort("Real time propagation needs METHOD QS. ")
366 END IF
367 CALL get_qs_env(force_env%qs_env, dft_control=dft_control)
368 dft_control%rtp_control%fixed_ions = .true.
369 SELECT CASE (dft_control%rtp_control%rtp_method)
371 ! Run the linearized TD-BSE method
372 CALL run_propagation_linearized_bse(force_env)
373 CASE (rtp_method_bse)
374 ! Run the TD-BSE method
375 CALL run_propagation_bse(force_env)
376 CASE default
377 ! Run the TDDFT method
378 CALL rt_prop_setup(force_env)
379 END SELECT
380 CASE (ehrenfest)
381 IF (method_name_id /= do_qs) THEN
382 cpabort("Ehrenfest dynamics needs METHOD QS ")
383 END IF
384 CALL get_qs_env(force_env%qs_env, dft_control=dft_control)
385 dft_control%rtp_control%fixed_ions = .false.
386 CALL qs_mol_dyn(force_env, globenv)
387 CASE (bsse_run)
388 CALL do_bsse_calculation(force_env, globenv)
390 IF (method_name_id /= do_qs .AND. &
391 method_name_id /= do_qmmm) THEN
392 cpabort("Property calculations by Linear Response only within the QS or QMMM program ")
393 END IF
394 ! The Ground State is needed, it can be read from Restart
395 CALL force_env_calc_energy_force(force_env, calc_force=.false., linres=.true.)
396 CALL linres_calculation(force_env)
397 CASE (debug_run)
398 SELECT CASE (method_name_id)
399 CASE (do_qs, do_qmmm, do_fist)
400 CALL cp2k_debug_energy_and_forces(force_env)
401 CASE DEFAULT
402 cpabort("Debug run available only with QS, FIST, and QMMM program ")
403 END SELECT
404 CASE (vib_anal)
405 CALL vb_anal(root_section, input_declaration, para_env, globenv)
406 CASE (do_band)
407 CALL neb(root_section, input_declaration, para_env, globenv)
408 CASE (negf_run)
409 CALL do_negf(force_env)
410 CASE (mimic_run)
411 CALL do_mimic_loop(force_env)
412 CASE (mtlr_run)
413 IF (method_name_id /= do_qs) THEN
414 cpabort("RUN_TYPE MTLR is available only for METHOD QS.")
415 END IF
416 CALL do_mtlr_u_j(force_env)
417 CASE default
418 cpabort("Unknown run type")
419 END SELECT
420
421 ! Sample peak memory
422 CALL m_memory()
423
424 CALL dbcsr_print_statistics()
425 CALL dbm_library_print_stats(mpi_comm=mpi_comm, output_unit=output_unit)
426 CALL dbt_library_print_stats(mpi_comm=mpi_comm, output_unit=output_unit)
427 CALL grid_library_print_stats(mpi_comm=mpi_comm, output_unit=output_unit)
428 CALL offload_mempool_stats_print(mpi_comm=mpi_comm, output_unit=output_unit)
429
430 m_memory_max_mpi = m_memory_max
431 CALL mpi_comm%max(m_memory_max_mpi)
432 IF (output_unit > 0) THEN
433 WRITE (output_unit, *)
434 WRITE (output_unit, '(T2,"MEMORY| Estimated peak process memory [MiB]",T73,I8)') &
435 (m_memory_max_mpi + (1024*1024) - 1)/(1024*1024)
436 END IF
437
438 IF (prog_name_id == do_cp2k) THEN
439 f_env%force_env => force_env ! for mc
440 IF (ASSOCIATED(force_env%globenv)) THEN
441 IF (.NOT. ASSOCIATED(force_env%globenv, globenv)) THEN
442 CALL globenv_release(force_env%globenv) !mc
443 END IF
444 END IF
445 force_env%globenv => globenv !mc
446 CALL f_env_rm_defaults(f_env, ierr=ierr, &
447 handle=f_env_handle)
448 cpassert(ierr == 0)
449 CALL destroy_force_env(new_env_id, ierr=ierr)
450 cpassert(ierr == 0)
451 ELSE
452 i_was_ionode = para_env%is_source()
453 CALL cp2k_finalize(root_section, para_env, globenv)
454 cpassert(globenv%ref_count == 1)
455 CALL section_vals_release(root_section)
456 CALL globenv_release(globenv)
457 END IF
458
459 CALL mp_para_env_release(para_env)
460
461 END SUBROUTINE cp2k_run
462
463! **************************************************************************************************
464!> \brief performs a farming run that performs several independent cp2k_runs
465!> \param input_declaration ...
466!> \param root_section ...
467!> \param para_env ...
468!> \param initial_variables ...
469!> \author Joost VandeVondele
470!> \note
471!> needs to be part of this module as the cp2k_run -> farming_run -> cp2k_run
472!> calling style creates a hard circular dependency
473! **************************************************************************************************
474 RECURSIVE SUBROUTINE farming_run(input_declaration, root_section, para_env, initial_variables)
475 TYPE(section_type), POINTER :: input_declaration
476 TYPE(section_vals_type), POINTER :: root_section
477 TYPE(mp_para_env_type), POINTER :: para_env
478 CHARACTER(len=default_path_length), DIMENSION(:, :), INTENT(IN) :: initial_variables
479
480 CHARACTER(len=*), PARAMETER :: routineN = 'farming_run'
481 INTEGER, PARAMETER :: minion_status_done = -3, &
482 minion_status_wait = -4
483
484 CHARACTER(len=7) :: label
485 CHARACTER(LEN=default_path_length) :: output_file
486 CHARACTER(LEN=default_string_length) :: str
487 INTEGER :: dest, handle, i, i_job_to_restart, ierr, ijob, ijob_current, &
488 ijob_end, ijob_start, iunit, n_jobs_to_run, new_output_unit, &
489 new_rank, ngroups, num_minions, output_unit, primus_minion, &
490 minion_rank, source, tag, todo
491 INTEGER, DIMENSION(:), POINTER :: group_distribution, &
492 captain_minion_partition, &
493 minion_distribution, &
494 minion_status
495 LOGICAL :: found, captain, minion
496 REAL(KIND=dp) :: t1, t2
497 REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: waittime
498 TYPE(cp_logger_type), POINTER :: logger
499 TYPE(cp_parser_type), POINTER :: my_parser
500 TYPE(cp_unit_set_type) :: default_units
501 TYPE(farming_env_type), POINTER :: farming_env
502 TYPE(section_type), POINTER :: g_section
503 TYPE(section_vals_type), POINTER :: g_data
504 TYPE(mp_comm_type) :: minion_group, new_group
505
506 ! the primus of all minions, talks to the captain on topics concerning all minions
507 CALL timeset(routinen, handle)
508 NULLIFY (my_parser, g_section, g_data)
509
510 logger => cp_get_default_logger()
511 output_unit = cp_print_key_unit_nr(logger, root_section, "FARMING%PROGRAM_RUN_INFO", &
512 extension=".log")
513
514 IF (output_unit > 0) WRITE (output_unit, fmt="(T2,A)") "FARMING| Hi, welcome on this farm!"
515
516 ALLOCATE (farming_env)
517 CALL init_farming_env(farming_env)
518 ! remember where we started
519 CALL m_getcwd(farming_env%cwd)
520 CALL farming_parse_input(farming_env, root_section, para_env)
521
522 ! the full mpi group is first split in a minion group and a captain group, the latter being at most 1 process
523 minion = .true.
524 captain = .false.
525 IF (farming_env%captain_minion) THEN
526 IF (output_unit > 0) WRITE (output_unit, fmt="(T2,A)") "FARMING| Using a Captain-Minion setup"
527
528 ALLOCATE (captain_minion_partition(0:1))
529 captain_minion_partition = [1, para_env%num_pe - 1]
530 ALLOCATE (group_distribution(0:para_env%num_pe - 1))
531
532 CALL minion_group%from_split(para_env, ngroups, group_distribution, &
533 n_subgroups=2, group_partition=captain_minion_partition)
534 DEALLOCATE (captain_minion_partition)
535 DEALLOCATE (group_distribution)
536 num_minions = minion_group%num_pe
537 minion_rank = minion_group%mepos
538
539 IF (para_env%mepos == 0) THEN
540 minion = .false.
541 captain = .true.
542 ! on the captain node, num_minions corresponds to the size of the captain group
543 cpassert(num_minions == 1)
544 num_minions = para_env%num_pe - 1
545 minion_rank = -1
546 END IF
547 cpassert(num_minions == para_env%num_pe - 1)
548 ELSE
549 ! all processes are minions
550 IF (output_unit > 0) WRITE (output_unit, fmt="(T2,A)") "FARMING| Using a Minion-only setup"
551 CALL minion_group%from_dup(para_env)
552 num_minions = minion_group%num_pe
553 minion_rank = minion_group%mepos
554 END IF
555 IF (output_unit > 0) WRITE (output_unit, fmt="(T2,A,I0)") "FARMING| Number of Minions ", num_minions
556
557 ! keep track of which para_env rank is which minion/captain
558 ALLOCATE (minion_distribution(0:para_env%num_pe - 1))
559 minion_distribution = 0
560 minion_distribution(para_env%mepos) = minion_rank
561 CALL para_env%sum(minion_distribution)
562 ! we do have a primus inter pares
563 primus_minion = 0
564 DO i = 1, para_env%num_pe - 1
565 IF (minion_distribution(i) == 0) primus_minion = i
566 END DO
567
568 ! split the current communicator for the minions
569 ! in a new_group, new_size and new_rank according to the number of groups required according to the input
570 ALLOCATE (group_distribution(0:num_minions - 1))
571 group_distribution = -1
572 IF (minion) THEN
573 IF (farming_env%group_size_wish_set) THEN
574 farming_env%group_size_wish = min(farming_env%group_size_wish, para_env%num_pe)
575 CALL new_group%from_split(minion_group, ngroups, group_distribution, &
576 subgroup_min_size=farming_env%group_size_wish, stride=farming_env%stride)
577 ELSE IF (farming_env%ngroup_wish_set) THEN
578 IF (ASSOCIATED(farming_env%group_partition)) THEN
579 CALL new_group%from_split(minion_group, ngroups, group_distribution, &
580 n_subgroups=farming_env%ngroup_wish, &
581 group_partition=farming_env%group_partition, stride=farming_env%stride)
582 ELSE
583 CALL new_group%from_split(minion_group, ngroups, group_distribution, &
584 n_subgroups=farming_env%ngroup_wish, stride=farming_env%stride)
585 END IF
586 ELSE
587 cpabort("must set either group_size_wish or ngroup_wish")
588 END IF
589 new_rank = new_group%mepos
590 END IF
591
592 ! transfer the info about the minion group distribution to the captain
593 IF (farming_env%captain_minion) THEN
594 IF (para_env%mepos == primus_minion) THEN
595 tag = 1
596 CALL para_env%send(group_distribution, 0, tag)
597 tag = 2
598 CALL para_env%send(ngroups, 0, tag)
599 END IF
600 IF (para_env%mepos == 0) THEN
601 tag = 1
602 CALL para_env%recv(group_distribution, primus_minion, tag)
603 tag = 2
604 CALL para_env%recv(ngroups, primus_minion, tag)
605 END IF
606 END IF
607
608 ! write info on group distribution
609 IF (output_unit > 0) THEN
610 WRITE (output_unit, fmt="(T2,A,T71,I10)") "FARMING| Number of created MPI (Minion) groups:", ngroups
611 WRITE (output_unit, fmt="(T2,A)", advance="NO") "FARMING| MPI (Minion) process to group correspondence:"
612 DO i = 0, num_minions - 1
613 IF (modulo(i, 4) == 0) WRITE (output_unit, *)
614 WRITE (output_unit, fmt='(A3,I6,A3,I6,A1)', advance="NO") &
615 " (", i, " : ", group_distribution(i), ")"
616 END DO
617 WRITE (output_unit, *)
618 CALL m_flush(output_unit)
619 END IF
620
621 ! protect about too many jobs being run in single go. Not more jobs are allowed than the number in the input file
622 ! and determine the future restart point
623 IF (farming_env%cycle) THEN
624 n_jobs_to_run = farming_env%max_steps*ngroups
625 i_job_to_restart = modulo(farming_env%restart_n + n_jobs_to_run - 1, farming_env%njobs) + 1
626 ELSE
627 n_jobs_to_run = min(farming_env%njobs, farming_env%max_steps*ngroups)
628 n_jobs_to_run = min(n_jobs_to_run, farming_env%njobs - farming_env%restart_n + 1)
629 i_job_to_restart = n_jobs_to_run + farming_env%restart_n
630 END IF
631
632 ! and write the restart now, that's the point where the next job starts, even if this one is running
633 iunit = cp_print_key_unit_nr(logger, root_section, "FARMING%RESTART", &
634 extension=".restart")
635 IF (iunit > 0) THEN
636 WRITE (iunit, *) i_job_to_restart
637 END IF
638 CALL cp_print_key_finished_output(iunit, logger, root_section, "FARMING%RESTART")
639
640 ! this is the job range to be executed.
641 ijob_start = farming_env%restart_n
642 ijob_end = ijob_start + n_jobs_to_run - 1
643 IF (output_unit > 0 .AND. ijob_end - ijob_start < 0) THEN
644 WRITE (output_unit, fmt="(T2,A)") "FARMING| --- WARNING --- NO JOBS NEED EXECUTION ? "
645 WRITE (output_unit, fmt="(T2,A)") "FARMING| is the cycle keyword required ?"
646 WRITE (output_unit, fmt="(T2,A)") "FARMING| or is a stray RESTART file present ?"
647 WRITE (output_unit, fmt="(T2,A)") "FARMING| or is the group_size requested smaller than the number of CPUs?"
648 END IF
649
650 ! actual executions of the jobs in two different modes
651 IF (farming_env%captain_minion) THEN
652 IF (minion) THEN
653 ! keep on doing work until captain has decided otherwise
654 todo = do_wait
655 DO
656 IF (new_rank == 0) THEN
657 ! the head minion tells the captain he's done or ready to start
658 ! the message tells what has been done lately
659 tag = 1
660 dest = 0
661 CALL para_env%send(todo, dest, tag)
662
663 ! gets the new todo item
664 tag = 2
665 source = 0
666 CALL para_env%recv(todo, source, tag)
667
668 ! and informs his peer minions
669 CALL new_group%bcast(todo, 0)
670 ELSE
671 CALL new_group%bcast(todo, 0)
672 END IF
673
674 ! if the todo is do_nothing we are flagged to quit. Otherwise it is the job number
675 SELECT CASE (todo)
676 CASE (do_wait, do_deadlock)
677 ! go for a next round, but we first wait a bit
678 t1 = m_walltime()
679 DO
680 t2 = m_walltime()
681 IF (t2 - t1 > farming_env%wait_time) EXIT
682 END DO
683 CASE (do_nothing)
684 EXIT
685 CASE (1:)
686 CALL execute_job(todo)
687 END SELECT
688 END DO
689 ELSE ! captain
690 ALLOCATE (minion_status(0:ngroups - 1))
691 minion_status = minion_status_wait
692 ijob_current = ijob_start - 1
693
694 DO
695 IF (all(minion_status == minion_status_done)) EXIT
696
697 ! who's the next minion waiting for work
698 tag = 1
699 source = mp_any_source
700 CALL para_env%recv(todo, source, tag) ! updates source
701 IF (todo > 0) THEN
702 farming_env%Job(todo)%status = job_finished
703 IF (output_unit > 0) THEN
704 WRITE (output_unit, fmt=*) "Job finished: ", todo
705 CALL m_flush(output_unit)
706 END IF
707 END IF
708
709 ! get the next job in line, this could be do_nothing, if we're finished
710 CALL get_next_job(farming_env, ijob_start, ijob_end, ijob_current, todo)
711 dest = source
712 tag = 2
713 CALL para_env%send(todo, dest, tag)
714
715 IF (todo > 0) THEN
716 farming_env%Job(todo)%status = job_running
717 IF (output_unit > 0) THEN
718 WRITE (output_unit, fmt=*) "Job: ", todo, " Dir: ", trim(farming_env%Job(todo)%cwd), &
719 " assigned to group ", group_distribution(minion_distribution(dest))
720 CALL m_flush(output_unit)
721 END IF
722 ELSE
723 IF (todo == do_nothing) THEN
724 minion_status(group_distribution(minion_distribution(dest))) = minion_status_done
725 IF (output_unit > 0) THEN
726 WRITE (output_unit, fmt=*) "group done: ", group_distribution(minion_distribution(dest))
727 CALL m_flush(output_unit)
728 END IF
729 END IF
730 IF (todo == do_deadlock) THEN
731 IF (output_unit > 0) THEN
732 WRITE (output_unit, fmt=*) ""
733 WRITE (output_unit, fmt=*) "FARMING JOB DEADLOCKED ... CIRCULAR DEPENDENCIES"
734 WRITE (output_unit, fmt=*) ""
735 CALL m_flush(output_unit)
736 END IF
737 cpassert(todo /= do_deadlock)
738 END IF
739 END IF
740
741 END DO
742
743 DEALLOCATE (minion_status)
744
745 END IF
746 ELSE
747 ! this is the non-captain-minion mode way of executing the jobs
748 ! the i-th job in the input is always executed by the MODULO(i-1,ngroups)-th group
749 ! (needed for cyclic runs, we don't want two groups working on the same job)
750 IF (output_unit > 0) THEN
751 IF (ijob_end - ijob_start >= 0) THEN
752 WRITE (output_unit, fmt="(T2,A)") "FARMING| List of jobs : "
753 DO ijob = ijob_start, ijob_end
754 i = modulo(ijob - 1, farming_env%njobs) + 1
755 WRITE (output_unit, fmt=*) "Job: ", i, " Dir: ", trim(farming_env%Job(i)%cwd), " Input: ", &
756 trim(farming_env%Job(i)%input), " MPI group:", modulo(i - 1, ngroups)
757 END DO
758 END IF
759 CALL m_flush(output_unit)
760 END IF
761
762 DO ijob = ijob_start, ijob_end
763 i = modulo(ijob - 1, farming_env%njobs) + 1
764 ! this farms out the jobs
765 IF (modulo(i - 1, ngroups) == group_distribution(minion_rank)) THEN
766 IF (output_unit > 0) THEN
767 WRITE (output_unit, fmt="(T2,A,I5.5,A)", advance="NO") " Running Job ", i, &
768 " in "//trim(farming_env%Job(i)%cwd)//"."
769 CALL m_flush(output_unit)
770 END IF
771 CALL execute_job(i)
772 IF (output_unit > 0) THEN
773 WRITE (output_unit, fmt="(A)") " Done, output in "//trim(output_file)
774 CALL m_flush(output_unit)
775 END IF
776 END IF
777 END DO
778 END IF
779
780 ! keep information about how long each process has to wait
781 ! i.e. the load imbalance
782 t1 = m_walltime()
783 CALL para_env%sync()
784 t2 = m_walltime()
785 ALLOCATE (waittime(0:para_env%num_pe - 1))
786 waittime = 0.0_dp
787 waittime(para_env%mepos) = t2 - t1
788 CALL para_env%sum(waittime)
789 IF (output_unit > 0) THEN
790 WRITE (output_unit, '(T2,A)') "Process idle times [s] at the end of the run"
791 DO i = 0, para_env%num_pe - 1
792 WRITE (output_unit, fmt='(A2,I6,A3,F8.3,A1)', advance="NO") &
793 " (", i, " : ", waittime(i), ")"
794 IF (mod(i + 1, 4) == 0) WRITE (output_unit, '(A)') ""
795 END DO
796 CALL m_flush(output_unit)
797 END IF
798 DEALLOCATE (waittime)
799
800 ! give back the communicators of the split groups
801 IF (minion) CALL new_group%free()
802 CALL minion_group%free()
803
804 ! and message passing deallocate structures
805 DEALLOCATE (group_distribution)
806 DEALLOCATE (minion_distribution)
807
808 ! clean the farming env
809 CALL deallocate_farming_env(farming_env)
810
811 CALL cp_print_key_finished_output(output_unit, logger, root_section, &
812 "FARMING%PROGRAM_RUN_INFO")
813
814 CALL timestop(handle)
815
816 CONTAINS
817! **************************************************************************************************
818!> \brief ...
819!> \param i ...
820! **************************************************************************************************
821 RECURSIVE SUBROUTINE execute_job(i)
822 INTEGER :: i
823
824 ! change to the new working directory
825
826 CALL m_chdir(trim(farming_env%Job(i)%cwd), ierr)
827 IF (ierr /= 0) THEN
828 cpabort("Failed to change dir to: "//trim(farming_env%Job(i)%cwd))
829 END IF
830
831 ! generate a fresh call to cp2k_run
832 IF (new_rank == 0) THEN
833
834 IF (farming_env%Job(i)%output == "") THEN
835 ! generate the output file
836 WRITE (output_file, '(A12,I5.5)') "FARMING_OUT_", i
837 ALLOCATE (my_parser)
838 CALL parser_create(my_parser, file_name=trim(farming_env%Job(i)%input))
839 label = "&GLOBAL"
840 CALL parser_search_string(my_parser, label, ignore_case=.true., found=found)
841 IF (found) THEN
842 CALL create_global_section(g_section)
843 CALL section_vals_create(g_data, g_section)
844 CALL cp_unit_set_create(default_units, "OUTPUT")
845 CALL section_vals_parse(g_data, my_parser, default_units)
846 CALL cp_unit_set_release(default_units)
847 CALL section_vals_val_get(g_data, "PROJECT", &
848 c_val=str)
849 IF (str /= "") output_file = trim(str)//".out"
850 CALL section_vals_val_get(g_data, "OUTPUT_FILE_NAME", &
851 c_val=str)
852 IF (str /= "") output_file = str
853 CALL section_vals_release(g_data)
854 CALL section_release(g_section)
855 END IF
856 CALL parser_release(my_parser)
857 DEALLOCATE (my_parser)
858 ELSE
859 output_file = farming_env%Job(i)%output
860 END IF
861
862 CALL open_file(file_name=trim(output_file), &
863 file_action="WRITE", &
864 file_status="UNKNOWN", &
865 file_position="APPEND", &
866 unit_number=new_output_unit)
867 ELSE
868 ! this unit should be negative, otherwise all processors that get a default unit
869 ! start writing output (to the same file, adding to confusion).
870 ! error handling should be careful, asking for a local output unit if required
871 new_output_unit = -1
872 END IF
873
874 CALL cp2k_run(input_declaration, trim(farming_env%Job(i)%input), new_output_unit, new_group, initial_variables)
875 CALL dbcsr_finalize_lib()
876
877 IF (new_rank == 0) CALL close_file(unit_number=new_output_unit)
878
879 ! change to the original working directory
880 CALL m_chdir(trim(farming_env%cwd), ierr)
881 cpassert(ierr == 0)
882
883 END SUBROUTINE execute_job
884 END SUBROUTINE farming_run
885
886! **************************************************************************************************
887!> \brief ...
888! **************************************************************************************************
889 SUBROUTINE write_xml_file()
890
891 INTEGER :: i, unit_number
892 TYPE(section_type), POINTER :: root_section
893
894 NULLIFY (root_section)
895 CALL create_cp2k_root_section(root_section)
896 CALL keyword_release(root_section%keywords(0)%keyword)
897 CALL open_file(unit_number=unit_number, &
898 file_name="cp2k_input.xml", &
899 file_action="WRITE", &
900 file_status="REPLACE")
901
902 WRITE (unit=unit_number, fmt="(A)") '<?xml version="1.0" encoding="utf-8"?>'
903
904 !MK CP2K input structure
905 WRITE (unit=unit_number, fmt="(A)") &
906 "<CP2K_INPUT>", &
907 " <CP2K_VERSION>"//trim(cp2k_version)//"</CP2K_VERSION>", &
908 " <CP2K_YEAR>"//trim(cp2k_year)//"</CP2K_YEAR>", &
909 " <COMPILE_DATE>"//trim(compile_date)//"</COMPILE_DATE>", &
910 " <COMPILE_REVISION>"//trim(compile_revision)//"</COMPILE_REVISION>"
911
912 CALL export_references_as_xml(unit_number)
913 CALL export_units_as_xml(unit_number)
914
915 DO i = 1, root_section%n_subsections
916 CALL write_section_xml(root_section%subsections(i)%section, 1, unit_number)
917 END DO
918
919 WRITE (unit=unit_number, fmt="(A)") "</CP2K_INPUT>"
920 CALL close_file(unit_number=unit_number)
921 CALL section_release(root_section)
922
923 END SUBROUTINE write_xml_file
924
925! **************************************************************************************************
926!> \brief runs the given input
927!> \param input_declaration ...
928!> \param input_file_path the path of the input file
929!> \param output_file_path path of the output file (to which it is appended)
930!> if it is "__STD_OUT__" the default_output_unit is used
931!> \param initial_variables key-value list of initial preprocessor variables
932!> \param mpi_comm the mpi communicator to be used for this environment
933!> it will not be freed
934!> \author fawzi
935!> \note
936!> moved here because of circular dependencies
937! **************************************************************************************************
938 SUBROUTINE run_input(input_declaration, input_file_path, output_file_path, initial_variables, mpi_comm)
939 TYPE(section_type), POINTER :: input_declaration
940 CHARACTER(len=*), INTENT(in) :: input_file_path, output_file_path
941 CHARACTER(len=default_path_length), &
942 DIMENSION(:, :), INTENT(IN) :: initial_variables
943 TYPE(mp_comm_type), INTENT(in), OPTIONAL :: mpi_comm
944
945 INTEGER :: unit_nr
946 TYPE(mp_para_env_type), POINTER :: para_env
947
948 IF (PRESENT(mpi_comm)) THEN
949 ALLOCATE (para_env)
950 para_env = mpi_comm
951 ELSE
952 para_env => f77_default_para_env
953 CALL para_env%retain()
954 END IF
955 IF (para_env%is_source()) THEN
956 IF (output_file_path == "__STD_OUT__") THEN
957 unit_nr = default_output_unit
958 ELSE
959 INQUIRE (file=output_file_path, number=unit_nr)
960 END IF
961 ELSE
962 unit_nr = -1
963 END IF
964 CALL cp2k_run(input_declaration, input_file_path, unit_nr, para_env, initial_variables)
965 ! Restore DBCSR diagnostics before the caller closes its output unit.
966 CALL configure_dbcsr(f77_default_para_env, cp_logger_get_default_io_unit())
967 CALL mp_para_env_release(para_env)
968 END SUBROUTINE run_input
969
970END MODULE cp2k_runs
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
void apply_cutoff(void *ptr)
Definition atom.F:9
subroutine, public atom_code(root_section)
Driver routine to perform atomic calculations.
Definition atom.F:46
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public cp2kqs2020
integer, save, public iannuzzi2026
Module to perform a counterpoise correction (BSSE).
Definition bsse.F:14
subroutine, public do_bsse_calculation(force_env, globenv)
Perform an COUNTERPOISE CORRECTION (BSSE) For a 2-body system the correction scheme can be represente...
Definition bsse.F:79
performs CELL optimization
Definition cell_opt.F:13
subroutine, public cp_cell_opt(force_env, globenv)
Main driver to perform geometry optimization.
Definition cell_opt.F:51
Debug energy and derivatives w.r.t. finite differences.
Definition cp2k_debug.F:26
subroutine, public cp2k_debug_energy_and_forces(force_env)
...
Definition cp2k_debug.F:77
some minimal info about CP2K, including its version and license
Definition cp2k_info.F:22
character(len=default_string_length), save, public compile_date
Definition cp2k_info.F:65
character(len= *), parameter, public compile_revision
Definition cp2k_info.F:46
character(len= *), parameter, public cp2k_year
Definition cp2k_info.F:51
character(len= *), parameter, public cp2k_version
Definition cp2k_info.F:50
subroutine, public run_input(input_declaration, input_file_path, output_file_path, initial_variables, mpi_comm)
runs the given input
Definition cp2k_runs.F:939
subroutine, public write_xml_file()
...
Definition cp2k_runs.F:890
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
Utility routines to open and close files.
Definition cp_files.F:22
subroutine, public open_file(file_name, unit_number, file_status, file_form, file_action, file_position, file_pad, file_access, debug)
Opens a file and returns its logical unit number.
Definition cp_files.F:197
subroutine, public close_file(unit_number, file_status)
Closes an open file given by its logical unit number.
Definition cp_files.F:64
various routines to log and control the output. The idea is that decisions about where to log should ...
logical function, public cp_logger_would_log(logger, level)
this function can be called to check if the logger would log a message with the given level from the ...
integer, parameter, public cp_note_level
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...
subroutine, public cp_add_iter_level(logger, level_name, n_rlevel_new)
Adds an iteration level.
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,...
subroutine, public cp_rm_iter_level(logger, level_name, n_rlevel_att)
Removes an iteration level.
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, file_access)
...
Utility routines to read data from files. Kept as close as possible to the old parser because.
subroutine, public parser_search_string(parser, string, ignore_case, found, line, begin_line, search_from_begin_of_file)
Search a string pattern in a file defined by its logical unit number "unit". A case sensitive search ...
Utility routines to read data from files. Kept as close as possible to the old parser because.
subroutine, public parser_release(parser)
releases the parser
subroutine, public parser_create(parser, file_name, unit_nr, para_env, end_section_label, separator_chars, comment_char, continuation_char, quote_char, section_char, parse_white_lines, initial_variables, apply_preprocessing)
Start a parser run. Initial variables allow to @SET stuff before opening the file.
unit conversion facility
Definition cp_units.F:30
subroutine, public cp_unit_set_release(unit_set)
releases the given unit set
Definition cp_units.F:1437
subroutine, public cp_unit_set_create(unit_set, name)
initializes the given unit set
Definition cp_units.F:1360
subroutine, public export_units_as_xml(iw)
Exports all available units as XML.
Definition cp_units.F:1454
subroutine validate(matrix)
Dummy for when DBM_VALIDATE_AGAINST_DBCSR is not defined.
Definition dbm_api.F:251
subroutine, public dbm_library_print_stats(mpi_comm, output_unit)
Print DBM library statistics.
Definition dbm_api.F:1513
This is the start of a dbt_api, all publically needed functions are exported here....
Definition dbt_api.F:17
Sets up and terminates the global environment variables.
Definition environment.F:17
subroutine, public cp2k_finalize(root_section, para_env, globenv, wdir, q_finalize)
Writes final timings and banner for CP2K.
subroutine, public cp2k_read(root_section, para_env, globenv)
read part of cp2k_init
subroutine, public cp2k_init(para_env, output_unit, globenv, input_file_name, wdir)
Initializes a CP2K run (setting of the global environment variables).
subroutine, public cp2k_setup(root_section, para_env, globenv)
globenv initializations that need the input and error
interface to use cp2k as library
recursive subroutine, public destroy_force_env(env_id, ierr, q_finalize)
deallocates the force_env with the given id
subroutine, public f_env_add_defaults(f_env_id, f_env, handle)
adds the default environments of the f_env to the stack of the defaults, and returns a new error and ...
type(mp_para_env_type), pointer, save, public default_para_env
subroutine, public configure_dbcsr(mpi_comm, output_unit)
Configure DBCSR with CP2K's hooks and selected accelerator device. For an active library the DBCSR AP...
recursive subroutine, public create_force_env(new_env_id, input_declaration, input_path, output_path, mpi_comm, output_unit, owns_out_unit, input, ierr, work_dir, initial_variables)
creates a new force environment using the given input, and writing the output to the given output uni...
subroutine, public f_env_rm_defaults(f_env, ierr, handle)
removes the default environments of the f_env to the stack of the defaults, and sets ierr accordingly...
recursive subroutine, public calc_force(env_id, pos, n_el_pos, e_pot, force, n_el_force, ierr)
returns the energy of the configuration given by the positions passed as argument
subroutine, public farming_parse_input(farming_env, root_section, para_env)
...
integer, parameter, public do_nothing
integer, parameter, public do_wait
subroutine, public get_next_job(farming_env, start, end, current, todo)
...
integer, parameter, public do_deadlock
subroutine, public deallocate_farming_env(farming_env)
deallocates all associated fields of the farming_env type and the type itself
integer, parameter, public job_finished
integer, parameter, public job_running
subroutine, public init_farming_env(farming_env)
help poor compilers do their job i.e. provide a default initialization
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
performs geometry optimization
Definition geo_opt.F:13
subroutine, public cp_geo_opt(force_env, globenv, eval_opt_geo, rm_restart_info)
Main driver to perform geometry optimization.
Definition geo_opt.F:59
Define type storing the global information of a run. Keep the amount of stored data small....
subroutine, public globenv_create(globenv)
Creates the global environment globenv.
subroutine, public globenv_release(globenv)
Releases the global environment globenv.
Fortran API for the grid package, which is written in C.
Definition grid_api.F:12
subroutine, public grid_library_set_config(backend, validate, apply_cutoff)
Configures the grid library.
Definition grid_api.F:1155
subroutine, public grid_library_print_stats(mpi_comm, output_unit)
Print grid library statistics.
Definition grid_api.F:1181
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public driver_run
integer, parameter, public rtp_method_bse_linearized
integer, parameter, public energy_run
integer, parameter, public do_farming
integer, parameter, public do_nnp
integer, parameter, public do_cp2k
integer, parameter, public linear_response_run
integer, parameter, public do_tamc
integer, parameter, public ehrenfest
integer, parameter, public do_opt_basis
integer, parameter, public history_guess
integer, parameter, public mtlr_run
integer, parameter, public debug_run
integer, parameter, public do_test
integer, parameter, public do_fist
integer, parameter, public do_qmmm
integer, parameter, public do_embed
integer, parameter, public do_sirius
integer, parameter, public do_band
integer, parameter, public do_tree_mc
integer, parameter, public bsse_run
integer, parameter, public mimic_run
integer, parameter, public energy_force_run
integer, parameter, public rtp_method_bse
integer, parameter, public do_optimize_input
integer, parameter, public do_atom
integer, parameter, public mon_car_run
integer, parameter, public do_tree_mc_ana
integer, parameter, public mol_dyn_run
integer, parameter, public cell_opt_run
integer, parameter, public pint_run
integer, parameter, public vib_anal
integer, parameter, public none_run
integer, parameter, public negf_run
integer, parameter, public do_qs
integer, parameter, public do_mixed
integer, parameter, public do_ipi
integer, parameter, public tree_mc_run
integer, parameter, public real_time_propagation
integer, parameter, public geo_opt_run
integer, parameter, public do_swarm
checks the input and perform some automatic "magic" on it
subroutine, public check_cp2k_input(input_declaration, input_file, para_env, output_unit)
performs further checks on an input that parsed successfully
builds the global input section for cp2k
subroutine, public create_global_section(section)
section to hold global settings for the whole program
parse cp2k input files
type(section_vals_type) function, pointer, public read_input(input_declaration, file_path, initial_variables, para_env)
reads the cp2k input from the given filepath and returns a section_vals containing the input
builds the input structure for cp2k
Definition input_cp2k.F:14
subroutine, public create_cp2k_root_section(root_section)
creates the input structure of the file used by cp2k
Definition input_cp2k.F:75
represents keywords in an input
subroutine, public keyword_release(keyword)
releases the given keyword (see doc/ReferenceCounting.html)
routines that parse the input
recursive subroutine, public section_vals_parse(section_vals, parser, default_units, root_section)
...
objects that represent the structure of input sections and the data contained in an input section
recursive subroutine, public write_section_xml(section, level, unit_number)
writes the values in the given section in xml
recursive subroutine, public section_vals_create(section_vals, section)
creates a object where to store the values of a section
subroutine, public section_vals_retain(section_vals)
retains the given section values (see doc/ReferenceCounting.html)
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
recursive subroutine, public section_release(section)
releases the given keyword list (see doc/ReferenceCounting.html)
recursive subroutine, public section_vals_write(section_vals, unit_nr, hide_root, hide_defaults)
writes the values in the given section in a way that is suitable to the automatic parsing
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
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
recursive subroutine, public section_vals_release(section_vals)
releases the given object
Driver mode - To communicate with i-PI Python wrapper.
Definition ipi_driver.F:14
subroutine, public run_driver(force_env, globenv)
...
Definition ipi_driver.F:79
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public int_8
Definition kinds.F:54
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
integer, parameter, public default_path_length
Definition kinds.F:58
Performance tests for basic tasks like matrix multiplies, copy, fft.
subroutine, public lib_test(root_section, para_env, globenv)
Master routine for tests.
Machine interface based on Fortran 2003 and POSIX.
Definition machine.F:17
integer, parameter, public default_output_unit
Definition machine.F:48
subroutine, public m_memory(mem)
Returns the total amount of memory [bytes] in use, if known, zero otherwise.
Definition machine.F:443
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
Definition machine.F:127
subroutine, public m_getcwd(curdir)
...
Definition machine.F:610
subroutine, public m_chdir(dir, ierror)
...
Definition machine.F:666
integer(kind=int_8), save, public m_memory_max
Definition machine.F:114
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Definition machine.F:144
preps the system for a Monte Carlo run (sets up some environments, calls the routines to read in the ...
Definition mc_run.F:40
subroutine, public do_mon_car(force_env_1, globenv, input_declaration, input_file_name)
starts the Monte Carlo simulation and determines which ensemble we're running
Definition mc_run.F:103
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
Interface to the message passing library MPI.
subroutine, public mp_para_env_release(para_env)
releases the para object (to be called when you don't want anymore the shared copy of this object)
integer, parameter, public mp_any_source
Module containing the main loop for simulations with the MiMiC framework.
Definition mimic_loop.F:15
subroutine, public do_mimic_loop(force_env)
The main loop for a MiMiC run.
Definition mimic_loop.F:48
Subroutines to perform calculations on molecules from a bigger system. Useful to generate a high-qual...
subroutine, public loop_over_molecules(globenv, force_env)
Prepare data for calculations on isolated molecules.
logical function, public do_mol_loop(force_env)
Is the loop over molecules requested?
Driver for self-consistent minimum tracking linear response U and J calculations.
subroutine, public do_mtlr_u_j(force_env)
Driver for self-consistent MTLR U/J iteration. Each outer iteration performs: 1) one standard ENERGY ...
Module performing a Nudged Elastic Band Calculation.
Definition neb_methods.F:23
subroutine, public neb(input, input_declaration, para_env, globenv)
Real subroutine for NEB calculations.
Definition neb_methods.F:94
NEGF based quantum transport calculations.
subroutine, public do_negf(force_env)
Perform NEGF calculation.
Fortran API for the offload package, which is written in C.
Definition offload_api.F:12
subroutine, public offload_mempool_stats_print(mpi_comm, output_unit)
Print allocation statistics.
subroutine, public run_optimize_basis(input_declaration, root_section, para_env, globenv)
main entry point for methods aimed at optimizing basis sets
subroutine, public run_optimize_input(input_declaration, root_section, para_env)
main entry point for methods aimed at optimizing parameters in a CP2K input file
Methods to performs a path integral run.
subroutine, public do_pint_run(para_env, input, input_declaration, globenv)
Perform a path integral simulation.
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Contains the setup for the calculation of properties by linear response by the application of second ...
subroutine, public linres_calculation(force_env)
Driver for the linear response calculatios.
provides a uniform framework to add references to CP2K cite and output these
subroutine, public cite_reference(key)
marks a given reference as cited.
subroutine, public export_references_as_xml(unit)
Exports all references as XML.
Routines for the propagation of the linearized RT-BSE equations of motion. Propagates the first-order...
subroutine, public run_propagation_linearized_bse(force_env)
Runs the electron-only real time propagation of the linearized BSE.
Routines for the propagation via RT-BSE method.
Definition rt_bse.F:14
subroutine, public run_propagation_bse(force_env)
Runs the electron-only real time BSE propagation.
Definition rt_bse.F:152
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
Swarm-framwork, provides a convenient master/worker architecture.
Definition swarm.F:12
subroutine, public run_swarm(input_declaration, root_section, para_env, globenv, input_path)
Central driver routine of the swarm framework, called by cp2k_runs.F.
Definition swarm.F:62
Perform a temperature accelarated hybrid monte carlo (TAHMC) run using QUICKSTEP.
Definition tamc_run.F:14
subroutine, public qs_tamc(force_env, globenv, averages)
Driver routine for TAHMC.
Definition tamc_run.F:147
Tree Monte Carlo entry point, set up, CPU redistribution and input reading.
Definition tmc_setup.F:16
subroutine, public do_analyze_files(input_declaration, root_section, para_env)
analyze TMC trajectory files
Definition tmc_setup.F:353
subroutine, public do_tmc(input_declaration, root_section, para_env, globenv)
tmc_entry point
Definition tmc_setup.F:98
Module performing a vibrational analysis.
subroutine, public vb_anal(input, input_declaration, para_env, globenv)
Module performing a vibrational analysis.
type of a logger, at the moment it contains just a print level starting at which level it should be l...
stores the default units to be used
Definition cp_units.F:161
wrapper to abstract the force evaluation of the various methods
contains the initially parsed file and the initial parallel environment
represent a section of the input file
stores all the informations relevant to an mpi environment