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