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