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