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