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