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