(git:4cf809f)
Loading...
Searching...
No Matches
f77_interface.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 interface to use cp2k as library
10!> \note
11!> useful additions for the future would be:
12!> - string(path) based set/get of simple values (to change the new
13!> input during the run and extract more data (energy types for example).
14!> - set/get of a subset of atoms
15!> \par History
16!> 07.2004 created [fawzi]
17!> 11.2004 parallel version [fawzi]
18!> \author fawzi & Johanna
19! **************************************************************************************************
21 USE base_hooks, ONLY: cp_abort_hook,&
26 USE cell_methods, ONLY: init_cell
27 USE cell_types, ONLY: cell_type
29 USE cp_dbcsr_api, ONLY: dbcsr_finalize_lib,&
30 dbcsr_init_lib
36 USE cp_log_handling, ONLY: &
49 USE dbm_api, ONLY: dbm_library_finalize,&
51 USE eip_environment, ONLY: eip_init
56 USE environment, ONLY: cp2k_finalize,&
57 cp2k_init,&
58 cp2k_read,&
63 USE force_env_types, ONLY: &
67 USE fp_types, ONLY: fp_env_create,&
76 USE input_constants, ONLY: &
80 USE input_cp2k_read, ONLY: empty_initial_variables,&
86 USE input_section_types, ONLY: &
91 USE ipi_environment, ONLY: ipi_init
93 USE kinds, ONLY: default_path_length,&
95 dp
96 USE machine, ONLY: default_output_unit,&
97 m_chdir,&
98 m_getcwd,&
100 USE message_passing, ONLY: mp_comm_type,&
110 USE mp_perf_env, ONLY: add_mp_perf_env,&
116 USE nnp_environment, ONLY: nnp_init
122 USE pw_fpga, ONLY: pw_fpga_finalize,&
124 USE pw_gpu, ONLY: pw_gpu_finalize,&
130 USE qmmm_types, ONLY: qmmm_env_type
132 USE qmmmx_types, ONLY: qmmmx_env_type
133 USE qs_environment, ONLY: qs_init
143 USE timings, ONLY: add_timer_env,&
150 USE virial_types, ONLY: virial_type
151 USE xc_gauxc_interface, ONLY: cp_gauxc_status_type,&
152 gauxc_check_status,&
153 gauxc_finalize,&
154 gauxc_init
155#include "./base/base_uses.f90"
156
157 IMPLICIT NONE
158 PRIVATE
159
160 LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .true.
161 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'f77_interface'
162
163! **************************************************************************************************
164 TYPE f_env_p_type
165 TYPE(f_env_type), POINTER :: f_env => null()
166 END TYPE f_env_p_type
167
168! **************************************************************************************************
170 INTEGER :: id_nr = 0
171 TYPE(force_env_type), POINTER :: force_env => null()
172 TYPE(cp_logger_type), POINTER :: logger => null()
173 TYPE(timer_env_type), POINTER :: timer_env => null()
174 TYPE(mp_perf_env_type), POINTER :: mp_perf_env => null()
175 CHARACTER(len=default_path_length) :: my_path = "", old_path = ""
176 END TYPE f_env_type
177
178 TYPE(f_env_p_type), DIMENSION(:), POINTER, SAVE :: f_envs
179 TYPE(mp_para_env_type), POINTER, SAVE :: default_para_env
180 LOGICAL, SAVE :: module_initialized = .false.
181 INTEGER, SAVE :: last_f_env_id = 0, n_f_envs = 0
182
183 PUBLIC :: default_para_env
184 PUBLIC :: init_cp2k, finalize_cp2k
190 set_vel, set_cell, get_cell, get_qmmm_cell, get_result_r1
191CONTAINS
192
193! **************************************************************************************************
194!> \brief returns the position of the force env corresponding to the given id
195!> \param env_id the id of the requested environment
196!> \return ...
197!> \author fawzi
198!> \note
199!> private utility function
200! **************************************************************************************************
201 FUNCTION get_pos_of_env(env_id) RESULT(res)
202 INTEGER, INTENT(in) :: env_id
203 INTEGER :: res
204
205 INTEGER :: env_pos, isub
206
207 env_pos = -1
208 DO isub = 1, n_f_envs
209 IF (f_envs(isub)%f_env%id_nr == env_id) THEN
210 env_pos = isub
211 END IF
212 END DO
213 res = env_pos
214 END FUNCTION get_pos_of_env
215
216! **************************************************************************************************
217!> \brief initializes cp2k, needs to be called once before using any of the
218!> other functions when using cp2k as library
219!> \param init_mpi if the mpi environment should be initialized
220!> \param ierr returns a number different from 0 if there was an error
221!> \param mpi_comm an existing mpi communicator (if not given mp_comm_world
222!> will be used)
223!> \author fawzi
224! **************************************************************************************************
225 SUBROUTINE init_cp2k(init_mpi, ierr, mpi_comm)
226 LOGICAL, INTENT(in) :: init_mpi
227 INTEGER, INTENT(out) :: ierr
228 TYPE(mp_comm_type), INTENT(in), OPTIONAL :: mpi_comm
229
230 INTEGER :: offload_device_count, unit_nr
231 INTEGER, POINTER :: active_device_id
232 INTEGER, TARGET :: offload_chosen_device
233 TYPE(cp_gauxc_status_type) :: gauxc_status
234 TYPE(cp_logger_type), POINTER :: logger
235
236 IF (.NOT. module_initialized) THEN
237 ! install error handler hooks
239
240 ! install timming handler hooks
242
243 ! Initialise preconnection list
245
246 ! get runtime information
247 CALL get_runtime_info()
248
249 ! Intialize CUDA/HIP before MPI
250 ! Needed for HIP on ALPS & LUMI
251 CALL offload_init()
252
253 ! re-create the para_env and log with correct (reordered) ranks
254 ALLOCATE (default_para_env)
255 IF (init_mpi) THEN
256 ! get the default system wide communicator
258 ELSE
259 IF (PRESENT(mpi_comm)) THEN
260 default_para_env = mpi_comm
261 ELSE
263 END IF
264 END IF
265
267 CALL add_mp_perf_env()
268 CALL add_timer_env()
269
270 IF (default_para_env%is_source()) THEN
271 unit_nr = default_output_unit
272 ELSE
273 unit_nr = -1
274 END IF
275 NULLIFY (logger)
276
277 CALL cp_logger_create(logger, para_env=default_para_env, &
278 default_global_unit_nr=unit_nr, &
279 close_global_unit_on_dealloc=.false.)
280 CALL cp_add_default_logger(logger)
281 CALL cp_logger_release(logger)
282
283 ALLOCATE (f_envs(0))
284 module_initialized = .true.
285 ierr = 0
286
287 ! Initialize mathematical constants
289
290 ! Init the bibliography
291 CALL add_all_references()
292
293 NULLIFY (active_device_id)
294 offload_device_count = offload_get_device_count()
295
296 ! Select active offload device when available.
297 IF (offload_device_count > 0) THEN
298 offload_chosen_device = mod(default_para_env%mepos, offload_device_count)
299 CALL offload_set_chosen_device(offload_chosen_device)
300 active_device_id => offload_chosen_device
301 END IF
302
303 ! Initialize the DBCSR configuration
304 ! Attach the time handler hooks to DBCSR
305 CALL dbcsr_init_lib(default_para_env%get_handle(), timeset_hook, timestop_hook, &
306 cp_abort_hook, cp_warn_hook, io_unit=unit_nr, &
307 accdrv_active_device_id=active_device_id)
308#if defined(__parallel)
309 CALL gauxc_init(default_para_env%get_handle(), gauxc_status)
310#else
311 CALL gauxc_init(status=gauxc_status)
312#endif
313 CALL gauxc_check_status(gauxc_status)
314 CALL pw_fpga_init()
315 CALL pw_gpu_init()
316 CALL grid_library_init()
317 CALL dbm_library_init()
318 ELSE
319 ierr = cp_failure_level
320 END IF
321
322 !sample peak memory
323 CALL m_memory()
324
325 END SUBROUTINE init_cp2k
326
327! **************************************************************************************************
328!> \brief cleanup after you have finished using this interface
329!> \param finalize_mpi if the mpi environment should be finalized
330!> \param ierr returns a number different from 0 if there was an error
331!> \author fawzi
332! **************************************************************************************************
333 SUBROUTINE finalize_cp2k(finalize_mpi, ierr)
334 LOGICAL, INTENT(in) :: finalize_mpi
335 INTEGER, INTENT(out) :: ierr
336
337 INTEGER :: ienv
338 TYPE(cp_gauxc_status_type) :: gauxc_status
339
340!sample peak memory
341
342 CALL m_memory()
343
344 IF (.NOT. module_initialized) THEN
345 ierr = cp_failure_level
346 ELSE
347 DO ienv = n_f_envs, 1, -1
348 CALL destroy_force_env(f_envs(ienv)%f_env%id_nr, ierr=ierr)
349 cpassert(ierr == 0)
350 END DO
351 DEALLOCATE (f_envs)
352
353 ! Finalize libraries (Offload)
356 CALL pw_gpu_finalize()
357 CALL pw_fpga_finalize()
359 CALL gauxc_finalize(gauxc_status)
360 CALL gauxc_check_status(gauxc_status)
361 ! Finalize the DBCSR library
362 CALL dbcsr_finalize_lib()
363
364 ! Finalize DLA-Future and pika runtime; if already finalized does nothing
366 CALL cp_dlaf_finalize()
367
370
371 ! Deallocate the bibliography
373 CALL rm_timer_env()
374 CALL rm_mp_perf_env()
377 IF (finalize_mpi) THEN
378 CALL mp_world_finalize()
379 END IF
380
381 ierr = 0
382 END IF
383 END SUBROUTINE finalize_cp2k
384
385! **************************************************************************************************
386!> \brief deallocates a f_env
387!> \param f_env the f_env to deallocate
388!> \author fawzi
389! **************************************************************************************************
390 RECURSIVE SUBROUTINE f_env_dealloc(f_env)
391 TYPE(f_env_type), POINTER :: f_env
392
393 INTEGER :: ierr
394
395 cpassert(ASSOCIATED(f_env))
396 CALL force_env_release(f_env%force_env)
397 CALL cp_logger_release(f_env%logger)
398 CALL timer_env_release(f_env%timer_env)
399 CALL mp_perf_env_release(f_env%mp_perf_env)
400 IF (f_env%old_path /= f_env%my_path) THEN
401 CALL m_chdir(f_env%old_path, ierr)
402 cpassert(ierr == 0)
403 END IF
404 END SUBROUTINE f_env_dealloc
405
406! **************************************************************************************************
407!> \brief createates a f_env
408!> \param f_env the f_env to createate
409!> \param force_env the force_environment to be stored
410!> \param timer_env the timer env to be stored
411!> \param mp_perf_env the mp performance environment to be stored
412!> \param id_nr ...
413!> \param logger ...
414!> \param old_dir ...
415!> \author fawzi
416! **************************************************************************************************
417 SUBROUTINE f_env_create(f_env, force_env, timer_env, mp_perf_env, id_nr, logger, old_dir)
418 TYPE(f_env_type), POINTER :: f_env
419 TYPE(force_env_type), POINTER :: force_env
420 TYPE(timer_env_type), POINTER :: timer_env
421 TYPE(mp_perf_env_type), POINTER :: mp_perf_env
422 INTEGER, INTENT(in) :: id_nr
423 TYPE(cp_logger_type), POINTER :: logger
424 CHARACTER(len=*), INTENT(in) :: old_dir
425
426 ALLOCATE (f_env)
427 f_env%force_env => force_env
428 CALL force_env_retain(f_env%force_env)
429 f_env%logger => logger
430 CALL cp_logger_retain(logger)
431 f_env%timer_env => timer_env
432 CALL timer_env_retain(f_env%timer_env)
433 f_env%mp_perf_env => mp_perf_env
434 CALL mp_perf_env_retain(f_env%mp_perf_env)
435 f_env%id_nr = id_nr
436 CALL m_getcwd(f_env%my_path)
437 f_env%old_path = old_dir
438 END SUBROUTINE f_env_create
439
440! **************************************************************************************************
441!> \brief ...
442!> \param f_env_id ...
443!> \param f_env ...
444! **************************************************************************************************
445 SUBROUTINE f_env_get_from_id(f_env_id, f_env)
446 INTEGER, INTENT(in) :: f_env_id
447 TYPE(f_env_type), POINTER :: f_env
448
449 INTEGER :: f_env_pos
450
451 NULLIFY (f_env)
452 f_env_pos = get_pos_of_env(f_env_id)
453 IF (f_env_pos < 1) THEN
454 cpabort("invalid env_id "//cp_to_string(f_env_id))
455 ELSE
456 f_env => f_envs(f_env_pos)%f_env
457 END IF
458
459 END SUBROUTINE f_env_get_from_id
460
461! **************************************************************************************************
462!> \brief adds the default environments of the f_env to the stack of the
463!> defaults, and returns a new error and sets failure to true if
464!> something went wrong
465!> \param f_env_id the f_env from where to take the defaults
466!> \param f_env will contain the f_env corresponding to f_env_id
467!> \param handle ...
468!> \author fawzi
469!> \note
470!> The following routines need to be synchronized wrt. adding/removing
471!> of the default environments (logging, performance,error):
472!> environment:cp2k_init, environment:cp2k_finalize,
473!> f77_interface:f_env_add_defaults, f77_interface:f_env_rm_defaults,
474!> f77_interface:create_force_env, f77_interface:destroy_force_env
475! **************************************************************************************************
476 SUBROUTINE f_env_add_defaults(f_env_id, f_env, handle)
477 INTEGER, INTENT(in) :: f_env_id
478 TYPE(f_env_type), POINTER :: f_env
479 INTEGER, INTENT(out), OPTIONAL :: handle
480
481 INTEGER :: f_env_pos, ierr
482 TYPE(cp_logger_type), POINTER :: logger
483
484 NULLIFY (f_env)
485 f_env_pos = get_pos_of_env(f_env_id)
486 IF (f_env_pos < 1) THEN
487 cpabort("invalid env_id "//cp_to_string(f_env_id))
488 ELSE
489 f_env => f_envs(f_env_pos)%f_env
490 logger => f_env%logger
491 cpassert(ASSOCIATED(logger))
492 CALL m_getcwd(f_env%old_path)
493 IF (f_env%old_path /= f_env%my_path) THEN
494 CALL m_chdir(trim(f_env%my_path), ierr)
495 cpassert(ierr == 0)
496 END IF
497 CALL add_mp_perf_env(f_env%mp_perf_env)
498 CALL add_timer_env(f_env%timer_env)
499 CALL cp_add_default_logger(logger)
500 IF (PRESENT(handle)) handle = cp_default_logger_stack_size()
501 END IF
502 END SUBROUTINE f_env_add_defaults
503
504! **************************************************************************************************
505!> \brief removes the default environments of the f_env to the stack of the
506!> defaults, and sets ierr accordingly to the failuers stored in error
507!> It also releases the error
508!> \param f_env the f_env from where to take the defaults
509!> \param ierr variable that will be set to a number different from 0 if
510!> error contains an error (otherwise it will be set to 0)
511!> \param handle ...
512!> \author fawzi
513!> \note
514!> The following routines need to be synchronized wrt. adding/removing
515!> of the default environments (logging, performance,error):
516!> environment:cp2k_init, environment:cp2k_finalize,
517!> f77_interface:f_env_add_defaults, f77_interface:f_env_rm_defaults,
518!> f77_interface:create_force_env, f77_interface:destroy_force_env
519! **************************************************************************************************
520 SUBROUTINE f_env_rm_defaults(f_env, ierr, handle)
521 TYPE(f_env_type), POINTER :: f_env
522 INTEGER, INTENT(out), OPTIONAL :: ierr
523 INTEGER, INTENT(in), OPTIONAL :: handle
524
525 INTEGER :: ierr2
526 TYPE(cp_logger_type), POINTER :: d_logger, logger
527 TYPE(mp_perf_env_type), POINTER :: d_mp_perf_env
528 TYPE(timer_env_type), POINTER :: d_timer_env
529
530 IF (ASSOCIATED(f_env)) THEN
531 IF (PRESENT(handle)) THEN
532 cpassert(handle == cp_default_logger_stack_size())
533 END IF
534
535 logger => f_env%logger
536 d_logger => cp_get_default_logger()
537 d_timer_env => get_timer_env()
538 d_mp_perf_env => get_mp_perf_env()
539 cpassert(ASSOCIATED(logger))
540 cpassert(ASSOCIATED(d_logger))
541 cpassert(ASSOCIATED(d_timer_env))
542 cpassert(ASSOCIATED(d_mp_perf_env))
543 cpassert(ASSOCIATED(logger, d_logger))
544 ! CPASSERT(ASSOCIATED(d_timer_env, f_env%timer_env))
545 cpassert(ASSOCIATED(d_mp_perf_env, f_env%mp_perf_env))
546 IF (f_env%old_path /= f_env%my_path) THEN
547 CALL m_chdir(trim(f_env%old_path), ierr2)
548 cpassert(ierr2 == 0)
549 END IF
550 IF (PRESENT(ierr)) THEN
551 ierr = 0
552 END IF
554 CALL rm_timer_env()
555 CALL rm_mp_perf_env()
556 ELSE
557 IF (PRESENT(ierr)) THEN
558 ierr = 0
559 END IF
560 END IF
561 END SUBROUTINE f_env_rm_defaults
562
563! **************************************************************************************************
564!> \brief creates a new force environment using the given input, and writing
565!> the output to the given output unit
566!> \param new_env_id will contain the id of the newly created environment
567!> \param input_declaration ...
568!> \param input_path where to read the input (if the input is given it can
569!> a virtual path)
570!> \param output_path filename (or name of the unit) for the output
571!> \param mpi_comm the mpi communicator to be used for this environment
572!> it will not be freed when you get rid of the force_env
573!> \param output_unit if given it should be the unit for the output
574!> and no file is open (should be valid on the processor with rank 0)
575!> \param owns_out_unit if the output unit should be closed upon destroing
576!> of the force_env (defaults to true if not default_output_unit)
577!> \param input the parsed input, if given and valid it is used
578!> instead of parsing from file
579!> \param ierr will return a number different from 0 if there was an error
580!> \param work_dir ...
581!> \param initial_variables key-value list of initial preprocessor variables
582!> \author fawzi
583!> \note
584!> The following routines need to be synchronized wrt. adding/removing
585!> of the default environments (logging, performance,error):
586!> environment:cp2k_init, environment:cp2k_finalize,
587!> f77_interface:f_env_add_defaults, f77_interface:f_env_rm_defaults,
588!> f77_interface:create_force_env, f77_interface:destroy_force_env
589! **************************************************************************************************
590 RECURSIVE SUBROUTINE create_force_env(new_env_id, input_declaration, input_path, &
591 output_path, mpi_comm, output_unit, owns_out_unit, &
592 input, ierr, work_dir, initial_variables)
593 INTEGER, INTENT(out) :: new_env_id
594 TYPE(section_type), POINTER :: input_declaration
595 CHARACTER(len=*), INTENT(in) :: input_path
596 CHARACTER(len=*), INTENT(in), OPTIONAL :: output_path
597
598 CLASS(mp_comm_type), INTENT(IN), OPTIONAL :: mpi_comm
599 INTEGER, INTENT(in), OPTIONAL :: output_unit
600 LOGICAL, INTENT(in), OPTIONAL :: owns_out_unit
601 TYPE(section_vals_type), OPTIONAL, POINTER :: input
602 INTEGER, INTENT(out), OPTIONAL :: ierr
603 CHARACTER(len=*), INTENT(in), OPTIONAL :: work_dir
604 CHARACTER(len=*), DIMENSION(:, :), OPTIONAL :: initial_variables
605
606 CHARACTER(len=*), PARAMETER :: routinen = 'create_force_env'
607
608 CHARACTER(len=default_path_length) :: old_dir, wdir
609 INTEGER :: handle, i, ierr2, iforce_eval, isubforce_eval, k, method_name_id, my_group, &
610 nforce_eval, ngroups, nsubforce_size, unit_nr
611 INTEGER, DIMENSION(:), POINTER :: group_distribution, i_force_eval, &
612 lgroup_distribution
613 LOGICAL :: check, do_qmmm_force_mixing, multiple_subsys, my_owns_out_unit, &
614 use_motion_section, use_multiple_para_env
615 TYPE(cp_logger_type), POINTER :: logger, my_logger
616 TYPE(mp_para_env_type), POINTER :: my_para_env, para_env
617 TYPE(eip_environment_type), POINTER :: eip_env
618 TYPE(embed_env_type), POINTER :: embed_env
619 TYPE(enumeration_type), POINTER :: enum
620 TYPE(f_env_p_type), DIMENSION(:), POINTER :: f_envs_old
621 TYPE(force_env_type), POINTER :: force_env, my_force_env
622 TYPE(fp_type), POINTER :: fp_env
623 TYPE(global_environment_type), POINTER :: globenv
624 TYPE(ipi_environment_type), POINTER :: ipi_env
625 TYPE(keyword_type), POINTER :: keyword
626 TYPE(meta_env_type), POINTER :: meta_env
627 TYPE(mixed_environment_type), POINTER :: mixed_env
628 TYPE(mp_perf_env_type), POINTER :: mp_perf_env
629 TYPE(nnp_type), POINTER :: nnp_env
630 TYPE(pwdft_environment_type), POINTER :: pwdft_env
631 TYPE(qmmm_env_type), POINTER :: qmmm_env
632 TYPE(qmmmx_env_type), POINTER :: qmmmx_env
633 TYPE(qs_environment_type), POINTER :: qs_env
634 TYPE(section_type), POINTER :: section
635 TYPE(section_vals_type), POINTER :: fe_section, force_env_section, force_env_sections, &
636 fp_section, input_file, qmmm_section, qmmmx_section, root_section, subsys_section, &
637 wrk_section
638 TYPE(timer_env_type), POINTER :: timer_env
639
640 cpassert(ASSOCIATED(input_declaration))
641 NULLIFY (para_env, force_env, timer_env, mp_perf_env, globenv, meta_env, &
642 fp_env, eip_env, pwdft_env, mixed_env, qs_env, qmmm_env, embed_env)
643 new_env_id = -1
644 IF (PRESENT(mpi_comm)) THEN
645 ALLOCATE (para_env)
646 para_env = mpi_comm
647 ELSE
648 para_env => default_para_env
649 CALL para_env%retain()
650 END IF
651
652 CALL timeset(routinen, handle)
653
654 CALL m_getcwd(old_dir)
655 wdir = old_dir
656 IF (PRESENT(work_dir)) THEN
657 IF (work_dir /= " ") THEN
658 CALL m_chdir(work_dir, ierr2)
659 IF (ierr2 /= 0) THEN
660 IF (PRESENT(ierr)) ierr = ierr2
661 RETURN
662 END IF
663 wdir = work_dir
664 END IF
665 END IF
666
667 IF (PRESENT(output_unit)) THEN
668 unit_nr = output_unit
669 ELSE
670 IF (para_env%is_source()) THEN
671 IF (output_path == "__STD_OUT__") THEN
672 unit_nr = default_output_unit
673 ELSE
674 CALL open_file(file_name=output_path, &
675 file_status="UNKNOWN", &
676 file_action="WRITE", &
677 file_position="APPEND", &
678 unit_number=unit_nr)
679 END IF
680 ELSE
681 unit_nr = -1
682 END IF
683 END IF
684
685 my_owns_out_unit = unit_nr /= default_output_unit
686 IF (PRESENT(owns_out_unit)) my_owns_out_unit = owns_out_unit
687 CALL globenv_create(globenv)
688 CALL cp2k_init(para_env, output_unit=unit_nr, globenv=globenv, input_file_name=input_path, &
689 wdir=wdir)
690 logger => cp_get_default_logger()
691 ! warning this is dangerous, I did not check that all the subfunctions
692 ! support it, the program might crash upon error
693
694 NULLIFY (input_file)
695 IF (PRESENT(input)) input_file => input
696 IF (.NOT. ASSOCIATED(input_file)) THEN
697 IF (PRESENT(initial_variables)) THEN
698 input_file => read_input(input_declaration, input_path, initial_variables, para_env=para_env)
699 ELSE
700 input_file => read_input(input_declaration, input_path, empty_initial_variables, para_env=para_env)
701 END IF
702 ELSE
703 CALL section_vals_retain(input_file)
704 END IF
705
706 CALL check_cp2k_input(input_declaration, input_file, para_env=para_env, output_unit=unit_nr)
707
708 root_section => input_file
709 CALL section_vals_retain(root_section)
710
711 IF (n_f_envs + 1 > SIZE(f_envs)) THEN
712 f_envs_old => f_envs
713 ALLOCATE (f_envs(n_f_envs + 10))
714 DO i = 1, n_f_envs
715 f_envs(i)%f_env => f_envs_old(i)%f_env
716 END DO
717 DO i = n_f_envs + 1, SIZE(f_envs)
718 NULLIFY (f_envs(i)%f_env)
719 END DO
720 DEALLOCATE (f_envs_old)
721 END IF
722
723 CALL cp2k_read(root_section, para_env, globenv)
724
725 CALL cp2k_setup(root_section, para_env, globenv)
726 ! Group Distribution
727 ALLOCATE (group_distribution(0:para_env%num_pe - 1))
728 group_distribution = 0
729 lgroup_distribution => group_distribution
730 ! Setup all possible force_env
731 force_env_sections => section_vals_get_subs_vals(root_section, "FORCE_EVAL")
732 CALL section_vals_val_get(root_section, "MULTIPLE_FORCE_EVALS%MULTIPLE_SUBSYS", &
733 l_val=multiple_subsys)
734 CALL multiple_fe_list(force_env_sections, root_section, i_force_eval, nforce_eval)
735 ! Enforce the deletion of the subsys (unless not explicitly required)
736 IF (.NOT. multiple_subsys) THEN
737 DO iforce_eval = 2, nforce_eval
738 wrk_section => section_vals_get_subs_vals(force_env_sections, "SUBSYS", &
739 i_rep_section=i_force_eval(iforce_eval))
740 CALL section_vals_remove_values(wrk_section)
741 END DO
742 END IF
743 nsubforce_size = nforce_eval - 1
744 use_multiple_para_env = .false.
745 use_motion_section = .true.
746 DO iforce_eval = 1, nforce_eval
747 NULLIFY (force_env_section, my_force_env, subsys_section)
748 ! Reference subsys from the first ordered force_eval
749 IF (.NOT. multiple_subsys) THEN
750 subsys_section => section_vals_get_subs_vals(force_env_sections, "SUBSYS", &
751 i_rep_section=i_force_eval(1))
752 END IF
753 ! Handling para_env in case of multiple force_eval
754 IF (use_multiple_para_env) THEN
755 ! Check that the order of the force_eval is the correct one
756 CALL section_vals_val_get(force_env_sections, "METHOD", i_val=method_name_id, &
757 i_rep_section=i_force_eval(1))
758 IF ((method_name_id /= do_mixed) .AND. (method_name_id /= do_embed)) &
759 CALL cp_abort(__location__, &
760 "In case of multiple force_eval the MAIN force_eval (the first in the list of FORCE_EVAL_ORDER or "// &
761 "the one omitted from that order list) must be a MIXED_ENV type calculation. Please check your "// &
762 "input file and possibly correct the MULTIPLE_FORCE_EVAL%FORCE_EVAL_ORDER. ")
763
764 IF (method_name_id == do_mixed) THEN
765 check = ASSOCIATED(force_env%mixed_env%sub_para_env)
766 cpassert(check)
767 ngroups = force_env%mixed_env%ngroups
768 my_group = lgroup_distribution(para_env%mepos)
769 isubforce_eval = iforce_eval - 1
770 ! If task not allocated on this procs skip setup..
771 IF (modulo(isubforce_eval - 1, ngroups) /= my_group) cycle
772 my_para_env => force_env%mixed_env%sub_para_env(my_group + 1)%para_env
773 my_logger => force_env%mixed_env%sub_logger(my_group + 1)%p
775 CALL cp_add_default_logger(my_logger)
776 END IF
777 IF (method_name_id == do_embed) THEN
778 check = ASSOCIATED(force_env%embed_env%sub_para_env)
779 cpassert(check)
780 ngroups = force_env%embed_env%ngroups
781 my_group = lgroup_distribution(para_env%mepos)
782 isubforce_eval = iforce_eval - 1
783 ! If task not allocated on this procs skip setup..
784 IF (modulo(isubforce_eval - 1, ngroups) /= my_group) cycle
785 my_para_env => force_env%embed_env%sub_para_env(my_group + 1)%para_env
786 my_logger => force_env%embed_env%sub_logger(my_group + 1)%p
788 CALL cp_add_default_logger(my_logger)
789 END IF
790 ELSE
791 my_para_env => para_env
792 END IF
793
794 ! Initialize force_env_section
795 ! No need to allocate one more force_env_section if only 1 force_eval
796 ! is provided.. this is in order to save memory..
797 IF (nforce_eval > 1) THEN
798 CALL section_vals_duplicate(force_env_sections, force_env_section, &
799 i_force_eval(iforce_eval), i_force_eval(iforce_eval))
800 IF (iforce_eval /= 1) use_motion_section = .false.
801 ELSE
802 force_env_section => force_env_sections
803 use_motion_section = .true.
804 END IF
805 CALL section_vals_val_get(force_env_section, "METHOD", i_val=method_name_id)
806
807 IF (method_name_id == do_qmmm) THEN
808 qmmmx_section => section_vals_get_subs_vals(force_env_section, "QMMM%FORCE_MIXING")
809 CALL section_vals_get(qmmmx_section, explicit=do_qmmm_force_mixing)
810 IF (do_qmmm_force_mixing) &
811 method_name_id = do_qmmmx ! QMMM Force-Mixing has its own (hidden) method_id
812 END IF
813
814 SELECT CASE (method_name_id)
815 CASE (do_fist)
816 CALL fist_create_force_env(my_force_env, root_section, my_para_env, globenv, &
817 force_env_section=force_env_section, subsys_section=subsys_section, &
818 use_motion_section=use_motion_section)
819
820 CASE (do_qs)
821 ALLOCATE (qs_env)
822 CALL qs_env_create(qs_env, globenv)
823 CALL qs_init(qs_env, my_para_env, root_section, globenv=globenv, force_env_section=force_env_section, &
824 subsys_section=subsys_section, use_motion_section=use_motion_section)
825 CALL force_env_create(my_force_env, root_section, qs_env=qs_env, para_env=my_para_env, globenv=globenv, &
826 force_env_section=force_env_section)
827
828 CASE (do_qmmm)
829 qmmm_section => section_vals_get_subs_vals(force_env_section, "QMMM")
830 ALLOCATE (qmmm_env)
831 CALL qmmm_env_create(qmmm_env, root_section, my_para_env, globenv, &
832 force_env_section, qmmm_section, subsys_section, use_motion_section)
833 CALL force_env_create(my_force_env, root_section, qmmm_env=qmmm_env, para_env=my_para_env, &
834 globenv=globenv, force_env_section=force_env_section)
835
836 CASE (do_qmmmx)
837 ALLOCATE (qmmmx_env)
838 CALL qmmmx_env_create(qmmmx_env, root_section, my_para_env, globenv, &
839 force_env_section, subsys_section, use_motion_section)
840 CALL force_env_create(my_force_env, root_section, qmmmx_env=qmmmx_env, para_env=my_para_env, &
841 globenv=globenv, force_env_section=force_env_section)
842
843 CASE (do_eip)
844 ALLOCATE (eip_env)
845 CALL eip_env_create(eip_env)
846 CALL eip_init(eip_env, root_section, my_para_env, force_env_section=force_env_section, &
847 subsys_section=subsys_section)
848 CALL force_env_create(my_force_env, root_section, eip_env=eip_env, para_env=my_para_env, &
849 globenv=globenv, force_env_section=force_env_section)
850
851 CASE (do_sirius)
852 IF (.NOT. cp_sirius_is_initialized()) THEN
853 IF (unit_nr > 0) WRITE (unit=unit_nr, fmt="(T2,A)", advance="NO") "SIRIUS| "
854 CALL cp_sirius_init()
855 END IF
856 ALLOCATE (pwdft_env)
857 CALL pwdft_env_create(pwdft_env)
858 CALL pwdft_init(pwdft_env, root_section, my_para_env, force_env_section=force_env_section, &
859 subsys_section=subsys_section, use_motion_section=use_motion_section)
860 CALL force_env_create(my_force_env, root_section, pwdft_env=pwdft_env, para_env=my_para_env, &
861 globenv=globenv, force_env_section=force_env_section)
862
863 CASE (do_mixed)
864 ALLOCATE (mixed_env)
865 CALL mixed_create_force_env(mixed_env, root_section, my_para_env, &
866 force_env_section=force_env_section, n_subforce_eval=nsubforce_size, &
867 use_motion_section=use_motion_section)
868 CALL force_env_create(my_force_env, root_section, mixed_env=mixed_env, para_env=my_para_env, &
869 globenv=globenv, force_env_section=force_env_section)
870 !TODO: the sub_force_envs should really be created via recursion
871 use_multiple_para_env = .true.
872 CALL cp_add_default_logger(logger) ! just to get the logger swapping started
873 lgroup_distribution => my_force_env%mixed_env%group_distribution
874
875 CASE (do_embed)
876 ALLOCATE (embed_env)
877 CALL embed_create_force_env(embed_env, root_section, my_para_env, &
878 force_env_section=force_env_section, n_subforce_eval=nsubforce_size, &
879 use_motion_section=use_motion_section)
880 CALL force_env_create(my_force_env, root_section, embed_env=embed_env, para_env=my_para_env, &
881 globenv=globenv, force_env_section=force_env_section)
882 !TODO: the sub_force_envs should really be created via recursion
883 use_multiple_para_env = .true.
884 CALL cp_add_default_logger(logger) ! just to get the logger swapping started
885 lgroup_distribution => my_force_env%embed_env%group_distribution
886
887 CASE (do_nnp)
888 ALLOCATE (nnp_env)
889 CALL nnp_init(nnp_env, root_section, my_para_env, force_env_section=force_env_section, &
890 subsys_section=subsys_section, use_motion_section=use_motion_section)
891 CALL force_env_create(my_force_env, root_section, nnp_env=nnp_env, para_env=my_para_env, &
892 globenv=globenv, force_env_section=force_env_section)
893
894 CASE (do_ipi)
895 ALLOCATE (ipi_env)
896 CALL ipi_init(ipi_env, root_section, my_para_env, force_env_section=force_env_section, &
897 subsys_section=subsys_section)
898 CALL force_env_create(my_force_env, root_section, ipi_env=ipi_env, para_env=my_para_env, &
899 globenv=globenv, force_env_section=force_env_section)
900
901 CASE DEFAULT
902 CALL create_force_eval_section(section)
903 keyword => section_get_keyword(section, "METHOD")
904 CALL keyword_get(keyword, enum=enum)
905 CALL cp_abort(__location__, &
906 "Invalid METHOD <"//trim(enum_i2c(enum, method_name_id))// &
907 "> was specified, ")
908 CALL section_release(section)
909 END SELECT
910
911 NULLIFY (meta_env, fp_env)
912 IF (use_motion_section) THEN
913 ! Metadynamics Setup
914 fe_section => section_vals_get_subs_vals(root_section, "MOTION%FREE_ENERGY")
915 CALL metadyn_read(meta_env, my_force_env, root_section, my_para_env, fe_section)
916 CALL force_env_set(my_force_env, meta_env=meta_env)
917 ! Flexible Partition Setup
918 fp_section => section_vals_get_subs_vals(root_section, "MOTION%FLEXIBLE_PARTITIONING")
919 ALLOCATE (fp_env)
920 CALL fp_env_create(fp_env)
921 CALL fp_env_read(fp_env, fp_section)
922 CALL fp_env_write(fp_env, fp_section)
923 CALL force_env_set(my_force_env, fp_env=fp_env)
924 END IF
925 ! Handle multiple force_eval
926 IF (nforce_eval > 1 .AND. iforce_eval == 1) THEN
927 ALLOCATE (my_force_env%sub_force_env(nsubforce_size))
928 ! Nullify subforce_env
929 DO k = 1, nsubforce_size
930 NULLIFY (my_force_env%sub_force_env(k)%force_env)
931 END DO
932 END IF
933 ! Reference the right force_env
934 IF (iforce_eval == 1) THEN
935 force_env => my_force_env
936 ELSE
937 force_env%sub_force_env(iforce_eval - 1)%force_env => my_force_env
938 END IF
939 ! Multiple para env for sub_force_eval
940 IF (.NOT. use_multiple_para_env) THEN
941 lgroup_distribution = iforce_eval
942 END IF
943 ! Release force_env_section
944 IF (nforce_eval > 1) CALL section_vals_release(force_env_section)
945 END DO
946 IF (use_multiple_para_env) &
948 DEALLOCATE (group_distribution)
949 DEALLOCATE (i_force_eval)
950 timer_env => get_timer_env()
952 CALL para_env%max(last_f_env_id)
953 last_f_env_id = last_f_env_id + 1
954 new_env_id = last_f_env_id
955 n_f_envs = n_f_envs + 1
956 CALL f_env_create(f_envs(n_f_envs)%f_env, logger=logger, &
957 timer_env=timer_env, mp_perf_env=mp_perf_env, force_env=force_env, &
958 id_nr=last_f_env_id, old_dir=old_dir)
959 CALL force_env_release(force_env)
960 CALL globenv_release(globenv)
961 CALL section_vals_release(root_section)
962 CALL mp_para_env_release(para_env)
963 CALL f_env_rm_defaults(f_envs(n_f_envs)%f_env, ierr=ierr)
964 CALL timestop(handle)
965
966 END SUBROUTINE create_force_env
967
968! **************************************************************************************************
969!> \brief deallocates the force_env with the given id
970!> \param env_id the id of the force_env to remove
971!> \param ierr will contain a number different from 0 if
972!> \param q_finalize ...
973!> \author fawzi
974!> \note
975!> The following routines need to be synchronized wrt. adding/removing
976!> of the default environments (logging, performance,error):
977!> environment:cp2k_init, environment:cp2k_finalize,
978!> f77_interface:f_env_add_defaults, f77_interface:f_env_rm_defaults,
979!> f77_interface:create_force_env, f77_interface:destroy_force_env
980! **************************************************************************************************
981 RECURSIVE SUBROUTINE destroy_force_env(env_id, ierr, q_finalize)
982 INTEGER, INTENT(in) :: env_id
983 INTEGER, INTENT(out) :: ierr
984 LOGICAL, INTENT(IN), OPTIONAL :: q_finalize
985
986 INTEGER :: env_pos, i
987 TYPE(f_env_type), POINTER :: f_env
988 TYPE(global_environment_type), POINTER :: globenv
989 TYPE(mp_para_env_type), POINTER :: para_env
990 TYPE(section_vals_type), POINTER :: root_section
991
992 NULLIFY (f_env)
993 CALL f_env_add_defaults(env_id, f_env)
994 env_pos = get_pos_of_env(env_id)
995 n_f_envs = n_f_envs - 1
996 DO i = env_pos, n_f_envs
997 f_envs(i)%f_env => f_envs(i + 1)%f_env
998 END DO
999 NULLIFY (f_envs(n_f_envs + 1)%f_env)
1000
1001 CALL force_env_get(f_env%force_env, globenv=globenv, &
1002 root_section=root_section, para_env=para_env)
1003
1004 cpassert(ASSOCIATED(globenv))
1005 NULLIFY (f_env%force_env%globenv)
1006 CALL f_env_dealloc(f_env)
1007 IF (PRESENT(q_finalize)) THEN
1008 CALL cp2k_finalize(root_section, para_env, globenv, f_env%old_path, q_finalize)
1009 ELSE
1010 CALL cp2k_finalize(root_section, para_env, globenv, f_env%old_path)
1011 END IF
1012 CALL section_vals_release(root_section)
1013 CALL globenv_release(globenv)
1014 DEALLOCATE (f_env)
1015 ierr = 0
1016 END SUBROUTINE destroy_force_env
1017
1018! **************************************************************************************************
1019!> \brief returns the number of atoms in the given force env
1020!> \param env_id id of the force_env
1021!> \param n_atom ...
1022!> \param ierr will return a number different from 0 if there was an error
1023!> \date 22.11.2010 (MK)
1024!> \author fawzi
1025! **************************************************************************************************
1026 SUBROUTINE get_natom(env_id, n_atom, ierr)
1027
1028 INTEGER, INTENT(IN) :: env_id
1029 INTEGER, INTENT(OUT) :: n_atom, ierr
1030
1031 TYPE(f_env_type), POINTER :: f_env
1032
1033 n_atom = 0
1034 NULLIFY (f_env)
1035 CALL f_env_add_defaults(env_id, f_env)
1036 n_atom = force_env_get_natom(f_env%force_env)
1037 CALL f_env_rm_defaults(f_env, ierr)
1038
1039 END SUBROUTINE get_natom
1040
1041! **************************************************************************************************
1042!> \brief returns the number of particles in the given force env
1043!> \param env_id id of the force_env
1044!> \param n_particle ...
1045!> \param ierr will return a number different from 0 if there was an error
1046!> \author Matthias Krack
1047!>
1048! **************************************************************************************************
1049 SUBROUTINE get_nparticle(env_id, n_particle, ierr)
1050
1051 INTEGER, INTENT(IN) :: env_id
1052 INTEGER, INTENT(OUT) :: n_particle, ierr
1053
1054 TYPE(f_env_type), POINTER :: f_env
1055
1056 n_particle = 0
1057 NULLIFY (f_env)
1058 CALL f_env_add_defaults(env_id, f_env)
1059 n_particle = force_env_get_nparticle(f_env%force_env)
1060 CALL f_env_rm_defaults(f_env, ierr)
1061
1062 END SUBROUTINE get_nparticle
1063
1064! **************************************************************************************************
1065!> \brief gets a cell
1066!> \param env_id id of the force_env
1067!> \param cell the array with the cell matrix
1068!> \param per periodicity
1069!> \param ierr will return a number different from 0 if there was an error
1070!> \author Joost VandeVondele
1071! **************************************************************************************************
1072 SUBROUTINE get_cell(env_id, cell, per, ierr)
1073
1074 INTEGER, INTENT(IN) :: env_id
1075 REAL(kind=dp), DIMENSION(3, 3) :: cell
1076 INTEGER, DIMENSION(3), OPTIONAL :: per
1077 INTEGER, INTENT(OUT) :: ierr
1078
1079 TYPE(cell_type), POINTER :: cell_full
1080 TYPE(f_env_type), POINTER :: f_env
1081
1082 NULLIFY (f_env)
1083 CALL f_env_add_defaults(env_id, f_env)
1084 NULLIFY (cell_full)
1085 CALL force_env_get(f_env%force_env, cell=cell_full)
1086 cpassert(ASSOCIATED(cell_full))
1087 cell = cell_full%hmat
1088 IF (PRESENT(per)) per(:) = cell_full%perd(:)
1089 CALL f_env_rm_defaults(f_env, ierr)
1090
1091 END SUBROUTINE get_cell
1092
1093! **************************************************************************************************
1094!> \brief gets the qmmm cell
1095!> \param env_id id of the force_env
1096!> \param cell the array with the cell matrix
1097!> \param ierr will return a number different from 0 if there was an error
1098!> \author Holly Judge
1099! **************************************************************************************************
1100 SUBROUTINE get_qmmm_cell(env_id, cell, ierr)
1101
1102 INTEGER, INTENT(IN) :: env_id
1103 REAL(kind=dp), DIMENSION(3, 3) :: cell
1104 INTEGER, INTENT(OUT) :: ierr
1105
1106 TYPE(cell_type), POINTER :: cell_qmmm
1107 TYPE(f_env_type), POINTER :: f_env
1108 TYPE(qmmm_env_type), POINTER :: qmmm_env
1109
1110 NULLIFY (f_env)
1111 CALL f_env_add_defaults(env_id, f_env)
1112 NULLIFY (cell_qmmm)
1113 CALL force_env_get(f_env%force_env, qmmm_env=qmmm_env)
1114 CALL get_qs_env(qmmm_env%qs_env, cell=cell_qmmm)
1115 cpassert(ASSOCIATED(cell_qmmm))
1116 cell = cell_qmmm%hmat
1117 CALL f_env_rm_defaults(f_env, ierr)
1118
1119 END SUBROUTINE get_qmmm_cell
1120
1121! **************************************************************************************************
1122!> \brief gets a result from CP2K that is a real 1D array
1123!> \param env_id id of the force_env
1124!> \param description the tag of the result
1125!> \param N ...
1126!> \param RESULT ...
1127!> \param res_exist ...
1128!> \param ierr will return a number different from 0 if there was an error
1129!> \author Joost VandeVondele
1130! **************************************************************************************************
1131 SUBROUTINE get_result_r1(env_id, description, N, RESULT, res_exist, ierr)
1132 INTEGER :: env_id
1133 CHARACTER(LEN=default_string_length) :: description
1134 INTEGER :: n
1135 REAL(kind=dp), DIMENSION(1:N) :: result
1136 LOGICAL, OPTIONAL :: res_exist
1137 INTEGER :: ierr
1138
1139 INTEGER :: nres
1140 LOGICAL :: exist_res
1141 TYPE(cp_result_type), POINTER :: results
1142 TYPE(cp_subsys_type), POINTER :: subsys
1143 TYPE(f_env_type), POINTER :: f_env
1144
1145 NULLIFY (f_env, subsys, results)
1146 CALL f_env_add_defaults(env_id, f_env)
1147
1148 CALL force_env_get(f_env%force_env, subsys=subsys)
1149 CALL cp_subsys_get(subsys, results=results)
1150 ! first test for the result
1151 IF (PRESENT(res_exist)) THEN
1152 res_exist = test_for_result(results, description=description)
1153 exist_res = res_exist
1154 ELSE
1155 exist_res = .true.
1156 END IF
1157 ! if existing (or assuming the existence) read the results
1158 IF (exist_res) THEN
1159 CALL get_results(results, description=description, n_rep=nres)
1160 CALL get_results(results, description=description, values=result, nval=nres)
1161 END IF
1162
1163 CALL f_env_rm_defaults(f_env, ierr)
1164
1165 END SUBROUTINE get_result_r1
1166
1167! **************************************************************************************************
1168!> \brief gets the forces of the particles
1169!> \param env_id id of the force_env
1170!> \param frc the array where to write the forces
1171!> \param n_el number of positions (3*nparticle) just to check
1172!> \param ierr will return a number different from 0 if there was an error
1173!> \date 22.11.2010 (MK)
1174!> \author fawzi
1175! **************************************************************************************************
1176 SUBROUTINE get_force(env_id, frc, n_el, ierr)
1177
1178 INTEGER, INTENT(IN) :: env_id, n_el
1179 REAL(kind=dp), DIMENSION(1:n_el) :: frc
1180 INTEGER, INTENT(OUT) :: ierr
1181
1182 TYPE(f_env_type), POINTER :: f_env
1183
1184 NULLIFY (f_env)
1185 CALL f_env_add_defaults(env_id, f_env)
1186 CALL force_env_get_frc(f_env%force_env, frc, n_el)
1187 CALL f_env_rm_defaults(f_env, ierr)
1188
1189 END SUBROUTINE get_force
1190
1191! **************************************************************************************************
1192!> \brief gets the stress tensor
1193!> \param env_id id of the force_env
1194!> \param stress_tensor the array where to write the stress tensor
1195!> \param ierr will return a number different from 0 if there was an error
1196!> \author Ole Schuett
1197! **************************************************************************************************
1198 SUBROUTINE get_stress_tensor(env_id, stress_tensor, ierr)
1199
1200 INTEGER, INTENT(IN) :: env_id
1201 REAL(kind=dp), DIMENSION(3, 3), INTENT(OUT) :: stress_tensor
1202 INTEGER, INTENT(OUT) :: ierr
1203
1204 TYPE(cell_type), POINTER :: cell
1205 TYPE(cp_subsys_type), POINTER :: subsys
1206 TYPE(f_env_type), POINTER :: f_env
1207 TYPE(virial_type), POINTER :: virial
1208
1209 NULLIFY (f_env, subsys, virial, cell)
1210 stress_tensor(:, :) = 0.0_dp
1211
1212 CALL f_env_add_defaults(env_id, f_env)
1213 CALL force_env_get(f_env%force_env, subsys=subsys, cell=cell)
1214 CALL cp_subsys_get(subsys, virial=virial)
1215 IF (virial%pv_availability) THEN
1216 stress_tensor(:, :) = virial%pv_virial(:, :)/cell%deth
1217 END IF
1218 CALL f_env_rm_defaults(f_env, ierr)
1219
1220 END SUBROUTINE get_stress_tensor
1221
1222! **************************************************************************************************
1223!> \brief gets the positions of the particles
1224!> \param env_id id of the force_env
1225!> \param pos the array where to write the positions
1226!> \param n_el number of positions (3*nparticle) just to check
1227!> \param ierr will return a number different from 0 if there was an error
1228!> \date 22.11.2010 (MK)
1229!> \author fawzi
1230! **************************************************************************************************
1231 SUBROUTINE get_pos(env_id, pos, n_el, ierr)
1232
1233 INTEGER, INTENT(IN) :: env_id, n_el
1234 REAL(kind=dp), DIMENSION(1:n_el) :: pos
1235 INTEGER, INTENT(OUT) :: ierr
1236
1237 TYPE(f_env_type), POINTER :: f_env
1238
1239 NULLIFY (f_env)
1240 CALL f_env_add_defaults(env_id, f_env)
1241 CALL force_env_get_pos(f_env%force_env, pos, n_el)
1242 CALL f_env_rm_defaults(f_env, ierr)
1243
1244 END SUBROUTINE get_pos
1245
1246! **************************************************************************************************
1247!> \brief gets the velocities of the particles
1248!> \param env_id id of the force_env
1249!> \param vel the array where to write the velocities
1250!> \param n_el number of velocities (3*nparticle) just to check
1251!> \param ierr will return a number different from 0 if there was an error
1252!> \author fawzi
1253!> date 22.11.2010 (MK)
1254! **************************************************************************************************
1255 SUBROUTINE get_vel(env_id, vel, n_el, ierr)
1256
1257 INTEGER, INTENT(IN) :: env_id, n_el
1258 REAL(kind=dp), DIMENSION(1:n_el) :: vel
1259 INTEGER, INTENT(OUT) :: ierr
1260
1261 TYPE(f_env_type), POINTER :: f_env
1262
1263 NULLIFY (f_env)
1264 CALL f_env_add_defaults(env_id, f_env)
1265 CALL force_env_get_vel(f_env%force_env, vel, n_el)
1266 CALL f_env_rm_defaults(f_env, ierr)
1267
1268 END SUBROUTINE get_vel
1269
1270! **************************************************************************************************
1271!> \brief sets a new cell
1272!> \param env_id id of the force_env
1273!> \param new_cell the array with the cell matrix
1274!> \param ierr will return a number different from 0 if there was an error
1275!> \author Joost VandeVondele
1276! **************************************************************************************************
1277 SUBROUTINE set_cell(env_id, new_cell, ierr)
1278
1279 INTEGER, INTENT(IN) :: env_id
1280 REAL(kind=dp), DIMENSION(3, 3) :: new_cell
1281 INTEGER, INTENT(OUT) :: ierr
1282
1283 TYPE(cell_type), POINTER :: cell
1284 TYPE(cp_subsys_type), POINTER :: subsys
1285 TYPE(f_env_type), POINTER :: f_env
1286
1287 NULLIFY (f_env, cell, subsys)
1288 CALL f_env_add_defaults(env_id, f_env)
1289 NULLIFY (cell)
1290 CALL force_env_get(f_env%force_env, cell=cell)
1291 cpassert(ASSOCIATED(cell))
1292 cell%hmat = new_cell
1293 CALL init_cell(cell)
1294 CALL force_env_get(f_env%force_env, subsys=subsys)
1295 CALL cp_subsys_set(subsys, cell=cell)
1296 CALL f_env_rm_defaults(f_env, ierr)
1297
1298 END SUBROUTINE set_cell
1299
1300! **************************************************************************************************
1301!> \brief sets the positions of the particles
1302!> \param env_id id of the force_env
1303!> \param new_pos the array with the new positions
1304!> \param n_el number of positions (3*nparticle) just to check
1305!> \param ierr will return a number different from 0 if there was an error
1306!> \date 22.11.2010 updated (MK)
1307!> \author fawzi
1308! **************************************************************************************************
1309 SUBROUTINE set_pos(env_id, new_pos, n_el, ierr)
1310
1311 INTEGER, INTENT(IN) :: env_id, n_el
1312 REAL(kind=dp), DIMENSION(1:n_el) :: new_pos
1313 INTEGER, INTENT(OUT) :: ierr
1314
1315 TYPE(cp_subsys_type), POINTER :: subsys
1316 TYPE(f_env_type), POINTER :: f_env
1317
1318 NULLIFY (f_env)
1319 CALL f_env_add_defaults(env_id, f_env)
1320 NULLIFY (subsys)
1321 CALL force_env_get(f_env%force_env, subsys=subsys)
1322 CALL unpack_subsys_particles(subsys=subsys, r=new_pos)
1323 CALL f_env_rm_defaults(f_env, ierr)
1324
1325 END SUBROUTINE set_pos
1326
1327! **************************************************************************************************
1328!> \brief sets the velocities of the particles
1329!> \param env_id id of the force_env
1330!> \param new_vel the array with the new velocities
1331!> \param n_el number of velocities (3*nparticle) just to check
1332!> \param ierr will return a number different from 0 if there was an error
1333!> \date 22.11.2010 updated (MK)
1334!> \author fawzi
1335! **************************************************************************************************
1336 SUBROUTINE set_vel(env_id, new_vel, n_el, ierr)
1337
1338 INTEGER, INTENT(IN) :: env_id, n_el
1339 REAL(kind=dp), DIMENSION(1:n_el) :: new_vel
1340 INTEGER, INTENT(OUT) :: ierr
1341
1342 TYPE(cp_subsys_type), POINTER :: subsys
1343 TYPE(f_env_type), POINTER :: f_env
1344
1345 NULLIFY (f_env)
1346 CALL f_env_add_defaults(env_id, f_env)
1347 NULLIFY (subsys)
1348 CALL force_env_get(f_env%force_env, subsys=subsys)
1349 CALL unpack_subsys_particles(subsys=subsys, v=new_vel)
1350 CALL f_env_rm_defaults(f_env, ierr)
1351
1352 END SUBROUTINE set_vel
1353
1354! **************************************************************************************************
1355!> \brief updates the energy and the forces of given force_env
1356!> \param env_id id of the force_env that you want to update
1357!> \param calc_force if the forces should be updated, if false the forces
1358!> might be wrong.
1359!> \param ierr will return a number different from 0 if there was an error
1360!> \author fawzi
1361! **************************************************************************************************
1362 RECURSIVE SUBROUTINE calc_energy_force(env_id, calc_force, ierr)
1363
1364 INTEGER, INTENT(in) :: env_id
1365 LOGICAL, INTENT(in) :: calc_force
1366 INTEGER, INTENT(out) :: ierr
1367
1368 TYPE(cp_logger_type), POINTER :: logger
1369 TYPE(f_env_type), POINTER :: f_env
1370
1371 NULLIFY (f_env)
1372 CALL f_env_add_defaults(env_id, f_env)
1373 logger => cp_get_default_logger()
1374 CALL cp_iterate(logger%iter_info) ! add one to the iteration count
1376 CALL f_env_rm_defaults(f_env, ierr)
1377
1378 END SUBROUTINE calc_energy_force
1379
1380! **************************************************************************************************
1381!> \brief returns the energy of the last configuration calculated
1382!> \param env_id id of the force_env that you want to update
1383!> \param e_pot the potential energy of the system
1384!> \param ierr will return a number different from 0 if there was an error
1385!> \author fawzi
1386! **************************************************************************************************
1387 SUBROUTINE get_energy(env_id, e_pot, ierr)
1388
1389 INTEGER, INTENT(in) :: env_id
1390 REAL(kind=dp), INTENT(out) :: e_pot
1391 INTEGER, INTENT(out) :: ierr
1392
1393 TYPE(f_env_type), POINTER :: f_env
1394
1395 NULLIFY (f_env)
1396 CALL f_env_add_defaults(env_id, f_env)
1397 CALL force_env_get(f_env%force_env, potential_energy=e_pot)
1398 CALL f_env_rm_defaults(f_env, ierr)
1399
1400 END SUBROUTINE get_energy
1401
1402! **************************************************************************************************
1403!> \brief returns the energy of the configuration given by the positions
1404!> passed as argument
1405!> \param env_id id of the force_env that you want to update
1406!> \param pos array with the positions
1407!> \param n_el number of elements in pos (3*natom)
1408!> \param e_pot the potential energy of the system
1409!> \param ierr will return a number different from 0 if there was an error
1410!> \author fawzi
1411!> \note
1412!> utility call
1413! **************************************************************************************************
1414 RECURSIVE SUBROUTINE calc_energy(env_id, pos, n_el, e_pot, ierr)
1415
1416 INTEGER, INTENT(IN) :: env_id, n_el
1417 REAL(kind=dp), DIMENSION(1:n_el), INTENT(IN) :: pos
1418 REAL(kind=dp), INTENT(OUT) :: e_pot
1419 INTEGER, INTENT(OUT) :: ierr
1420
1421 REAL(kind=dp), DIMENSION(1) :: dummy_f
1422
1423 CALL calc_force(env_id, pos, n_el, e_pot, dummy_f, 0, ierr)
1424
1425 END SUBROUTINE calc_energy
1426
1427! **************************************************************************************************
1428!> \brief returns the energy of the configuration given by the positions
1429!> passed as argument
1430!> \param env_id id of the force_env that you want to update
1431!> \param pos array with the positions
1432!> \param n_el_pos number of elements in pos (3*natom)
1433!> \param e_pot the potential energy of the system
1434!> \param force array that will contain the forces
1435!> \param n_el_force number of elements in force (3*natom). If 0 the
1436!> forces are not calculated
1437!> \param ierr will return a number different from 0 if there was an error
1438!> \author fawzi
1439!> \note
1440!> utility call, but actually it could be a better and more efficient
1441!> interface to connect to other codes if cp2k would be deeply
1442!> refactored
1443! **************************************************************************************************
1444 RECURSIVE SUBROUTINE calc_force(env_id, pos, n_el_pos, e_pot, force, n_el_force, ierr)
1445
1446 INTEGER, INTENT(in) :: env_id, n_el_pos
1447 REAL(kind=dp), DIMENSION(1:n_el_pos), INTENT(in) :: pos
1448 REAL(kind=dp), INTENT(out) :: e_pot
1449 INTEGER, INTENT(in) :: n_el_force
1450 REAL(kind=dp), DIMENSION(1:n_el_force), &
1451 INTENT(inout) :: force
1452 INTEGER, INTENT(out) :: ierr
1453
1454 LOGICAL :: calc_f
1455
1456 calc_f = (n_el_force /= 0)
1457 CALL set_pos(env_id, pos, n_el_pos, ierr)
1458 IF (ierr == 0) CALL calc_energy_force(env_id, calc_f, ierr)
1459 IF (ierr == 0) CALL get_energy(env_id, e_pot, ierr)
1460 IF (calc_f .AND. (ierr == 0)) CALL get_force(env_id, force, n_el_force, ierr)
1461
1462 END SUBROUTINE calc_force
1463
1464! **************************************************************************************************
1465!> \brief performs a check of the input
1466!> \param input_declaration ...
1467!> \param input_file_path the path of the input file to check
1468!> \param output_file_path path of the output file (to which it is appended)
1469!> if it is "__STD_OUT__" the default_output_unit is used
1470!> \param echo_input if the parsed input should be written out with all the
1471!> defaults made explicit
1472!> \param mpi_comm the mpi communicator (if not given it uses the default
1473!> one)
1474!> \param initial_variables key-value list of initial preprocessor variables
1475!> \param ierr error control, if different from 0 there was an error
1476!> \author fawzi
1477! **************************************************************************************************
1478 SUBROUTINE check_input(input_declaration, input_file_path, output_file_path, &
1479 echo_input, mpi_comm, initial_variables, ierr)
1480 TYPE(section_type), POINTER :: input_declaration
1481 CHARACTER(len=*), INTENT(in) :: input_file_path, output_file_path
1482 LOGICAL, INTENT(in), OPTIONAL :: echo_input
1483 TYPE(mp_comm_type), INTENT(in), OPTIONAL :: mpi_comm
1484 CHARACTER(len=default_path_length), &
1485 DIMENSION(:, :), INTENT(IN) :: initial_variables
1486 INTEGER, INTENT(out) :: ierr
1487
1488 INTEGER :: unit_nr
1489 LOGICAL :: my_echo_input
1490 TYPE(cp_logger_type), POINTER :: logger
1491 TYPE(mp_para_env_type), POINTER :: para_env
1492 TYPE(section_vals_type), POINTER :: input_file
1493
1494 my_echo_input = .false.
1495 IF (PRESENT(echo_input)) my_echo_input = echo_input
1496
1497 IF (PRESENT(mpi_comm)) THEN
1498 ALLOCATE (para_env)
1499 para_env = mpi_comm
1500 ELSE
1501 para_env => default_para_env
1502 CALL para_env%retain()
1503 END IF
1504 IF (para_env%is_source()) THEN
1505 IF (output_file_path == "__STD_OUT__") THEN
1506 unit_nr = default_output_unit
1507 ELSE
1508 CALL open_file(file_name=output_file_path, file_status="UNKNOWN", &
1509 file_action="WRITE", file_position="APPEND", &
1510 unit_number=unit_nr)
1511 END IF
1512 ELSE
1513 unit_nr = -1
1514 END IF
1515
1516 NULLIFY (logger)
1517 CALL cp_logger_create(logger, para_env=para_env, &
1518 default_global_unit_nr=unit_nr, &
1519 close_global_unit_on_dealloc=.false.)
1520 CALL cp_add_default_logger(logger)
1521 CALL cp_logger_release(logger)
1522
1523 input_file => read_input(input_declaration, input_file_path, initial_variables=initial_variables, &
1524 para_env=para_env)
1525 CALL check_cp2k_input(input_declaration, input_file, para_env=para_env, output_unit=unit_nr)
1526 IF (my_echo_input .AND. (unit_nr > 0)) THEN
1527 CALL section_vals_write(input_file, &
1528 unit_nr=unit_nr, &
1529 hide_root=.true., &
1530 hide_defaults=.false.)
1531 END IF
1532 CALL section_vals_release(input_file)
1533
1534 CALL cp_logger_release(logger)
1535 CALL mp_para_env_release(para_env)
1536 ierr = 0
1538
1539 END SUBROUTINE check_input
1540
1541END MODULE f77_interface
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
void grid_library_finalize(void)
Finalizes the grid library.
void grid_library_init(void)
Initializes the grid library.
Central dispatch for basic hooks.
Definition base_hooks.F:12
procedure(cp_warn_interface), pointer, public cp_warn_hook
Definition base_hooks.F:59
subroutine, public cp_abort(location, message)
Terminate the program.
Definition base_hooks.F:73
subroutine, public timeset(routinen, handle)
Start timer.
Definition base_hooks.F:127
procedure(cp_abort_interface), pointer, public cp_abort_hook
Definition base_hooks.F:58
procedure(timeset_interface), pointer, public timeset_hook
Definition base_hooks.F:61
subroutine, public timestop(handle)
Stop timer.
Definition base_hooks.F:143
procedure(timestop_interface), pointer, public timestop_hook
Definition base_hooks.F:62
collects all references to literature in CP2K as new algorithms / method are included from literature...
subroutine, public add_all_references()
adds references that can later be cited / printed using the key
Handles all functions related to the CELL.
subroutine, public init_cell(cell, hmat, periodic)
Initialise/readjust a simulation cell after hmat has been changed.
Handles all functions related to the CELL.
Definition cell_types.F:15
some minimal info about CP2K, including its version and license
Definition cp2k_info.F:20
subroutine, public get_runtime_info()
...
Definition cp2k_info.F:370
subroutine, public cp_dlaf_finalize()
Finalize DLA-Future and pika runtime.
subroutine, public cp_dlaf_free_all_grids()
Free all DLA-Future grids.
Module that contains the routines for error handling.
subroutine, public cp_error_handling_setup()
Registers handlers with base_hooks.F.
Utility routines to open and close files. Tracking of preconnections.
Definition cp_files.F:16
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
Definition cp_files.F:311
subroutine, public init_preconnection_list()
Allocate and initialise the list of preconnected units.
Definition cp_files.F:276
various routines to log and control the output. The idea is that decisions about where to log should ...
subroutine, public cp_rm_default_logger()
the cousin of cp_add_default_logger, decrements the stack, so that the default logger is what it has ...
subroutine, public cp_logger_release(logger)
releases this logger
subroutine, public cp_logger_create(logger, para_env, print_level, default_global_unit_nr, default_local_unit_nr, global_filename, local_filename, close_global_unit_on_dealloc, iter_info, close_local_unit_on_dealloc, suffix, template_logger)
initializes a logger
integer function, public cp_default_logger_stack_size()
...
integer, parameter, public cp_failure_level
subroutine, public cp_logger_retain(logger)
retains the given logger (to be called to keep a shared copy of the logger)
subroutine, public cp_add_default_logger(logger)
adds a default logger. MUST be called before logging occours
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_openpmd_output_finalize()
Close all outputs.
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
subroutine, public cp_iterate(iteration_info, last, iter_nr, increment, iter_nr_out)
adds one to the actual iteration
set of type/routines to handle the storage of results in force_envs
logical function, public test_for_result(results, description)
test for a certain result in the result_list
set of type/routines to handle the storage of results in force_envs
types that represent a subsys, i.e. a part of the system
subroutine, public cp_subsys_set(subsys, atomic_kinds, particles, local_particles, molecules, molecule_kinds, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, results, cell, cell_ref, use_ref_cell)
sets various propreties of the subsys
subroutine, public unpack_subsys_particles(subsys, f, r, s, v, fscale, cell)
Unpack components of a subsystem particle sets into a single vector.
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
subroutine, public dbm_library_init()
Initialize DBM library.
Definition dbm_api.F:1482
subroutine, public dbm_library_finalize()
Finalize DBM library.
Definition dbm_api.F:1496
The environment for the empirical interatomic potential methods.
subroutine, public eip_env_create(eip_env)
Creates the eip environment.
Methods and functions on the EIP environment.
subroutine, public eip_init(eip_env, root_section, para_env, force_env_section, subsys_section)
Initialize the eip environment.
Main force create for embedding.
Definition embed_main.F:12
subroutine, public embed_create_force_env(embed_env, root_section, para_env, force_env_section, n_subforce_eval, use_motion_section)
Controls program flow for embedded calculations.
Definition embed_main.F:52
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_get_from_id(f_env_id, f_env)
...
subroutine, public set_vel(env_id, new_vel, n_el, ierr)
sets the velocities of the particles
subroutine, public get_nparticle(env_id, n_particle, ierr)
returns the number of particles in the given force env
subroutine, public get_natom(env_id, n_atom, ierr)
returns the number of atoms in the given force env
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 ...
subroutine, public get_cell(env_id, cell, per, ierr)
gets a cell
type(mp_para_env_type), pointer, save, public default_para_env
recursive subroutine, public calc_energy_force(env_id, calc_force, ierr)
updates the energy and the forces of given force_env
subroutine, public get_energy(env_id, e_pot, ierr)
returns the energy of the last configuration calculated
subroutine, public init_cp2k(init_mpi, ierr, mpi_comm)
initializes cp2k, needs to be called once before using any of the other functions when using cp2k as ...
subroutine, public get_qmmm_cell(env_id, cell, ierr)
gets the qmmm cell
subroutine, public get_pos(env_id, pos, n_el, ierr)
gets the positions of the particles
type(f_env_p_type), dimension(:), pointer, save f_envs
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...
recursive subroutine, public calc_energy(env_id, pos, n_el, e_pot, ierr)
returns the energy of the configuration given by the positions passed as argument
subroutine, public set_cell(env_id, new_cell, ierr)
sets a new cell
subroutine, public finalize_cp2k(finalize_mpi, ierr)
cleanup after you have finished using this interface
subroutine, public set_pos(env_id, new_pos, n_el, ierr)
sets the positions of the particles
subroutine, public get_stress_tensor(env_id, stress_tensor, ierr)
gets the stress tensor
subroutine, public check_input(input_declaration, input_file_path, output_file_path, echo_input, mpi_comm, initial_variables, ierr)
performs a check of the input
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...
subroutine, public get_force(env_id, frc, n_el, ierr)
gets the forces of the particles
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
perform classical molecular dynamics and path integral simulations
Definition fist_main.F:16
subroutine, public fist_create_force_env(force_env, root_section, para_env, globenv, qmmm, qmmm_env, force_env_section, subsys_section, use_motion_section, prev_subsys)
Controls program flow for classical MD and path-integrals.
Definition fist_main.F:66
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.
subroutine, public force_env_create(force_env, root_section, para_env, globenv, fist_env, qs_env, meta_env, sub_force_env, qmmm_env, qmmmx_env, eip_env, pwdft_env, force_env_section, mixed_env, embed_env, nnp_env, ipi_env)
creates and initializes a force environment
Interface for the force calculations.
integer function, public force_env_get_natom(force_env)
returns the number of atoms
subroutine, public force_env_get_vel(force_env, vel, n)
returns the particle velocities in a dimension(*) array
subroutine, public multiple_fe_list(force_env_sections, root_section, i_force_eval, nforce_eval)
returns the order of the multiple force_env
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
subroutine, public force_env_retain(force_env)
retains the given force env
subroutine, public force_env_get_pos(force_env, pos, n)
returns the particle positions in a dimension(*) array
subroutine, public force_env_set(force_env, meta_env, fp_env, force_env_section, method_name_id, additional_potential)
changes some attributes of the force_env
subroutine, public force_env_get_frc(force_env, frc, n)
returns the particle forces in a dimension(*) array
recursive subroutine, public force_env_release(force_env)
releases the given force env
integer function, public force_env_get_nparticle(force_env)
returns the number of particles in a force environment
types used in the flexible partitioning scheme
Definition fp_types.F:14
subroutine, public fp_env_write(fp_env, fp_section)
writes information concerning the fp_env to the output
Definition fp_types.F:140
subroutine, public fp_env_read(fp_env, fp_section)
reads the corresponding input section and stores it in the fp_env
Definition fp_types.F:97
pure subroutine, public fp_env_create(fp_env)
create retain release the flexible partitioning environment
Definition fp_types.F:66
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
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public do_nnp
integer, parameter, public do_qmmmx
integer, parameter, public do_eip
integer, parameter, public do_fist
integer, parameter, public do_qmmm
integer, parameter, public do_embed
integer, parameter, public do_sirius
integer, parameter, public do_qs
integer, parameter, public do_mixed
integer, parameter, public do_ipi
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 input structure for the FORCE_EVAL section of cp2k
subroutine, public create_force_eval_section(section)
creates the force_eval section
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
represents an enumeration, i.e. a mapping between integers and strings
character(len=default_string_length) function, public enum_i2c(enum, i)
maps an integer to a string
represents keywords in an input
subroutine, public keyword_get(keyword, names, usage, description, type_of_var, n_var, default_value, lone_keyword_value, repeats, enum, citations)
...
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
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 type(keyword_type) function, pointer, public section_get_keyword(section, keyword_name)
returns the requested keyword
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_duplicate(section_vals_in, section_vals_out, i_rep_start, i_rep_end)
creates a deep copy from section_vals_in to section_vals_out
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
The environment for the empirical interatomic potential methods.
Methods and functions on the i–PI environment.
subroutine, public ipi_init(ipi_env, root_section, para_env, force_env_section, subsys_section)
Initialize the ipi environment.
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
integer, parameter, public default_path_length
Definition kinds.F:58
Machine interface based on Fortran 2003 and POSIX.
Definition machine.F:17
integer, parameter, public default_output_unit
Definition machine.F:46
subroutine, public m_memory(mem)
Returns the total amount of memory [bytes] in use, if known, zero otherwise.
Definition machine.F:440
subroutine, public m_getcwd(curdir)
...
Definition machine.F:607
subroutine, public m_chdir(dir, ierror)
...
Definition machine.F:636
Interface to the message passing library MPI.
subroutine, public mp_world_init(mp_comm)
initializes the system default communicator
type(mp_comm_type), parameter, public mp_comm_world
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)
subroutine, public mp_world_finalize()
finalizes the system default communicator
defines types for metadynamics calculation
Performs the metadynamics calculation.
subroutine, public metadyn_read(meta_env, force_env, root_section, para_env, fe_section)
reads metadynamics section
perform biased molecular dynamics (H= k H1 + (1-k) H2 [linear or general mixing)
Definition mixed_main.F:12
subroutine, public mixed_create_force_env(mixed_env, root_section, para_env, force_env_section, n_subforce_eval, use_motion_section)
Controls program flow for mixed calculations.
Definition mixed_main.F:52
Defines all routines to deal with the performance of MPI routines.
Definition mp_perf_env.F:11
subroutine, public mp_perf_env_release(perf_env)
...
subroutine, public rm_mp_perf_env()
...
type(mp_perf_env_type) function, pointer, public get_mp_perf_env()
...
elemental subroutine, public mp_perf_env_retain(perf_env)
...
subroutine, public add_mp_perf_env(perf_env)
start and stop the performance indicators for every call to start there has to be (exactly) one call ...
Definition mp_perf_env.F:76
Data types for neural network potentials.
Methods dealing with Neural Network potentials.
subroutine, public nnp_init(nnp_env, root_section, para_env, force_env_section, subsys_section, use_motion_section)
Read and initialize all the information for neural network potentials.
Fortran API for the offload package, which is written in C.
Definition offload_api.F:12
subroutine, public offload_set_chosen_device(device_id)
Selects the chosen device to be used.
integer function, public offload_get_device_count()
Returns the number of available devices.
subroutine, public offload_init()
Initialize runtime.
Definition offload_api.F:93
Periodic Table related data definitions.
subroutine, public init_periodic_table()
Initialization of Periodic Table related data.
subroutine, public pw_fpga_finalize()
Releases resources on the fpga device.
Definition pw_fpga.F:135
subroutine, public pw_fpga_init()
Allocates resources on the fpga device.
Definition pw_fpga.F:112
subroutine, public pw_gpu_init()
Allocates resources on the gpu device for gpu fft acceleration.
Definition pw_gpu.F:62
subroutine, public pw_gpu_finalize()
Releases resources on the gpu device for gpu fft acceleration.
Definition pw_gpu.F:81
The type definitions for the PWDFT environment.
subroutine, public pwdft_env_create(pwdft_env)
Creates the pwdft environment.
Methods and functions on the PWDFT environment.
subroutine, public pwdft_init(pwdft_env, root_section, para_env, force_env_section, subsys_section, use_motion_section)
Initialize the pwdft environment.
Initialize a QM/MM calculation.
Definition qmmm_create.F:14
subroutine, public qmmm_env_create(qmmm_env, root_section, para_env, globenv, force_env_section, qmmm_section, subsys_section, use_motion_section, prev_subsys, ignore_outside_box)
...
Basic container type for QM/MM.
Definition qmmm_types.F:12
Initialize a QM/MM calculation with Force-Mixing.
subroutine, public qmmmx_env_create(qmmmx_env, root_section, para_env, globenv, force_env_section, subsys_section, use_motion_section)
...
Basic container type for QM/MM with force mixing.
Definition qmmmx_types.F:12
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, 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.
subroutine, public qs_env_create(qs_env, globenv)
allocates and intitializes a qs_env
subroutine, public qs_init(qs_env, para_env, root_section, globenv, cp_subsys, kpoint_env, qmmm, qmmm_env_qm, force_env_section, subsys_section, use_motion_section, silent, multip, charge)
Read the input and the database files for the setup of the QUICKSTEP environment.
provides a uniform framework to add references to CP2K cite and output these
subroutine, public remove_all_references()
deallocate the bibliography
Interface to the SIRIUS Library.
subroutine, public cp_sirius_init()
Empty implementation in case SIRIUS is not compiled in.
logical function, public cp_sirius_is_initialized()
Return always .FALSE. because the Sirius library is not compiled in.
subroutine, public cp_sirius_finalize()
Empty implementation in case SIRIUS is not compiled in.
generates a unique id number for a string (str2id) that can be used two compare two strings....
subroutine, public string_table_deallocate(iw)
deallocates the string table
subroutine, public string_table_allocate()
allocates the string table
Types used by timings.F and timings_report.F Due to the fortran restriction on cicular module-depende...
Timing routines for accounting.
Definition timings.F:17
subroutine, public timings_register_hooks()
Registers handlers with base_hooks.F.
Definition timings.F:79
type(timer_env_type) function, pointer, public get_timer_env()
returns the current timer env from the stack
Definition timings.F:147
subroutine, public add_timer_env(timer_env)
adds the given timer_env to the top of the stack
Definition timings.F:93
subroutine, public rm_timer_env()
removes the current timer env from the stack
Definition timings.F:134
subroutine, public timer_env_release(timer_env)
releases the given timer env
Definition timings.F:173
subroutine, public timer_env_retain(timer_env)
retains the given timer env
Definition timings.F:158
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...
contains arbitrary information which need to be stored
represents a system: atoms, molecules, their pos,vel,...
The empirical interatomic potential environment.
Embedding environment type.
wrapper to abstract the force evaluation of the various methods
contains the initially parsed file and the initial parallel environment
represent a keyword in the input
represent a section of the input file
stores all the informations relevant to an mpi environment
Main data type collecting all relevant data for neural network potentials.